Dalam artikel ini saya akan berbicara tentang satu formula yang tidak biasa yang memungkinkan Anda untuk melihat sudut baru pada transformasi affine, dan terutama pada masalah terbalik yang muncul sehubungan dengan transformasi ini. Saya akan menyebut masalah invers yang membutuhkan komputasi matriks invers: menemukan transformasi berdasarkan poin, menyelesaikan sistem persamaan linear, mengubah koordinat ketika mengubah basis, dll. Saya harus segera memesan bahwa tidak akan ada penemuan mendasar dalam artikel ini, atau pengurangan kompleksitas algoritmik - Saya hanya akan menunjukkan formula simetris dan mudah diingat yang dengannya Anda dapat memecahkan banyak masalah yang sedang berjalan tanpa terduga. Untuk pecinta ketelitian matematika, ada presentasi yang lebih formal di sini
[1] (berorientasi pada siswa) dan buku masalah kecil di sini
[2] .
Transformasi affine biasanya didefinisikan oleh matriks
A dan vektor terjemahan

dan bertindak berdasarkan argumen vektor dengan rumus
mathcalA( vecx)= hatA vecx+ vect.
Namun, Anda bisa melakukannya tanpa
vect jika Anda menggunakan matriks augmented dan koordinat yang seragam untuk argumen (seperti yang diketahui oleh pengguna OpenGL). Namun, ternyata, selain bentuk tulisan ini, Anda juga dapat menggunakan determinan matriks khusus, yang berisi koordinat argumen dan parameter yang menentukan transformasi. Faktanya adalah bahwa determinan memiliki properti linearitas atas elemen-elemen dari setiap baris atau kolom, dan ini memungkinkannya untuk digunakan untuk mewakili transformasi affine. Di sini, sebenarnya, bagaimana mengekspresikan aksi transformasi affine pada vektor arbitrer
vecx :
Jangan terburu-buru melarikan diri dengan ngeri - pertama, transformasi ditulis di sini yang bekerja pada ruang dimensi sewenang-wenang (ada begitu banyak hal dari sini), dan kedua, meskipun rumusnya terlihat rumit, ia hanya diingat dan digunakan. Untuk memulai, saya akan menyoroti elemen yang berhubungan secara logis dengan bingkai dan warna
Jadi kita melihat aksi transformasi affine apa pun
mathcalA per vektor dapat direpresentasikan sebagai rasio dari dua penentu, dengan argumen vektor hanya memasukkan bagian atas, dan bagian bawah hanya konstan, tergantung hanya pada parameter.
Vektor yang disorot biru
vecx Merupakan argumen, vektor tempat tindakan transformasi affine
mathcalA . Selanjutnya, subskrip menunjukkan komponen vektor. Dalam matriks bagian atas komponen
vecx menempati hampir seluruh kolom pertama, kecuali mereka di kolom ini hanya nol (atas) dan satu (bawah). Semua elemen lain dalam matriks adalah vektor parameter (mereka diberi nomor oleh superscript, diambil dalam tanda kurung agar tidak membingungkan dengan derajat) dan unit di baris terakhir. Di antara set semua transformasi affine, parameter membedakan apa yang kita butuhkan. Kemudahan dan keindahan formula adalah bahwa arti dari parameter ini sangat sederhana: mereka mendefinisikan transformasi affine yang menerjemahkan vektor
vecx(i) masuk
vecX(i) . Oleh karena itu vektor
vecx(1), dots, vecx(n+1) , kita akan memanggil "input" (mereka dikelilingi oleh empat persegi panjang dalam matriks) - masing-masing ditulis berdasarkan komponen dalam kolomnya sendiri, sebuah unit ditambahkan di bawah ini. Parameter "Output" ditulis dari atas (disorot dengan warna merah)
vecX(1), dots, vecX(n+1) , tapi sekarang bukan secara komponen, tetapi sebagai satu kesatuan.
Jika seseorang terkejut dengan catatan seperti itu, maka ingatlah
produk vektor$$ menampilkan $$ [\ vec {a} \ kali \ vec {b}] = \ det \ begin {pmatrix} \ vec {e} _1 & \ vec {e} _2 & \ vec {e} _3 \\ a_1 & a_2 & a_3 \\ b_1 & b_2 & b_3 \\ \ end {pmatrix}, $$ menampilkan $$
di mana ada struktur yang sangat mirip dan baris pertama dengan cara yang sama ditempati oleh vektor. Selain itu, dimensi vektor tidak perlu
vecX(i) dan
vecx(i) bertepatan. Semua penentu dianggap seperti biasa dan memungkinkan "trik" seperti biasa, misalnya, Anda dapat menambahkan kolom lain ke kolom apa pun.
Dengan matriks bawah, semuanya sangat sederhana - ini diperoleh dari atas dengan menghapus baris pertama dan kolom pertama. Kelemahan dari
(1) adalah Anda harus mengambil determinan, namun, jika Anda mentransfer tugas rutin ini ke komputer, ternyata orang tersebut hanya perlu mengisi matriks dengan benar dengan angka dari tugasnya. Pada saat yang sama, menggunakan satu rumus, Anda dapat memecahkan beberapa masalah praktik umum:
Transformasi affine tiga titik di pesawat
Di bawah pengaruh transformasi affine yang tidak diketahui, tiga titik di pesawat melewati tiga titik lainnya. Temukan transformasi affine ini.

