Rotação e Escala - Como fazer as duas coisas e obter o resultado certo?
-
22-08-2019 - |
Pergunta
Eu tenho um conjunto de chamadas Java2D que atraem vetores em um contexto gráfico. Eu gostaria que a imagem a ser dobrou de tamanho e, em seguida, girada em 90 graus.
Eu estou usando o seguinte código para fazer isso:
Graphics2D g2 = // ... get graphics 2d somehow ...
AffineTransform oldTransform = g2.getTransform();
AffineTransform newTransform = (AffineTransform)oldTransform.clone();
newTransform.concatenate(AffineTransform.getTranslateInstance(x1, x2));
newTransform.concatenate(AffineTransform.getScaleInstance((double)newW/(double)iconW, (double)newH/(double)iconH));
newTransform.concatenate(AffineTransform.getRotateInstance(Math.toRadians(rotationAngle), (double)iconW/2.0d, (double)iconH/2.0d));
// ... do my drawing ...
Isto roda e escalas, no entanto, a escala não é aplicada da maneira que eu gostaria. É como se ele é girado antes de escala, tornando a imagem mais larga no eixo errado.
Existe uma maneira melhor de fazer isso?
Solução
Eu acredito que essas transformações são implementadas como uma pilha - para transformar o último é realizado pela primeira vez. Tente inverter a ordem das rodar e escala transformações e você deve obter o que você está procurando.
newTransform.concatenate(AffineTransform.getTranslateInstance(x1, x2));
newTransform.concatenate(AffineTransform.getRotateInstance(Math.toRadians(rotationAngle), (double)iconW/2.0d, (double)iconH/2.0d));
newTransform.concatenate(AffineTransform.getScaleInstance((double)newW/(double)iconW, (double)newH/(double)iconH));
Outras dicas
As rotações são sempre realizada sobre a origem. A fim de girar sobre um determinado ponto você deve traduzir o pontos.
Esta página explica a matemática por trás o que você está tentando para fazer e mostrar por que transformações precisam ser aplicados em uma determinada ordem.
Alterar a ordem em que você concatenar as transformações para controlar a ordem em que eles são aplicados no compósito.