Die AffineTransform-Klasse beschreibt eine zweidimensionale affine Transformationsfunktion, bei der es sich um eine lineare Transformation von zweidimensionalen Koordinaten zu zweidimensionalen Koordinaten handelt, wobei die „Geradheit“ der zweidimensionalen Grafik beibehalten wird (Übersetzung: Geradheit, d. h. die gerade Linie). nach der Transformation) Es ist immer noch eine gerade Linie ohne Biegung und ein Bogen ist still Bogen) und „Parallelität“ (Anmerkung: Parallelität bezieht sich eigentlich darauf, die relative Positionsbeziehung zwischen zweidimensionalen Figuren unverändert zu lassen, parallele Linien sind immer noch parallele Linien und die Schnittwinkel sich schneidender gerader Linien bleiben unverändert. Komplexe Variablen im zweiten Jahr gelernt , „Denken Sie an „Konforme Transformation/Konforme Transformation“, Mathematik ist König!). Eine affine Transformation kann durch eine Kombination einer Reihe atomarer Transformationen erreicht werden, darunter: Translation, Skalierung, Flip, Rotation und Scherung.
Diese Art der Transformation kann durch eine 3×3-Matrix dargestellt werden, deren letzte Zeile (0, 0, 1) ist. Diese Transformationsmatrix transformiert die ursprünglichen Koordinaten (x, y) in die neuen Koordinaten (x', y'). Dabei werden die ursprünglichen Koordinaten und die neuen Koordinaten als dreidimensionaler Spaltenvektor der letzten Zeile (1) betrachtet. Der ursprüngliche Spaltenvektor wird durch Linksmultiplikation transformiert. Die Matrix erhält neue Spaltenvektoren:
[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 ]
Einige typische affine Transformationen:
öffentliche statische AffineTransform getTranslateInstance(double tx, double ty)
Translationstransformation, verschieben Sie jeden Punkt nach (x+tx, y+ty), die Transformationsmatrix lautet:
[ 1 0 tx ] [ 0 1 ty ] [ 0 0 1 ]
(Anmerkung: Die Übersetzungstransformation ist eine Art „Starrkörpertransformation“. Jeder, der in der Mittelschule Physik studiert hat, weiß, was ein „Starrkörper“ ist. Es ist ein ideales Objekt, das sich nicht verformt. Natürlich wird sich die Übersetzung nicht ändern In gleicher Weise handelt es sich bei der unten aufgeführten „Rotationstransformation“ auch um eine Starrkörpertransformation, und durch „Skalieren“ und „Querschneiden“ wird die Form der Grafik geändert.)
öffentliche statische AffineTransform getScaleInstance(double sx, double sy)
Die Skalierungstransformation vergrößert (verkleinert) die Abszisse jedes Punkts auf das sx-fache und vergrößert (verkleinert) die Ordinate auf das sy-fache. Die Transformationsmatrix lautet:
[ sx 0 0 ] [ 0 sy 0 ] [ 0 0 1 ]
öffentliche statische AffineTransform getShearInstance(double shx, double shy)
Schertransformation, die Transformationsmatrix ist:
[ 1 shx 0 ] [ schüchtern 1 0 ] [ 0 0 1 ]
Entspricht einer Kombination aus Querschere und Längsschere
[ 1 0 0 ][ 1 shx 0 ] [ schüchtern 1 0 ][ 0 1 0 ] [ 0 0 1 ][ 0 0 1 ]
(Anmerkung zur Übersetzung: „Schertransformation“ wird auch „Miscut-Transformation“ genannt, was sich auf Eigenschaften bezieht, die der viereckigen Instabilität ähneln. Haben Sie jemals die eisernen Schiebetüren in kleinen Geschäften auf der Straße gesehen? Stellen Sie sich die Eisenstangen oben vor. Der Prozess der Raute Ziehen ist der Vorgang des „falschen Schneidens“).
öffentliche statische AffineTransform getRotateInstance(double theta)
Rotationstransformation, die Zielgrafik dreht Theta-Bogenmaß im Uhrzeigersinn um den Ursprung, die Transformationsmatrix ist:
[ cos(theta) -sin(theta) 0 ] [ sin(theta) cos(theta) 0 ] [ 0 0 1 ]
öffentliche statische AffineTransform getRotateInstance(double theta, double x, double y)
Bei der Rotationstransformation wird die Zielgrafik im Theta-Bogenmaß im Uhrzeigersinn mit (x, y) als Achse gedreht und die Transformationsmatrix lautet:
[ cos(theta) -sin(theta) xx*cos+y*sin] [ sin(theta) cos(theta) yx*sin-y*cos ] [ 0 0 1 ]
Es entspricht der Kombination aus zwei Translationstransformationen und einer Ursprungsrotationstransformation:
[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]
In der Geometrie durchläuft ein Vektorraum eine lineare Transformation, gefolgt von einer Translation. Dieser Vorgang wird als affine Transformation oder radiale Abbildung bezeichnet.
Es kann einfach ausgedrückt werden als: y = Ax + b, wobei der tiefgestellte Buchstabe einen Vektor und der fett gedruckte Buchstabe A eine Matrix darstellt.
Es spielt keine Rolle, ob Sie es vorerst nicht verstehen können (ich verstehe es auch nicht ^_^#), es spielt keine Rolle, wir verwenden hier nur einige Sonderfälle davon: Übersetzung und Rotation Transformation.
Veröffentlichen wir wie üblich den gesamten Code unten:
import java.applet.Applet;import java.awt.BorderLayout;import java.awt.Checkbox;import java.awt.CheckboxGroup;import java.awt.Color;import java.awt.Graphics;import java.awt.Graphics2D;import java.awt.Panel;import java.awt.event.ItemEvent;import java.awt.event.ItemListener;import java.awt.geom.AffineTransform;import java.awt.geom.Rectangle2D;import java.util.Random;public class AffineTest erweitert Applet implementiert ItemListener{ private Rechteck2D rect; private Checkbox rotierenErste; privat Checkbox TranslateFirst; public void init() { setLayout(new BorderLayout()); CheckboxGroup cbg = new CheckboxGroup(); rotationFirst = new Checkbox("rotate, translator", cbg, true); ("übersetzen, drehen", cbg, false); translatorFirst.addItemListener(this); BorderLayout.SOUTH); rect = new Rectangle2D.Float(-0.5f, -0.5f, 1.0f, 1.0f); } public void paint(Graphics g) { Graphics2D g2d = (Graphics2D)g; final AffineTransform (); booleanRotate=rotateFirst.getState(); Random r = new Random(); oneRadian = Math.toRadians(1.0); for(double radians = 0.0; radians < 2.0*Math.PI ; radians += oneRadian) { g2d.setTransform(identify); if(rotate) { g2d.translate(100, 100) ; g2d.rotate(radians); } else { g2d.rotate(radians); g2d.translate(100, 100); } g2d.scale(100, 100); g2d.setColor(new Color(r.nextInt())); } } @Override public void itemStateChanged(ItemEvent arg0) { // TODO Automatisch generierter Methoden-Stub repaint(); }}import java.applet.Applet;import java.awt.BorderLayout;import java.awt.Checkbox;import java.awt.CheckboxGroup;import java.awt.Color;import java.awt.Graphics;import java.awt.Graphics2D;import java .awt.Panel;import java.awt.event.ItemEvent;import java.awt.event.ItemListener;import java.awt.geom.AffineTransform;import java.awt.geom.Rectangle2D;import java.util.Random;public class AffineTest erweitert Applet implementiert ItemListener{ private Rechteck2D rect; private Checkbox rotierenErste; privat Checkbox TranslateFirst; public void init() { setLayout(new BorderLayout()); CheckboxGroup cbg = new CheckboxGroup(); rotationFirst = new Checkbox("rotate, translator", cbg, true); ("übersetzen, drehen", cbg, false); translatorFirst.addItemListener(this); BorderLayout.SOUTH); rect = new Rectangle2D.Float(-0.5f, -0.5f, 1.0f, 1.0f); } public void paint(Graphics g) { Graphics2D g2d = (Graphics2D)g; final AffineTransform (); booleanRotate=rotateFirst.getState(); Random r = new Random(); oneRadian = Math.toRadians(1.0); for(double radians = 0.0; radians < 2.0*Math.PI ; radians += oneRadian) { g2d.setTransform(identify); if(rotate) { g2d.translate(100, 100) ; g2d.rotate(radians); } else { g2d.rotate(radians); g2d.translate(100, 100); } g2d.scale(100, 100); g2d.setColor(new Color(r.nextInt())); } } @Override public void itemStateChanged(ItemEvent arg0) { // TODO Automatisch generierter Methoden-Stub repaint();
Aus dem Vergleich ist ersichtlich, dass die Reihenfolge der affinen Transformation nicht zufällig vertauscht werden kann.