确定鼠标是否在Java中的旋转矩形内滑动(AWT、swing)

确定鼠标是否在Java中的旋转矩形内滑动(AWT、swing),java,swing,affinetransform,Java,Swing,Affinetransform,我在弄清楚如何确定是否在矩形内单击了鼠标单击事件以及矩形是否已旋转时遇到了一些问题 假设我有一个这么简单的鼠标捕捉器。它只是打印出一条语句,说如果被按下的鼠标实际上在矩形内,我们就击中了矩形内 MouseAdapter mAdapter = new MouseAdapter() { public void mousePressed(MouseEvent e) { int xPos = e.getX(); int yPos = e.getY();

我在弄清楚如何确定是否在矩形内单击了鼠标单击事件以及矩形是否已旋转时遇到了一些问题

假设我有一个这么简单的鼠标捕捉器。它只是打印出一条语句,说如果被按下的鼠标实际上在矩形内,我们就击中了矩形内

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");
        }
    }
};

这只是一些快速的伪代码,所以你们可以理解我想做什么。所以请不要担心语法和所有这些。任何帮助都将不胜感激

您也可以对鼠标坐标应用旋转。干编码:

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");
        }
    }
};

我认为Rectangle类已经在做这个look:,int)还有一个工作示例。我的rect.contains()似乎仍然在从原始位置(旋转之前)返回边界框。我编辑第二段代码以更准确地反映我所做的事情。旋转“rect”对象后,是否需要更新它,以便contains()反映其新位置?此外,行“Point2D tp=t.transform(e.getPoint());”似乎无效,因为转换函数接受(至少)2个点作为参数。很抱歉出现了多个帖子!但实际上我不需要改变这个观点。实际上,我用你的方法创建了一个新的形状,基本上就是应用了变换的矩形。然后在contain()中使用了我原来的e.getPoint()。谢谢我认为我的代码需要做反变换,编辑以(希望)改进。当进行3d旋转时,这样做可能吗?
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");
        }
    }
};