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?

Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top