这可能更像是一个数学问题,但为什么这种方法会失败?
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
只是看着它,我说旋转时缩放不应该改变。
答案 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轴。你有它:缩放变化了。