2013-02-08 77 views
0

我在計算如何確定在矩形內是否點擊鼠標點擊事件(如果矩形已旋轉)時遇到了一些問題。確定在Java中旋轉矩形內的鼠標點擊(AWT,擺動)

可以說我有一個像這樣簡單的MouseAdapter。它只是打印出一條聲明,說如果mousePressed實際上位於矩形內,我們就會打到矩形內。

MouseAdapter mAdapter = new MouseAdapter() { 
    public void mousePressed(MouseEvent e) { 
     int xPos = e.getX(); 
     int yPos = e.getY(); 
     if(xPos >= rect.x && xPos <= rect.x + rect.width && yPos >= rect.y && yPos <= rect.y + rect.height) { 
      System.out.println("HIT INSIDE RECTANGLE"); 
     } 
    } 
}; 

我的問題來自於當我旋轉矩形。上面的if語句顯然不考慮旋轉,所以在旋轉矩形後,我的命中測試失敗。對於旋轉,我做的paint()函數,因爲這簡單的東西:

class drawRect { 

    Rectangle rect = new Rectangle(); 

    ... 

    public void paint(Graphics g) { 
     Graphcis2D g2 = (Graphics2D) g; 
     AffineTransform old = g2.getTransform(); 
     g.rotate(Math.toRadians(90), rect.x, rect.y); 
     g2.draw(rect); 
     g2.setTransform(old); 
    } 
} 

這僅僅是一些快速的僞代碼,這樣你們可以理解我試圖做的。所以請不要擔心語法和所有這些。任何幫助,將不勝感激!

+0

我認爲Rectangle類已經這樣做了一下:http://docs.oracle.com/javase/7/docs/api/java/awt/Rectangle.html#contains(int,INT ) – emin 2013-02-08 20:33:10

+0

還有一個工作示例[此處](http://stackoverflow.com/a/2244285/230513)。 – trashgod 2013-02-09 02:03:29

回答

2

您也可以將旋轉應用於鼠標座標。幹編碼:

MouseAdapter mAdapter = new MouseAdapter() { 
    public void mousePressed(MouseEvent e) { 
     // Create the same transform as used for drawing the rectangle 
     AffineTransform t = new AffineTransform(); 
     t.rotate(Math.toRadians(90), rect.x, rect.y); 
     Point2D tp = t.inverseTransform(e.getPoint()); 

     if(rect.contains(tp)) { 
      System.out.println("HIT INSIDE RECTANGLE"); 
     } 
    } 
}; 
+0

我的rect.contains()似乎仍然是從原始位置(旋轉之前)返回邊界框。我編輯第二段代碼,以更準確地反映我做了些什麼。在旋轉它之後,我需要在'rect'對象中更新哪些內容,以便contains()反映它的新位置? – Tesla 2013-02-08 21:16:39

+0

此外,行'Point2D tp = t.transform(e.getPoint());'似乎無效,因爲轉換函數至少需要2個點作爲參數。 – Tesla 2013-02-08 21:32:21

+0

對不起,有多篇文章!但我其實不需要改變這一點。我實際上使用你的方法來創建一個新的形狀,基本上是應用了變形的矩形。然後我的原始e.getPoint()被用在contains()中。謝謝! – Tesla 2013-02-08 21:46:31