如何检查两个矩形是否在轴上碰撞

How to check if two rectangles collide over the axis

我想我有一些重复的问题,但我就是想不通。

所以我得到了一个 Region class。这个 class 包含四个属性。 aXaYbXbY。 现在我想产生一个方法doesCollide(Region other)。我已经尝试了很多东西,但无法让它发挥作用。我认为是的,因为 regions 指的是 minecraft 世界上的一个区域,其中 to 点 ab 可以是负数。有人可以帮我吗?

为了更好地理解,我绘制了一个场景图:

我尝试过的:

由于用户的提示,我尝试使用 java.awt.Rectangle class:

        Rectangle thisRectangle = new Rectangle((int) aX, (int) aY, Math.abs((int) bX) - Math.abs((int) aX), Math.abs((int) bY) - Math.abs((int) aY));
        Rectangle otherRectangle = new Rectangle((int) other.aX, (int) other.aY, Math.abs((int) other.bX) - Math.abs((int) other.aX), Math.abs((int) other.bY) - Math.abs((int) other.aY));
        return thisRectangle.intersects(otherRectangle);

(完全不知道自己做对了没有)

我尝试了一些我认为是这里使用的“标准”东西:

return aX < other.bX && bX > other.aX & aY < other.bY && bY > other.aY

嗯,也没用。

好的,有些事情要指出。首先,如果你有双精度值,你可以使用 Rectangle2D.Double。其次,它可以很好地处理负数。

我建议创建一种将区域转换为 Rectangle2D 的方法。

public Rectangle2D getBounds(Region r){
    double x, w;
    if(r.aX < r.bX ){
      x = r.aX;
      w = r.bX - r.aX;
    } else{
      x = r.bX;
      w = r.aX - r.bX;
    }
    double y, h;
    if(r.aY < r.bY){
      y = r.aY;
      h = r.bY - r.aY;
    } else{
      y = r.bY;
      h = r.aY - r.bY;
    } 
    return new Rectangle2D.Double(x, y, w, h);
}

这是做什么的,检查以确保 aX、aY 和 bX、bY 的顺序正确,以便 x、y 是矩形的左上角并且宽度和高度为正(或零) ) 值。我把它写成区域的方法,但你可以把它写成区域的方法。这样:

public boolean intersects(Region other){
    return getBounds().intersects(other.getBounds());
}

这是一种处理方法。我使用的是不可变 classes 的记录。 Rectangle2D class 在 Java API 中将使用相同的方法。注意这里假设构造函数中第一个坐标是左上角,另一个是右下角。您可以考虑 specifying your region as a bounded area with the upper left coordinates specified along with the width and height。然后根据需要 return 其他坐标将是微不足道的。

import java.awt.Rectangle;
public class RectangleIntersections {
    
    record Region(int aX, int aY, int bX, int bY) {
        public int getWidth() {
            return bX-aX;
        }
        public int getHeight() {
            return bY-aY;
        }
        public boolean intersects(Region other) {
            return new Rectangle(aX, aY, getWidth(), getHeight()).intersects(
                    new Rectangle(other.aX, other.aY, other.getWidth(), other.getHeight()));
        }
    }
    public static void main(String[] args) {
        new RectangleIntersections().start();
        
    }
    public void start() {
        Region r1 = new Region(0,0, 100,100);
        Region r2 = new Region(50,50, 150,150);
        System.out.println(r1.intersects(r2));
        Region r3 = new Region(101, 101, 110,120);
        System.out.println(r1.intersects(r3));
    }
    
}

打印

true
false

我想你可以这样做:

if(Math.abs(thisRectangle.getMaxX()-otherRectangle.getMaxX())<otherRectangle.getWidth()&& Math.abs(thisRectangle.getMaxY()-otherRectangle.getMinY())<otherRectangle.getHeight())