我在PAffineTransform
中找到以下代码:
/**
* Scales the transform about the given point by the given scale.
*
* @param scale to transform the transform by
* @param x x coordinate around which the scale should take place
* @param y y coordinate around which the scale should take place
*/
public void scaleAboutPoint(final double scale, final double x, final double y) {
//TODO strange order
translate(x, y);
scale(scale, scale);
translate(-x, -y);
}
反向操作不正确:
translate(-x, -y);
scale(scale, scale);
translate(x, y);
所有使用的方法都与 AffineTransform
中相同。
更新
我的错误。
顺序变换修改是指从右边开始的矩阵乘法。因此,最后应用的修改在变换时首先起作用,因为变换是从左边开始的矩阵乘法。
PAffineTransform
中的顺序与以下事实有关:Piccol2D 中的每个节点都有一个仿射变换,该仿射变换定义了该节点的局部坐标系。
围绕特定点进行缩放,首先要平移对象,使该点位于原点。然后执行缩放,然后执行原始平移的反转,将定点移回其原始位置。
PNode
有自己的局部坐标系,原点位于 (0, 0)。因此,当在节点上执行scaleAboutPoint()
时,PAffineTransform
中定义的顺序是有意义的。首先,平移到点,使其成为新的原点,然后缩放,然后反转平移。