Catatan
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba masuk atau mengubah direktori.
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba mengubah direktori.
Topik ini memberikan gambaran umum matematika tentang transformasi matriks untuk grafik 2-D. Namun, Anda tidak perlu mengetahui matematika matriks untuk menggunakan transformasi di Direct2D. Baca topik ini jika Anda tertarik dengan matematika; jika tidak, jangan ragu untuk melewati topik ini.
- Pengenalan Matriks
- Transformasi Affine
- Mewakili Transformasi dalam Direct2D
- Berikutnya
Pengantar Matriks
Matriks adalah array persegi panjang dari bilangan riil. urutan matriks adalah jumlah baris dan kolom. Misalnya, jika matriks memiliki 3 baris dan 2 kolom, urutannya adalah 3 × 2. Matriks biasanya ditampilkan dengan elemen matriks yang diapit dalam tanda kurung siku:
Notasi: Matriks ditunjuk oleh huruf kapital. Elemen ditunjuk oleh huruf kecil. Subskrip menunjukkan nomor baris dan kolom elemen. Misalnya,ij adalah elemen pada baris i'th dan kolom j'th dari matriks A.
Diagram berikut menunjukkan i × j matrix, dengan elemen individual di setiap sel matriks.
Operasi Matriks
Bagian ini menjelaskan operasi dasar yang ditentukan pada matriks.
Penambahan. Jumlah A + B dari dua matriks diperoleh dengan menambahkan elemen A dan B yang sesuai:
- A + B = \[ a*ij* \] + \[ b*ij* \] = \[ a*ij* + b*ij* \]
perkalian skalar . Operasi ini mengalikan matriks dengan angka riil. Mengingat angka riil k, kA produk skalar diperoleh dengan mengalikan setiap elemen A dengan k.
- kA = k\[ a*ij* \] = \[ k × a*ij* \]
perkalian Matriks . Mengingat dua matriks A dan B dengan pesanan (m × n) dan (n × p), produk C = A × B adalah matriks dengan pesanan (m × p), didefinisikan sebagai berikut:
atau, secara setara:
- c*ij* = a*i*1 x b1*j* + a*i*2 x b2*j* + ... + a*in* + b*nj*
Artinya, untuk menghitung setiap elemen cij, lakukan hal berikut:
- Ambil baris i'th dari A dan kolom j'th B.
- Kalikan setiap pasangan elemen dalam baris dan kolom: entri baris pertama dengan entri kolom pertama, entri baris kedua dengan entri kolom kedua, dan sebagainya.
- Jumlahkan hasilnya.
Berikut adalah contoh mengalikan matriks (2 × 2) dengan matriks (2 × 3).
Perkalian matriks tidak komutatif. Artinya, A × B ≠ B × A. Selain itu, dari definisi itu mengikuti bahwa tidak setiap pasangan matriks dapat dikalikan. Jumlah kolom dalam matriks sebelah kiri harus sama dengan jumlah baris dalam matriks sebelah kanan. Jika tidak, operator × tidak ditentukan.
Identifikasimatriks . Matriks identitas, yang ditunjuk I, adalah matriks persegi yang didefinisikan sebagai berikut:
- I*ij* = 1 jika *i* = *j*, atau 0 sebaliknya.
Dengan kata lain, matriks identitas berisi 1 untuk setiap elemen di mana nomor baris sama dengan nomor kolom, dan nol untuk semua elemen lainnya. Misalnya, berikut adalah matriks identitas 3 × 3.
Persamaan berikut berlaku untuk matriks M apa pun.
- M x I = M I x M = M
Transformasi Affine
Transformasi affine adalah operasi matematika yang memetakan satu ruang koordinat ke ruang koordinat lainnya. Dengan kata lain, ini memetakan satu set titik ke set titik lain. Transformasi affine memiliki beberapa fitur yang membuatnya berguna dalam grafik komputer.
- Transformasi affine mempertahankan kerah. Jika tiga titik atau lebih jatuh pada garis, mereka masih membentuk garis setelah transformasi. Garis lurus tetap lurus.
- Komposisi dua transformasi affine adalah transformasi affine.
Transformasi affine untuk ruang 2-D memiliki formulir berikut.
Jika Anda menerapkan definisi perkalian matriks yang diberikan sebelumnya, Anda dapat menunjukkan bahwa produk dari dua transformasi afin adalah transformasi affine lainnya. Untuk mengubah titik 2D menggunakan transformasi affine, titik diwakili sebagai matriks 1 × 3.
- P = \| x y 1 \|
Dua elemen pertama berisi koordinat x dan y dari titik tersebut. 1 ditempatkan di elemen ketiga untuk membuat matematika bekerja dengan benar. Untuk menerapkan transformasi, kalikan dua matriks sebagai berikut.
- P' = P × M
Ini meluas ke yang berikut ini.
mana
- x' = ax + cy + e y' = bx + dy + f
Untuk mendapatkan titik yang diubah, ambil dua elemen pertama dari matriks P'.
- p = (x', y') = (ax + cy + e, bx + dy + f)
Nota
Matriks 1 × n disebut vektor baris . Direct2D dan Direct3D keduanya menggunakan vektor baris untuk mewakili titik dalam ruang 2D atau 3D. Anda bisa mendapatkan hasil yang setara dengan menggunakan vektor kolom (n × 1) dan mengubah urutan matriks transformasi. Sebagian besar teks grafik menggunakan formulir vektor kolom. Topik ini menyajikan formulir vektor baris untuk konsistensi dengan Direct2D dan Direct3D.
Beberapa bagian berikutnya memperoleh transformasi dasar.
Transformasi Terjemahan
Matriks transformasi terjemahan memiliki formulir berikut.
Menyambungkan titik P ke dalam hasil persamaan ini:
- P' = (*x* + *dx*, *y* + *dy*)
yang sesuai dengan titik (x, y) yang diterjemahkan oleh dx di sumbu X dan dy di sumbu Y.
Transformasi Penskalakan
Matriks transformasi penskalakan memiliki formulir berikut.
Menyambungkan titik P ke dalam hasil persamaan ini:
- P' = (*x* ∙ *dx*, *y* ∙ *dy*)
yang sesuai dengan titik (x,y) yang diskalakan oleh dx dan dy.
Rotasi Di Sekitar Asal
Matriks untuk memutar titik di sekitar asal memiliki formulir berikut.
Titik yang diubah adalah:
- P' = (*x*cosΘ – ysinΘ, *x*sinΘ + *y*cosΘ)
Bukti. Untuk memperlihatkan bahwa P' mewakili rotasi, pertimbangkan diagram berikut.
Diberikan:
-
P = (x,y)
-
Titik asli untuk diubah.
-
Φ
-
Sudut yang dibentuk oleh garis (0,0) ke P.
-
Θ
-
Sudut untuk memutar (x,y) tentang asal.
-
P' = (x',y')
-
Titik yang diubah.
-
R
-
Panjang garis (0,0) ke P. Juga radius lingkaran rotasi.
Nota
Diagram ini menggunakan sistem koordinat standar yang digunakan dalam geometri, di mana sumbu y positif menunjuk ke atas. Direct2D menggunakan sistem koordinat Windows, di mana sumbu y positif menunjuk ke bawah.
Sudut antara sumbu x dan garis (0,0) ke P' adalah Φ + Θ. Penahanan identitas berikut:
- x = R cosΦ y = R sinΦ x' = R cos(Φ + Θ) y' = R sin(Φ+ Θ)
Sekarang memecahkan untuk x' dan y ' dalam hal Θ. Menurut rumus penambahan trigonomik:
- x' = R(cosΦcosΘ – sinΦsinΘ) = RcosΦcosΘ – RsinΦsinΘ y' = R(sinΦcosΘ + cosΦsinΘ) = RsinΦcosΘ + RcosΦsinΘ
Mengganti, kita mendapatkan:
- x' = xcosΘ – ysinΘ y' = xsinΘ + ycosΘ
yang sesuai dengan titik yang diubah P' yang ditunjukkan sebelumnya.
Rotasi Di Sekitar Titik Arbitrer
Untuk memutar titik (x,y) selain asal, matriks berikut digunakan.
Anda dapat memperoleh matriks ini dengan mengambil titik (x,y) menjadi asal.
Biarkan (x1, y1) menjadi titik yang dihasilkan dari memutar titik (x0, y0) di sekitar titik (x,y). Kita bisa mendapatkan x1 sebagai berikut.
- x1 = (x0 – x)cosΘ– (y0 – y)sinΘ + x x1 = x0cosΘ – y0sinΘ + \[ (1 – cosΘ) + ysinΘ \]
Sekarang colokkan kembali persamaan ini ke dalam matriks transformasi, menggunakan rumus x1 = ax0 + cy0 + e dari sebelumnya. Gunakan prosedur yang sama untuk mendapatkan y1.
Transformasi Condong
Transformasi condong didefinisikan oleh empat parameter:
- Θ: Jumlah condong di sepanjang sumbu x, diukur sebagai sudut dari sumbu y.
- Φ: Jumlah condong di sepanjang sumbu y, diukur sebagai sudut dari sumbu x.
- (px, py): Koordinat x- dan y dari titik tempat kecondongan dilakukan.
Transformasi condong menggunakan matriks berikut.
Titik yang diubah adalah:
- P' = (*x* + *y*tanΘ – *py*tanΘ, *y* + *x*tanΦ) – *py*tanΦ
atau setara:
- P' = (*x* + (*y* – *py*)tanΘ, *y* + (*x* – *px*)tanΦ)
Untuk melihat cara kerja transformasi ini, pertimbangkan setiap komponen satu per satu. Parameter Θ memindahkan setiap titik ke arah x dengan jumlah yang sama dengan tanΘ. Diagram berikut menunjukkan hubungan antara Θ dan sumbu x condong.
Berikut adalah condong yang sama yang diterapkan ke persegi panjang:
Parameter Φ memiliki efek yang sama, tetapi di sepanjang sumbu y:
Diagram berikutnya memperlihatkan condong sumbu y yang diterapkan ke persegi panjang.
Terakhir, parameter px dan py menggeser titik tengah untuk condong di sepanjang sumbu x dan y.
Mewakili Transformasi di Direct2D
Semua transformasi Direct2D adalah transformasi affine. Direct2D tidak mendukung transformasi non-affine. Transformasi diwakili oleh struktur D2D1_MATRIX_3X2_F. Struktur ini mendefinisikan matriks 3 × 2. Karena kolom ketiga transformasi affine selalu sama ([0, 0, 1]), dan karena Direct2D tidak mendukung transformasi non-affine, tidak perlu menentukan seluruh 3 × 3 matriks. Secara internal, Direct2D menggunakan 3 × 3 matriks untuk menghitung transformasi.
Anggota D2D1_MATRIX_3X2_F dinamai sesuai dengan posisi indeks mereka: anggota _11 adalah elemen (1,1), anggota _12 adalah elemen (1,2), dan sebagainya. Meskipun Anda dapat menginisialisasi anggota struktur secara langsung, disarankan untuk menggunakan kelasD2D1::Matrix3x2F. Kelas ini mewarisi D2D1_MATRIX_3X2_F dan menyediakan metode pembantu untuk membuat salah satu transformasi affine dasar. Kelas ini juga mendefinisikanoperator*()untuk menyusun dua transformasi atau lebih, seperti yang dijelaskan dalam Menerapkan Transformasi di Direct2D.
Depan