2014-11-10 3 views
0

이것은 아마 더 많은 수학 문제 일 수 있지만 왜이 방법이 실패할까요?왜 회전 할 때 AffineTransform 스케일이 변하는가

public void test() { 
    AffineTransform transform = AffineTransform.getRotateInstance(1); 

    System.out.println("scaleX = " + transform.getScaleX() + ", " + "scaleY = " + transform.getScaleY()); 

    Assert.assertEquals(1, transform.getScaleX(), 0.001); // fails 
    Assert.assertEquals(1, transform.getScaleY(), 0.001); // fails, too 
} 

출력은 다음과 같습니다 scaleX = 0.5403023058681398, scaleY = 0.5403023058681398

그냥 내가 스케일링이 회전하면서 변경해서는 안 말하고 싶지만 그것을보고에서.

답변

2

현재 받고있는 scaleX 및 scaleY 값은 실제로 cos (1 rad)입니다.

아핀 변환을 적용한 후에는 개체의 크기를 나타내지 않습니다. this documentation에 따라 scaleX는 변환 전 최종 X 좌표로 변환하기 전의 초기 X 좌표의 기여입니다. scaleY에 대해서도 마찬가지입니다. x1 = x0 * scaleX이지만 x1 = x0 * scaleX + y0 * m01y + m02를 의미하지는 않습니다.

스케일링을 수행하지 않는다고 주장하려면 변환의 행렬 값을 가져 와서 행렬식을 얻을 수 있습니다. 당신 만 규모의 x 축 : 더 규모 또는 전단이없는 경우, 결정은 또한 변위를 나타내는 2 개 개의 구성 요소가 0

double[] m = transform.getMatrix() 
Assert.assertEquals(1, m[0]*m[4] - m[1]*m[3], 0.001) 
Assert.assertEquals(0, m[2], 0.001); 
Assert.assertEquals(0, m[5], 0.001); 
0

다음 예제를 가지고 있어야한다 1. 것이다. 이제 90도 회전합니다. 그려진 모든 것은 이제 회전으로 인해 x 축이 아닌 y 축을 따라 확장되어야합니다. 그리고 당신은 그것을 가지고 있습니다 : 스케일링이 바뀌 었습니다.