2009-03-25 6 views
3

그래픽 컨텍스트에서 벡터를 그리는 일련의 Java2D 호출이 있습니다. 이미지의 크기가 두 배로 커지고 90도 회전해야합니다. 나는이 작업을 수행하려면 다음 코드를 사용하고회전 및 크기 조정 - 둘 다 수행하고 올바른 결과를 얻는 방법?

:

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 ... 

이 회전하고 스케일은, 그러나, 규모가 내가 원하는 방식으로 적용되지 않습니다. 이것은 마치 스케일링 전에 회전되어 잘못된 축에서 이미지가 넓어지는 것과 같습니다.

더 좋은 방법이 있나요?

답변

3

저는 이러한 변환이 스택처럼 구현되어 있으므로 마지막 변환이 먼저 수행됩니다. 회전 및 비율 변환의 순서를 반대로 시도하면 찾고있는 것을 가져와야합니다.

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)); 
+0

좋아,이 작동하지만, 그것을 이해하지 않습니다. 먼저 번역을 적용하는 것이 좋습니까? 즉, 번역이 처음이라면 먼저 일어납니다. 그러나 회전이 처음 적용될 때도 축척 후에 회전이 발생합니까? 거기에 뭔가 이해가 안되네. – jsight

+0

변환이 여전히 올바르게 작동하는 이유를 정확하게 설명하기는 어렵지 만 기본 매트릭스 수학을 살펴보면 왜 의미가 있는지 알 수 있습니다. –

1

변환을 연결하여 합성에서 적용되는 순서를 제어하는 ​​순서를 변경하십시오.

2

회전은 항상 원점에 대해 수행됩니다. rotate about a certain point으로하려면 포인트를 번역해야합니다.

This page은 수행하려는 작업의 뒤에있는 수학을 설명하고 변환을 특정 순서로 적용해야하는 이유를 보여줍니다.

+0

getRotateInstance의 두 번째 및 세 번째 인수는 변환을 관리합니다. 이것은 같은 문제가 아니 었습니다. – jsight