У меня возникли проблемы с определением правильного порядка преобразований для применения к элементам в моем приложении. Приложение имеет элементы, которые имеют родительские/дочерние отношения, и каждый элемент имеет преобразование (каждый элемент рисуется в локальном пространстве, а затем преобразовывается).java Affine Transform правильный заказ
То, что я хочу архивировать, состоит в том, что если я преобразую родительский объект, все его дочерние элементы также должны быть преобразованы (поэтому, если вы вращаете родителя, ребенок должен вращаться вокруг родителя).
Код ниже делает именно это, но проблема заключается в том, что я поворачиваю родительский элемент, а затем хочу переместить его. Он движется в неправильном направлении (из-за его родительского преобразования). Я попытался изменить последовательность преобразований, но не повезло (я знаю, что должен сначала перевести, а затем преобразовать, но потом ребенок повернут вокруг своей оси - вместо родителей).
Код:
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 Как могу я конкатенатные преобразования, чтобы при перемещении ребенка он не двигался в повернутом направлении?
EDIT: Код, который 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]
Чтобы лучше помочь, опубликуйте [SSCCE] (http://sscce.org/). Кстати. У вас есть вопрос? –