2013-02-18 5 views
0

Я пытаюсь нарисовать прямоугольник с java awt и заставить его вращаться с помощью мыши, перетаскивая мышью.AffineTransform() слишком быстро поворачивает прямоугольник слишком быстро

Когда я тестировал его, прямоугольник вращается смехотворно быстро.

Мой Rectangle():

private Rectangle2D rec = new Rectangle2D.Float(x0,y0,w,h); 
AffineTransform recTrans = new AffineTransform(); 
int pivotX = x0+w/2, pivotY = y0+h; 
// (0,0) is at the top-left corner 

Мой paintComponent():

public void paintComponent(Graphics g) { 
    Graphics2D graph = (Graphics2D) g; 
      graph.translate(x,y); 
      graph.transform(recTrans); 
      graph.fill(rec); 
      graph.setColor(Color.blue); 
      graph.draw(rec); 
} 

Моя мышь перетаскивая событие:

addMouseListener(new MouseAdapter() { 
    public void mousePressed(MouseEvent e) { 
      previousX = e.getX(); 
      previousY = e.getY(); 
     } 
    }); 
addMouseMotionListener(new MouseMotionAdapter() { 
    public void mouseDragged(MouseEvent e) { 
     currentX = e.getX(); 
     currentY = e.getY(); 

     double angle1 = Math.atan2(currentY-pivotY, currentX-pivotX); 
     double angle2 = Math.atan2(previousY-pivotY, previousX-pivotX); 
     double theta = angle2 - angle1; 
     recTrans.rotate(theta, pivotX, pivotY); 
     } 
    }); 

Так, мол, сценарий выглядит следующим образом:

enter image description here

Но когда я слегка перетащить (тета менее чем 10 градусов) прямоугольник с правой стороны, прямоугольник поворачивается даже к нижней части опорной точки.

Другое примечание: прямоугольник вращается, но координаты четырех углов прямоугольника все же изменились.

Я совсем потерялся при выполнении этих задач преобразования с Java ..

+0

Чтобы лучше помочь, опубликуйте [SSCCE] (http://sscce.org/). –

+3

Я не 100%, но может быть, что вы поставляете градусы в «AffineTransform», когда ему нужны радианы ... – MadProgrammer

+0

Если угол идет непосредственно из Math.atan2, он находится в радианах. –

ответ

5

Я думаю, что проблема заключается в том, что вы накапливаете вращение для каждого события движения мыши, вы получаете: когда вы перемещаете мыши 10 градусов вы не В конце движения вы получите только одно событие, вы получите кучу событий на всем протяжении пути. И кажется, что вы накапливаете вращение всех из них в одном и том же преобразовании, поэтому, когда вы достигаете 10 градусов, у вас есть 1 + 2 + 3 + 4..., вы получаете идею.

Решения легко: сбросить преобразование перед применением вращения:

recTrans.setToIdentity(); 
recTrans.rotate(theta, pivotX, pivotY); 

Или что то же самое, но лучше, использовать эту функцию, которая не накапливает преобразование.

recTrans.setToRotation(theta, pivotX, pivotY); 
+0

Это работает! @rodrigo Большое вам спасибо. Я только что намочил ноги в java, и это прослушивало меня в течение нескольких дней ... – jasonkim

+0

+1 Очень приятно забрать! – MadProgrammer

0
recTrans.rotate(Math.toRadians(theta), pivotX, pivotY); 

Это поможет.

+0

ОП уже сказал, что это в радианах. – Synchro

Смежные вопросы