Как вращаться с AffineTransform и сохранить систему координат оригинала? - PullRequest
2 голосов
/ 05 февраля 2011

Я командный шаблон для поворота и перевода фигур на Java Swing. Перевод и вращение работают хорошо по отдельности, но когда я делаю 60 градусов.вращение и затем перевод, перевод следуют за новой повернутой координатой.Что означает, что если я перетаскиваю мышь, форма перемещается с зазором в 60 градусов от вектора движения мыши, есть ли какое-то простое решение?пожалуйста, помогите, я ударю стену здесь

Мой метод выполнения для вращения

public void execute() {  
    System.out.println("command: rotate " + thetaDegrees );       
    Iterator iter = objects.iterator();  
    Shape shape;  
    while(iter.hasNext()){  
        shape = (Shape)iter.next();           
        mt.addMememto(shape);             
        AffineTransform t =  shape.getAffineTransform();      
        t.rotate(Math.toRadians(thetaDegrees), shape.getCenter().x, shape.getCenter().y);  
        shape.setAffineTransform(t);              
    }  
}  

Мой метод выполнения для перевода

public void execute() {  
    Iterator iter = objects.iterator();  
    Shape shape;  
    while(iter.hasNext()){  
        shape = (Shape)iter.next();  
        mt.addMememto(shape);  
        AffineTransform t = shape.getAffineTransform();  
        System.out.println("Translation x :"+x + ", Translation y :"+y);  
        t.translate(x,y);  
        shape.setAffineTransform(t);  
    }  
} 

Любая помощь может бытьочень ценится

Ответы [ 2 ]

5 голосов
/ 05 февраля 2011

Чтобы выполнить вращение на месте (когда объект вращается вокруг своей оси), вы должны:

  1. перевести объект в начало координат
  2. применить вращение
  3. перевести обратно в исходное положение
  4. применить желаемый перевод

Обратите внимание, что шаги 3 и 4 могут применяться сразу.

Если попытка поворота выполняется в положении, отличном от начала координат, достигается эффект «вращения», когда объект кажется вращающимся относительно начала координат.

1 голос
/ 05 февраля 2011

Вы используете специальную функцию поворота, которая будет учитывать смещение фигуры, чтобы правильно вращаться вокруг ее центра.Однако вам нужно сделать нечто подобное для функции перевода, чтобы учесть ориентацию фигуры.

Попробуйте вместо этого использовать функцию перевода:

public void execute() {  
    Iterator iter = objects.iterator();  
    Shape shape;  
    while(iter.hasNext()){  
        shape = (Shape)iter.next();  
        mt.addMememto(shape);  
        AffineTransform t = new AffineTransform();
        System.out.println("Translation x :"+x + ", Translation y :"+y);
        t.translate(x,y);
        t.concatenate(shape.getAffineTransform());
        shape.setAffineTransform(t);  
    }  
}

Выполняет перевод в исходной системе координат.

...