A classe AffineTransform descreve uma função de transformação afim bidimensional, que é uma transformação linear de coordenadas bidimensionais para coordenadas bidimensionais, mantendo a "retitude" dos gráficos bidimensionais (Tradução: retidão, ou seja, a linha reta após a transformação) Ainda é uma linha reta sem curvatura e um arco ainda é arco) e "paralelismo" (anotação: paralelismo, na verdade se refere a manter inalterada a relação posicional relativa entre figuras bidimensionais, as linhas paralelas ainda são linhas paralelas e os ângulos de interseção das linhas retas que se cruzam permanecem inalterados. Variáveis complexas aprendidas no segundo ano , " Lembre-se de "Transformação Conforme/Transformação Conforme", a matemática é rei!). A transformação afim pode ser alcançada através de uma combinação de uma série de transformações atômicas, incluindo: Translação, Escala, Inversão, Rotação e Cisalhamento.
Este tipo de transformação pode ser representado por uma matriz 3×3, cuja última linha é (0, 0, 1). Esta matriz de transformação transforma as coordenadas originais (x, y) nas novas coordenadas (x', y'). Aqui, as coordenadas originais e as novas coordenadas são consideradas como o vetor coluna tridimensional da última linha (1). O vetor coluna original é transformado pela multiplicação à esquerda. A matriz obtém novos vetores coluna:
[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 ]
Várias transformações afins típicas:
público estático AffineTransform getTranslateInstance (duplo tx, duplo ty)
Transformação de tradução, mova cada ponto para (x+tx, y+ty), a matriz de transformação é:
[1 0 tx] [0 1 ty] [0 0 1]
(Anotação: A transformação da tradução é uma espécie de "transformação do corpo rígido". Qualquer pessoa que tenha estudado física no ensino médio sabe o que é um "corpo rígido". É um objeto ideal que não se deforma. Claro, a tradução não mudará os gráficos bidimensionais da mesma forma, a "transformação de rotação" abaixo também é uma transformação de corpo rígido, e "escalonamento" e "corte transversal" alterarão a forma do gráfico.)
public static AffineTransform getScaleInstance(duplo sx, duplo sy)
A transformação de escala aumenta (reduz) a abcissa de cada ponto para sx vezes e aumenta (reduz) a ordenada para sy vezes.
[sx 0 0] [0 sy 0] [0 0 1]
público estático AffineTransform getShearInstance (duplo shx, duplo tímido)
Transformação de cisalhamento, a matriz de transformação é:
[1 shx 0] [tímido 1 0] [0 0 1]
Equivalente a uma combinação de cisalhamento transversal e longitudinal
[1 0 0] [1 shx 0] [tímido 1 0] [0 1 0] [0 0 1] [0 0 1]
(Nota de tradução: "Transformação de cisalhamento" também é chamada de "transformação de corte incorreto", que se refere a propriedades semelhantes à instabilidade quadrilátera. Você já viu portas deslizantes de ferro em pequenas lojas na rua? Imagine as barras de ferro acima. O processo de losango puxar é o processo de "corte errado").
público estático AffineTransform getRotateInstance (duplo theta)
Transformação de rotação, o gráfico alvo gira teta radianos no sentido horário em torno da origem, a matriz de transformação é:
[ cos (teta) -sin (teta) 0 ] [ sin (teta) cos (teta) 0 ] [ 0 0 1 ]
público estático AffineTransform getRotateInstance (duplo theta, duplo x, duplo y)
Transformação de rotação, o gráfico alvo é girado no sentido horário por teta radianos com (x, y) como eixo, e a matriz de transformação é:
[ cos(teta) -sin(teta) xx*cos+y*sin] [ sin(teta) cos(teta) yx*sin-y*cos ] [ 0 0 1 ]
É equivalente à composição de duas transformações de translação e uma transformação de rotação de origem:
[1 0 -x][cos(teta) -sin(teta) 0][1 0 x] [0 1 -y][sin(teta) cos(teta) 0][0 1 y] [0 0 1 ] [0 0 1][0 0 1]
Na geometria, um espaço vetorial sofre uma transformação linear seguida de uma translação. Este processo é chamado de transformação afim ou mapeamento radial.
Pode ser expresso simplesmente como: y = Ax + b, onde a letra subscrita representa um vetor e a letra A em negrito representa uma matriz.
Não importa se você não consegue entender por enquanto (eu também não entendo ^_^#), não importa, usamos apenas alguns casos especiais aqui: translação e rotação transformação.
Como de costume, vamos postar o código completo abaixo:
importar java.applet.Applet;importar java.awt.BorderLayout;importar java.awt.Checkbox;importar java.awt.CheckboxGroup;importar java.awt.Color;importar java.awt.Graphics;importar java.awt.Graphics2D;importar java.awt.Panel;importar java.awt.event.ItemEvent;importar java.awt.event.ItemListener;importar java.awt.geom.AffineTransform;importar java.awt.geom.Rectangle2D;importar java.util.Random;classe pública AffineTest estende Applet implementa ItemListener{ private Rectangle2D rect; Caixa de seleção traduzirFirst; public void init() { setLayout(new BorderLayout()); CheckboxGroup cbg = new CheckboxGroup(); ("traduzir, girar", cbg, false); traduzirFirst.addItemListener(this); BorderLayout.SOUTH); (); booleano girar = girarPrimeiro.getState(); oneRadian = Math.toRadians(1.0); for(double radianos = 0,0; radianos < 2,0*Math.PI ; radianos += oneRadian) { g2d.setTransform(identificar); ; g2d.rotate(radianos); g2d.translate(100, 100); } g2d.scale(100, 100); g2d.setColor(new Color(r.nextInt())); arg0) { // TODO stub do método gerado automaticamente repaint() }}import java.applet.Applet;importar java.awt.BorderLayout;importar java.awt.Checkbox;importar java.awt.CheckboxGroup;importar java.awt.Color;importar java.awt.Graphics;importar java.awt.Graphics2D;importar java .awt.Panel;importar java.awt.event.ItemEvent;importar java.awt.event.ItemListener;importar java.awt.geom.AffineTransform;importar java.awt.geom.Rectangle2D;importar java.util.Random;classe pública AffineTest estende Applet implementa ItemListener{ private Rectangle2D rect; Caixa de seleção traduzirFirst; public void init() { setLayout(new BorderLayout()); CheckboxGroup cbg = new CheckboxGroup(); ("traduzir, girar", cbg, false); traduzirFirst.addItemListener(this); BorderLayout.SOUTH); (); booleano girar = girarPrimeiro.getState(); oneRadian = Math.toRadians(1.0); for(double radianos = 0,0; radianos < 2,0*Math.PI ; radianos += oneRadian) { g2d.setTransform(identificar); ; g2d.rotate(radianos); g2d.translate(100, 100); } g2d.scale(100, 100); g2d.setColor(new Color(r.nextInt())); arg0) { // TODO stub do método gerado automaticamente repaint() }}
A partir da comparação, pode-se ver que a ordem da transformação afim não pode ser trocada casualmente.