2013-02-08 74 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