2013-02-18 114 views
0

我想繪製一個矩形與java awt並使鼠標拖動鼠標光標旋轉。AffineTransform()旋轉矩形的方式太快

當我測試它時,矩形旋轉得很快。

我的矩形():

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

但是,當我稍微拖動(theta小於10度)的矩形到右側,矩形甚至旋轉到樞軸點的底部。

另一個說明,矩形旋轉但矩形的四個角的座標尚未改變。

做了Java的改造任務時,我完全迷失了方向..

+0

爲了更快提供更好的幫助,請發佈[SSCCE](http://sscce.org/)。 – 2013-02-18 00:39:45

+3

我不是100%,但它可能是當您需要弧度時爲「AffineTransform」提供度數... – MadProgrammer 2013-02-18 00:40:46

+0

如果角度直接來自Math.atan2,則以弧度表示。 – 2013-02-18 00:44:28

回答

5

我覺得現在的問題是,你正在積累每個鼠標移動事件你旋轉:當你把鼠標移動10度,你不在運動結束時不會得到一個事件,你會一直得到一堆事件。而且看起來你正在積累所有人在同一個轉換中的旋轉,所以當你達到10度時,你實際上已經知道了1 + 2 + 3 + 4...

解決辦法很簡單:將旋轉前重新改造:

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

或等價,但更好,使用此功能,不累積的轉變。

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

這有效! @rodrigo非常感謝你。我只是在爪哇溼了幾英尺,它一直在竊聽我好幾天... – jasonkim 2013-02-18 01:57:29

+0

+1非常好的拿起! – MadProgrammer 2013-02-18 02:07:20

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

這將幫助。

+0

OP已經說過它是弧度。 – Synchro 2014-08-08 19:27:37