Untuk jelasnya, biarkan titik masuk kami
dan hasil transformasi
Temukan transformasi affine
mathcalA .
Sebenarnya, masalah ini dapat dipecahkan dengan cara yang berbeda: menggunakan sistem persamaan linear, koordinat barycentric ... tetapi kita akan pergi dengan cara kita sendiri. Saya pikir dengan notasi yang digunakan, Anda dapat menebak apa yang saya maksudkan: kita mengambil persamaan
(1) untuk dimensi
n=2 dan gantikan
vecx(i) sebagai parameter input, dan
vecX(i) - sebagai akhir pekan
dan kemudian hanya tinggal menghitung faktor penentu
Mata yang terlatih akan dengan mudah mendeteksi pembalikan arah
30 circ dan disiarkan
((3+ sqrt3)/2,2) mathsfT .
Kapan formula ini berlaku?
Vektor input dan output dapat memiliki dimensi yang berbeda - rumus ini berlaku untuk transformasi affine yang bekerja pada ruang dimensi apa pun. Namun, harus ada titik input yang cukup dan mereka tidak boleh "bersatu": jika transformasi affine bertindak dari
n ruang -dimensi - titik harus membentuk simpleks non-merosot dari
n+1 poin. Jika kondisi ini tidak terpenuhi, maka mustahil untuk mengembalikan transformasi yang jelas (dengan metode apa pun, tidak hanya ini) - rumus akan memperingatkan tentang ini dengan nol dalam penyebut.
Mengapa mengembalikan affine transform ke programmer?
Seringkali Anda perlu menemukan transformasi antara dua gambar (untuk menghitung posisi kamera, misalnya). Jika kami memiliki beberapa poin khusus (fitur) yang dapat diandalkan dalam gambar-gambar ini, atau hanya merasa tidak ingin langsung mulai dengan ranzaks dan berkelahi dengan outlay, maka rumus ini dapat digunakan.
Contoh lain adalah
texturing . Memotong segitiga dari tekstur dan menariknya ke segitiga di suatu tempat di pesawat atau di ruang adalah tugas khas untuk menerapkan transformasi affine ke titik-titik dari ruang tekstur, menerjemahkannya ke dalam ruang di mana model tinggal. Dan seringkali mudah bagi kita untuk menunjukkan titik mana pada tekstur yang sesuai dengan simpul segitiga model, tetapi untuk menentukan kemana titik-titik non-sudut mungkin memerlukan beberapa pemikiran. Dengan formula yang sama, cukup dengan memasukkan angka ke dalam sel yang benar dan akan ada keindahan seperti itu.
Dari apa yang harus saya hadapi secara pribadi: jaringan saraf memberikan koordinat sudut penanda dan kami ingin "melengkapi kenyataan" dengan objek virtual yang terletak di penanda.
Jelas, ketika menggerakkan penanda, objek harus mengulangi semua gerakannya. Dan di sini rumus
(1) sangat berguna - ini akan membantu kita memindahkan objek setelah marker.
Atau contoh lain: Anda perlu memprogram rotasi berbagai objek di atas panggung menggunakan alat gizmo. Untuk melakukan ini, kita harus dapat memutar model yang dipilih di sekitar tiga sumbu sejajar dengan sumbu koordinat dan melewati pusat objek. Gambar menunjukkan kasus rotasi model di sekitar sumbu sejajar
Oz .
Pada akhirnya, semuanya bermuara pada masalah dua dimensi rotasi di sekitar titik arbitrer. Mari kita selesaikan saja untuk beberapa kasus sederhana, katakanlah, hidupkan
90 circ berlawanan arah jarum jam
(a;b) (kasus umum diselesaikan dengan cara yang sama, saya hanya tidak ingin mengacaukan perhitungan dengan sinus dan cosinus). Tentu saja, Anda dapat menggunakan cara samurai dan mengalikan tiga matriks (terjemahan dari titik rotasi ke nol, sebenarnya rotasi dan terjemahan kembali), atau Anda dapat menemukan koordinat dari tiga titik sebelum dan sesudah rotasi dan menggunakan rumus. Poin pertama mudah - kita sudah tahu itu
(a;b) masuk sendiri. Mari kita lihat poin satu ke kanan, karena itu benar
(a+1;b) mapuntuk(a;b+1) . Nah, dan satu lagi di bawah ini, jelas sekali
(a;b−1) mapuntuk(a+1;b) . Maka semuanya sederhana
Koordinat Barycentric
Kami menguraikan penentu atas
(1) di sepanjang baris pertama sesuai dengan aturan Laplace. Jelaslah bahwa sebagai hasilnya kita mendapatkan sejumlah vektor tertimbang
vecX(i) . Ternyata koefisien dalam jumlah ini adalah
koordinat barycentric argumen
vecx sehubungan dengan simpleks yang diberikan
vecx(i) (untuk bukti lihat
[1] ). Jika kita hanya tertarik pada koordinat barycentric suatu titik, kita dapat menipu dan mengisi baris pertama dengan unit ort - setelah menghitung determinan kita mendapatkan vektor yang komponennya bertepatan dengan koordinat barycentric
vecx . Secara grafis, konversi seperti itu
mathcalB menerjemahkan suatu titik ke dalam ruang koordinat barycentric akan terlihat sebagai berikut
Mari kita coba "resep" ini dalam praktik. Tugas: cari koordinat barycentric dari suatu titik sehubungan dengan segitiga yang diberikan. Biarkan itu menjadi poin untuk kepastian
(2,2) mathsfT , dan ambil simpul dari segitiga
Intinya kecil - ambil
(1) untuk
n=2 , letakkan data tugas dengan benar di sana dan hitung faktor penentu
Inilah solusinya: koordinat barycentric
(2,2) mathsfT sehubungan dengan segitiga yang diberikan ada
0,6 ,
0,3 dan
0,1 . Dalam pemrograman, perhitungan koordinat barycentric sering muncul dalam konteks memeriksa apakah suatu titik berada di dalam simpleks (maka semua koordinat barycentric lebih dari nol dan kurang dari satu), serta untuk berbagai interpolasi, yang akan kita bahas sekarang.
Perhatikan bahwa rumus
(1) memiliki dualitas yang menyenangkan: jika kita memperluas determinan di kolom pertama, kita mendapatkan notasi standar untuk fungsi afin, dan jika pada baris pertama kita mendapatkan kombinasi afin vektor keluaran.
Interpolasi multilinear
Jadi, kami menemukan bahwa transformasi affine menimbang vektor keluaran dengan koefisien yang sama dengan koordinat barycentric argumen. Wajar untuk menggunakan properti ini untuk interpolasi multilinear.
Interpolasi warna
Sebagai contoh, mari kita hitung GL standar - "halo dunia" - segitiga berwarna. Tentu saja, OpenGL sangat tahu bagaimana cara menginterpolasi warna dan
juga melakukan ini menggunakan koordinat barycentric , tapi hari ini kita akan melakukannya sendiri.
Tugas: pada simpul segitiga warna diatur, untuk menginterpolasi warna di dalam segitiga. Untuk kepastian, biarkan simpul segitiga kami memiliki koordinat
Kami memberikan mereka warna: kuning, cyan dan magenta
Angka tiga kali lipat adalah komponen RGB warna. Ambil
(1) dan atur input data dengan benar
Berikut adalah komponen-komponennya
mathcalC(x;y) menunjukkan cara melukis suatu titik
(x,y) dalam hal RGB. Mari kita lihat apa yang terjadi.
Kita dapat mengatakan bahwa kita baru saja membuat transformasi affine dari ruang dua dimensi gambar menjadi ruang tiga dimensi warna (RGB).
Interpolasi normal (Phong shading)
Kita dapat meletakkan berbagai makna dalam vektor yang kita interpolasi, termasuk yang bisa menjadi vektor normal. Selain itu, inilah yang dilakukan oleh Phong shading, hanya setelah interpolasi vektor perlu dinormalisasi. Mengapa interpolasi semacam itu diperlukan diilustrasikan dengan baik oleh gambar berikut (diambil dari Wikipedia
commons.wikimedia.org/w/index.php?curid=1556366 ).
Saya rasa tidak ada gunanya membuat perhitungan lagi - semua detail dibahas dalam
[2] , tetapi saya akan menunjukkan gambar dengan hasilnya.
Vektor di atasnya tidak tunggal, dan untuk digunakan dalam naungan Phong, mereka harus terlebih dahulu dinormalisasi, dan, untuk kejelasan, mereka diarahkan ke arah yang sangat berbeda, yang jarang terjadi dalam praktiknya.
Temukan pesawat z=z(x,y) di tiga titik
Pertimbangkan contoh lain yang tidak biasa dari penerapan transformasi affine.
Tiga poin diberikan
Kami menemukan persamaan pesawat melewati mereka dalam bentuk
z=z(x,y) . Dan kami akan melakukan ini dengan bantuan transformasi affine: diketahui bahwa mereka menerjemahkan pesawat di pesawat. Untuk memulai, kami merancang semua titik di pesawat
Xy itu mudah. Dan sekarang kita akan membangun transformasi affine yang menerjemahkan proyeksi titik ke titik tiga dimensi asli
dan yang "mengambil" bersama dengan poin dan seluruh pesawat
Xy sedemikian rupa sehingga setelah transformasi itu akan melalui poin yang menarik bagi kita.
Seperti biasa, kita hanya perlu mendistribusikan angka di antara elemen-elemen matriks
Tulis ulang ekspresi terakhir dalam bentuk yang biasa
dan menggambar apa yang terjadi.
Transformasi linier
Terlepas dari pentingnya transformasi affine secara praktis, kita sering harus berurusan dengan transformasi linear. Tentu saja, transformasi linier adalah kasus khusus transformasi affine, meninggalkan titik di tempatnya
vec0 . Ini memungkinkan kami untuk menyederhanakan rumus sedikit (setelah semua, salah satu kolom akan terdiri dari hampir hanya nol dan Anda dapat memperluas determinan dengan itu)
Seperti yang Anda lihat, baris terakhir dengan unit dan satu kolom tidak ada dari rumus. Hasil ini sepenuhnya konsisten dengan ide-ide kami yang menentukan transformasi linear, itu cukup untuk menunjukkan efeknya pada
n elemen yang bebas linear.
Transformasi linear tiga titik
Mari kita selesaikan masalahnya untuk melihat bagaimana semuanya bekerja. Masalah: diketahui bahwa di bawah aksi beberapa transformasi linear
Kami menemukan transformasi linear ini.
Kami mengambil formula yang disederhanakan dan menempatkan angka yang benar di tempat yang tepat:
Selesai!
Menemukan transformasi terbalik
Ingatlah bahwa matriks transformasi linear
berisi gambar vektor satuan dalam kolomnya:
Jadi, bertindak sebagai matriks pada vektor satuan, kita mendapatkan kolomnya. Dan bagaimana dengan transformasi terbalik (katakanlah itu ada)? Ia melakukan segalanya “sebaliknya”:
Tunggu sebentar, karena kami baru saja menemukan gambar tiga titik di bawah pengaruh transformasi linier - cukup untuk mengembalikan transformasi itu sendiri!
dimana
vece1=(1;0;0) mathsfT ,
vece2=(0;1;0) mathsfT dan
vece3=(0;0;1) mathsfT .
Kami tidak akan membatasi diri pada ruang tiga dimensi dan menulis ulang rumus sebelumnya dalam bentuk yang lebih umum
Seperti yang Anda lihat, kita perlu menetapkan matriks di sebelah kiri kolom dengan komponen argumen vektor, di atas - garis dengan vektor koordinat, dan kemudian hanya kemampuan untuk mengambil determinan.
Masalah Transformasi Terbalik
Mari kita coba metode yang diberikan dalam praktik. Tugas: membalikkan matriks
Kami menggunakan
(2) untuk
n=3Segera jelas itu
Aturan Cramer dalam satu rumus
Sejak sekolah, kita dihadapkan dengan persamaan bentuk
Jika matriks
hatA non-degenerate, maka solusinya dapat ditulis sebagai
Hmm ... bukankah di bagian sebelumnya saya melihat ekspresi yang sama, tetapi sebaliknya
b ada surat lagi? Kami akan menggunakannya.
Ini tidak lain
adalah aturan Cramer . Ini dapat dengan mudah diverifikasi dengan memperluas determinan pada baris pertama: perhitungan
xi anggap saja kita mencoret kolom dengan
vecei dan dengan itu
i Kolom matriks
hatA . Sekarang jika Anda mengatur ulang kolom
b bukannya yang jauh, maka kita hanya mendapatkan aturan "masukkan kolom
b di tempat
i Kolom Th dan temukan determinannya. " Dan ya, dengan tanda-tandanya, semuanya baik-baik saja: sendirian
pm kami menghasilkan ketika memperluas sepanjang garis, sementara yang lain ketika mengatur ulang - sebagai hasilnya, mereka membatalkan satu sama lain.
Melihat persamaan yang dihasilkan, Anda dapat melihat kesamaannya dengan persamaan untuk menemukan koordinat barycentric: solusi sistem persamaan linear adalah menemukan koordinat barycentric suatu titik
vecb dalam kaitannya dengan simpleks, salah satu simpulnya
vec0 , dan sisanya ditentukan oleh kolom dari matriks
hatA .
Solusi dari sistem persamaan linear
Kami memecahkan sistem persamaan linear
Dalam bentuk matriks, terlihat seperti ini
Kami menggunakan rumus yang dihasilkan
dari mana jawabannya berasal
x=1/25 ,
y=14/25 dan
z=2/5 .
Transformasi koordinat vektor ketika mengubah basis
Misalkan kita telah memilih basis baru (kita beralih ke sistem koordinat yang berbeda). Diketahui bahwa koordinat vektor yang baru diekspresikan melalui linear yang lama. Karena itu, tidak mengherankan bahwa kita dapat menggunakan alat kita untuk mengubah basisnya. Bagaimana melakukan ini, saya akan tunjukkan dengan sebuah contoh.
Jadi, mari kita beralih dari basis standar
\ {\ vec {e} _x, \ vec {e} _y \} ke dasar yang terdiri dari vektor
Dalam basis yang lama, vektor ditentukan
vecx=(3,4) mathsfT . Temukan koordinat vektor ini secara baru. Dalam sistem koordinat baru, vektor basis baru akan menjadi ort dan akan memiliki koordinat
selanjutnya, sapuan di dekat kolom berarti bahwa koordinat di dalamnya merujuk pada basis baru. Mudah ditebak bahwa transformasi linear yang diterjemahkan
juga mengonversi koordinat vektor kami sesuai kebutuhan. Tinggal menerapkan formula saja
Solusi dari masalah dengan cara biasa membutuhkan inversi matriks (yang, bagaimanapun, juga terutama terdiri dari menghitung faktor penentu) dan multiplikasi
Kami hanya mengemas langkah-langkah ini ke dalam satu formula.
Mengapa rumus berfungsi untuk masalah terbalik?
Efektivitas formula dalam memecahkan masalah terbalik dijelaskan oleh kesetaraan berikut (buktinya ada pada
[1] )
Jadi, rumus itu sendiri menyembunyikan matriks invers dan perkalian dengan matriks lain. Ungkapan ini adalah solusi standar untuk masalah menemukan transformasi linear oleh poin. Perhatikan bahwa dengan membuat matriks kedua dalam identitas produk, kami hanya mendapatkan matriks terbalik. Dengan bantuannya, sistem persamaan linear dan masalah yang dapat direduksi menjadi diselesaikan: menemukan koordinat barycentric, interpolasi oleh polinomial Lagrange, dll. Namun, representasi dalam bentuk produk dari dua matriks tidak memungkinkan kita untuk mendapatkan "dua pandangan" yang terkait dengan ekspansi pada baris pertama dan pada kolom pertama.
Interpolasi lagrange dan propertinya
Biarkan saya mengingatkan Anda bahwa
interpolasi Lagrange adalah menemukan titik polinomial yang melewati titik paling sedikit
(a0;b0) ,
(a1;b1) ,
dots ,
(an;bn) . Bukan berarti itu adalah tugas umum dalam praktik programmer, tapi mari kita lihat saja.
Bagaimana polinomial dan transformasi linear terkait?
Faktanya adalah bahwa jumlahnya banyak
dapat dianggap sebagai transformasi linear yang menampilkan vektor
(xn;xn−1; dots;1)T masuk
mathbbR . Jadi intinya masalah interpolasi
(a0;b0) ,
(a1;b1) ,
dots ,
(an;bn) mengurangi menemukan transformasi linear seperti itu
dan kami dapat melakukan ini. Ganti huruf yang benar di sel yang benar dan dapatkan formula
Bukti bahwa ini akan menjadi polinomial Lagrange (dan bukan orang lain) dapat ditemukan di
[1] . Omong-omong, ekspresi dalam penyebut adalah pengidentifikasi Vandermonde. Mengetahui hal ini dan memperluas determinan dalam pembilang di sepanjang baris pertama, kita sampai pada formula yang lebih akrab untuk polinomial Lagrange.
Masalah pada polinomial Lagrange
Apakah sulit digunakan? Mari kita coba kekuatan pada masalah: temukan polinomial Lagrange melewati titik
(−1;2) ,
(3;4) dan
(2;7) .
Gantikan poin-poin ini dalam rumus
Pada grafik, semuanya akan terlihat seperti ini.
Properti dari polinomial Lagrange
Setelah meletakkan penentu atas di baris pertama dan kolom pertama, kita melihat polinomial Lagrange dari dua sisi yang berbeda. Dalam kasus pertama, kita mendapatkan rumus klasik dari Wikipedia, dan yang kedua, kita menulis polinomial dalam bentuk jumlah monomial
alphaixi dimana
Dan sekarang kita dapat dengan relatif mudah membuktikan pernyataan yang agak rumit. Misalnya, dalam
[2] dibuktikan dalam satu baris bahwa jumlah polinomial Lagrange dasar sama dengan satu dan bahwa interpolasi polinomial Lagrange
(a0;an+10) ,
dots ,
(an;an+1n) memiliki nilai nol
(−1)na0 cdot cdots cdotan . Yah, bukan Lagrange tunggal - pendekatan yang serupa dapat diterapkan untuk interpolasi oleh sinus-cosinus atau fungsi lainnya.
Kesimpulan
Terima kasih kepada semua orang yang membaca sampai akhir. Pada artikel ini, kami memecahkan masalah standar menggunakan satu formula non-standar. Saya menyukainya karena, pertama, ini menunjukkan bahwa transformasi affine (linear), koordinat barycentric, interpolasi, dan bahkan polinomial Lagrange sangat erat kaitannya. Lagi pula, ketika solusi untuk masalah ditulis dengan cara yang sama, pemikiran afinitas mereka muncul dengan sendirinya. Kedua, sebagian besar waktu kami hanya mengatur data input dalam sel yang benar tanpa transformasi tambahan.
Tugas-tugas yang kita anggap juga dapat diselesaikan dengan metode yang cukup akrab. Namun, untuk masalah dimensi kecil atau tugas pendidikan, formula ini mungkin berguna. Selain itu, dia tampak cantik bagiku.
Referensi
[
1]
Panduan pemula untuk memetakan simpleks dengan benar[
2]
Buku kerja tentang pemetaan simpleks dengan benar