Kelas AffineTransform mendeskripsikan fungsi transformasi affine dua dimensi, yaitu transformasi linier dari koordinat dua dimensi ke koordinat dua dimensi, dengan menjaga "kelurusan" grafik dua dimensi (Terjemahan: kelurusan, yaitu garis lurus setelah transformasi) Masih berupa garis lurus tanpa tekukan, dan tetap berupa busur busur) dan "kesejajaran" (Anotasi: kesejajaran, sebenarnya mengacu pada menjaga hubungan posisi relatif antara bangun dua dimensi tidak berubah, garis sejajar tetap merupakan garis sejajar, dan sudut perpotongan garis lurus yang berpotongan tetap tidak berubah. Variabel kompleks dipelajari di tahun kedua tahun , " Ingat "Transformasi Konformal/Transformasi Konformal", matematika adalah raja!). Transformasi affine dapat dicapai melalui kombinasi serangkaian transformasi atom, antara lain: Translasi, Skala, Flip, Rotasi, dan Geser.
Transformasi jenis ini dapat direpresentasikan dengan matriks 3×3 yang baris terakhirnya adalah (0, 0, 1). Matriks transformasi ini mengubah koordinat asal (x, y) menjadi koordinat baru (x', y'). Di sini, koordinat asal dan koordinat baru dianggap sebagai vektor kolom tiga dimensi dari baris terakhir (1). vektor kolom asli diubah dengan perkalian kiri. Matriks mendapat vektor kolom baru:
[x'] [m00 m01 m02] [x] [m00*x+m01*y+m02] [y'] = [m10 m11 m12] [y] = [m10*x+m11*y+m12] [1 ] [ 0 0 1 ] [1] [ 1 ]
Beberapa transformasi affine yang khas:
public static AffineTransform getTranslateInstance(tx ganda, ty ganda)
Transformasi translasi, pindahkan setiap titik ke (x+tx, y+ty), matriks transformasinya adalah:
[ 1 0 terima kasih ] [ 0 1 terima ] [ 0 0 1 ]
(Anotasi: Transformasi terjemahan adalah sejenis "transformasi benda tegar". Siapapun yang pernah belajar fisika di sekolah menengah pasti tahu apa itu "benda tegar". Ini adalah benda ideal yang tidak akan berubah bentuk. Tentu saja, terjemahan tidak akan berubah grafik dua dimensi. Dengan cara yang sama, "transformasi rotasi" di bawah ini juga merupakan transformasi benda tegar, dan "penskalaan" dan "lintas sektoral" akan mengubah bentuk grafik.)
AffineTransform statis publik getScaleInstance (sx ganda, sy ganda)
Transformasi penskalaan memperbesar (mengurangi) absis setiap titik sebanyak sx kali, dan memperbesar (mengurangi) ordinat menjadi sy kali.
[ sx 0 0 ] [ 0 sy 0 ] [ 0 0 1 ]
public static AffineTransform getShearInstance (double shx, double pemalu)
Transformasi geser, matriks transformasinya adalah:
[ 1 shx 0 ] [ malu 1 0 ] [ 0 0 1 ]
Setara dengan kombinasi geser melintang dan geser memanjang
[ 1 0 0 ] [1 shx 0 ] [ pemalu 1 0 ] [ 0 1 0 ] [ 0 0 1 ] [ 0 0 1 ]
(Catatan terjemahan: "Transformasi geser" disebut juga "transformasi salah potong", yang mengacu pada sifat yang mirip dengan ketidakstabilan segi empat. Pernahkah Anda melihat pintu geser besi di toko-toko kecil di jalan? Bayangkan jeruji besi di atas. Proses belah ketupat menarik adalah proses "pemotongan yang salah").
AffineTransform statis publik getRotateInstance (theta ganda)
Transformasi rotasi, grafik target memutar theta radian searah jarum jam di sekitar titik asal, matriks transformasinya adalah:
[ cos(theta) -sin(theta) 0 ] [ dosa(theta) cos(theta) 0 ] [ 0 0 1 ]
public static AffineTransform getRotateInstance (theta ganda, x ganda, y ganda)
Transformasi rotasi. Grafik target diputar searah jarum jam sebesar theta radian dengan (x, y) sebagai sumbu.
[ cos(theta) -sin(theta) xx*cos+y*sin] [ dosa(theta) cos(theta) yx*sin-y*cos ] [ 0 0 1 ]
Ini setara dengan gabungan dua transformasi translasi dan satu transformasi rotasi asal:
[1 0 -x][cos(theta) -sin(theta) 0][1 0 x] [0 1 -y][sin(theta) cos(theta) 0][0 1 y] [0 0 1 ] [0 0 1] [0 0 1]
Dalam geometri, transformasi linier suatu ruang vektor diikuti dengan translasi. Proses ini disebut transformasi affine atau pemetaan radial.
Hal ini dapat dinyatakan secara sederhana sebagai: y = Ax + b, dimana huruf di bawahnya mewakili sebuah vektor dan huruf tebal A mewakili sebuah matriks.
Tidak masalah jika Anda tidak dapat memahaminya untuk saat ini (saya juga tidak memahaminya^_^#), tidak masalah, kami hanya menggunakan beberapa kasus khusus di sini: terjemahan dan rotasi transformasi.
Seperti biasa, mari posting seluruh kode di bawah ini:
impor java.applet.Applet;impor java.awt.BorderLayout;impor java.awt.Checkbox;impor java.awt.CheckboxGroup;impor java.awt.Color;impor java.awt.Graphics;impor java.awt.Graphics2D;impor java.awt.Panel;impor java.awt.event.ItemEvent;impor java.awt.event.ItemListener;impor java.awt.geom.AffineTransform;impor java.awt.geom.Rectangle2D;impor java.util.Random;kelas publik AffineTest memperluas Applet mengimplementasikan ItemListener{ private Rectangle2D rect; Kotak centang TranslateFirst; public void init() { setLayout(New BorderLayout()); CheckboxGroup cbg = new CheckboxGroup(); Panel p = new Panel();rotateFirst = new Checkbox("rotate, terjemahkan", cbg,true);rotateFirst.addItemListener(ini); ("terjemahkan, putar", cbg, false); TranslateFirst.addItemListener(ini); BorderLayout.SOUTH); rect = new Rectangle2D.Float(-0.5f, -0.5f, 1.0f, 1.0f); } public void paint(Grafik g) { Graphics2D g2d = (Graphics2D)g; identifikasi AffineTransform akhir = AffineTransform baru (); boolean memutar = memutarPertama.getState(); Acak r = Acak baru(); oneRadian = Math.toRadians(1.0); for(double radian = 0.0; radian < 2.0*Math.PI ; radian += oneRadian) { g2d.setTransform(identifikasi); ; g2d.rotate(radian); } else { g2d.rotate(radian); g2d.translate(100, 100); } g2d.scale(100, 100); g2d.setColor(Warna baru(r.nextInt())); arg0) { // TODO Metode yang dibuat secara otomatis stub repaint(); java.applet.Applet;impor java.awt.BorderLayout;impor java.awt.Checkbox;impor java.awt.CheckboxGroup;impor java.awt.Color;impor java.awt.Graphics;impor java.awt.Graphics2D;impor java .awt.Panel;impor java.awt.event.ItemEvent;impor java.awt.event.ItemListener;impor java.awt.geom.AffineTransform;impor java.awt.geom.Rectangle2D;impor java.util.Random;kelas publik AffineTest memperluas Applet mengimplementasikan ItemListener{ private Rectangle2D rect; Kotak centang TranslateFirst; public void init() { setLayout(New BorderLayout()); CheckboxGroup cbg = new CheckboxGroup(); Panel p = new Panel();rotateFirst = new Checkbox("rotate, terjemahkan", cbg, true); ("terjemahkan, putar", cbg, false); TranslateFirst.addItemListener(ini); BorderLayout.SOUTH); rect = new Rectangle2D.Float(-0.5f, -0.5f, 1.0f, 1.0f); } public void paint(Grafik g) { Graphics2D g2d = (Graphics2D)g; identifikasi AffineTransform akhir = AffineTransform baru (); boolean memutar = memutarPertama.getState(); Acak r = Acak baru(); oneRadian = Math.toRadians(1.0); for(double radian = 0.0; radian < 2.0*Math.PI ; radian += oneRadian) { g2d.setTransform(identifikasi); ; g2d.rotate(radian); } else { g2d.rotate(radian); g2d.translate(100, 100); } g2d.scale(100, 100); g2d.setColor(Warna baru(r.nextInt())); arg0) { // TODO Metode stub repaint yang dibuat secara otomatis();
Dari perbandingan terlihat bahwa tatanan transformasi affine tidak bisa ditukar begitu saja.