문제

그래픽 컨텍스트에 벡터를 그리는 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 ...

이것은 회전하고 스케일이지만, 스케일은 내가 원하는 방식으로 적용되지 않습니다. 마치 스케일링 전에 회전하는 것처럼 보입니다. 따라서 잘못된 축에서 이미지를 더 넓게 만듭니다.

더 좋은 방법이 있습니까?

도움이 되었습니까?

해결책

나는 이러한 변환이 스택처럼 구현된다고 생각합니다. 따라서 마지막 변환이 먼저 수행됩니다. 회전 및 스케일 변환 순서를 되돌리려면 원하는 것을 얻어야합니다.

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

다른 팁

회전은 항상 원점에 대해 수행됩니다. 하기 위해 특정 지점에 대해 회전하십시오 포인트를 번역해야합니다.

이 페이지 당신이하려는 일의 배후에있는 수학을 설명하고 왜 변환이 특정 순서로 적용되어야하는지 보여줍니다.

복합재에 적용되는 순서를 제어하기 위해 변환을 연결하는 순서를 변경하십시오.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top