旋转时为什么AffineTransform缩放

时间:2014-11-10 07:03:44

标签: java awt 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 个答案:

答案 0 :(得分:2)

您获得的scaleX和scaleY值实际上是cos(1 rad),这是正确的。

在应用仿射变换后,它们不代表对象的比例。根据{{​​3}},scaleX是变换前变换到最终X坐标之前的初始X坐标的贡献。 scaleY也是如此。这并不意味着x1 = x0 * scaleX,但x1 = x0 * scaleX + y0 * m01y + m02。

要声明没有完成缩放,您可以获得变换的矩阵值并获得行列式。如果没有刻度或剪切,则行列式将为1.此外,表示位移的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);

答案 1 :(得分:0)

采用以下示例:您只能沿x轴缩放。现在你旋转90度。现在绘制的任何东西都应该沿着y轴缩放,而不是由于旋转而缩放x轴。你有它:缩放变化了。