我无法确定正确的转换顺序以应用于我的应用程序中的元素。该应用程序具有具有父/子关系的元素,并且每个元素都有一个转换(每个元素都在本地空间中绘制然后转换)。
我要存档的是,如果我转换父级,它的所有子级也应该得到转换(因此,如果您旋转父级,则子级应该围绕父级旋转)。
下面的代码就是这样做的,但问题是当我旋转父级然后想要移动子级时。它朝错误的方向移动(由于其父变换)。我试过改变变换的顺序,但没有运气(我知道我应该先翻译然后变换,然后孩子绕着自己的轴旋转——而不是父母)。
编码:
Element e;
AffineTransform t = new AffineTransform();
AffineTransform t3 = new AffineTransform();
for (i = 0; i < el.size(); i++)
{
e = el.get(i);
t3.setToIdentity();
t.setToIdentity();
tmp = e.getParent();
while(tmp != null)
{
t.translate(tmp.getX(), tmp.getY());
t3.rotate(Math.toRadians(tmp.getAngle()),tmp.getAnchorX(), tmp.getAnchorY());
tmp = tmp.getParent();
}
t.concatenate(t3);
t.translate(e.getX(), e.getY());
t.rotate(Math.toRadians(e.getAngle()),e.getAnchorX(), e.getAnchorY());
e.draw(g2d,t);
}
问题: - 给定两个元素(另一个元素的一个子元素) - 父元素旋转(40 度) - 然后子元素移动 10px 我如何连接转换,以便当我移动子元素时它不会沿旋转方向移动?
编辑:Torious 发布的代码(尚未工作):
public AffineTransform getTransformTo(Element ancestor) {
AffineTransform t = (AffineTransform)getAffineTransform().clone();
Element parent = getParent();
while (parent != null && parent != ancestor) {
t.preConcatenate(parent.getAffineTransform());
parent = parent.getParent();
}
return t;
}
public void translateInAncestorSpace(Element ancestor, Point translation) {
AffineTransform fromAncestor = getTransformTo(ancestor); // to ancestor space
try
{
fromAncestor.invert();
} catch(Exception e)
{
e.printStackTrace();
}
translation = (Point)fromAncestor.transform(translation, new Point());
Transform t1 = new Transform();
t1.translate(translation.x,translation.y);
transform(t1);
}
代码输出:
Moving by [x=1,y=1] old position [x=22,y=40]
Moved by [x=-21,y=-39] new position [x=1,y=1]
Moving by [x=2,y=2] old position [x=1,y=1]
Moved by [x=1,y=1] new position [x=2,y=2]
Moving by [x=4,y=3] old position [x=2,y=2]
Moved by [x=2,y=1] new position [x=4,y=3]