java 中两个矩形之间的碰撞检测

Collision detection between two rectangles in java

我有两个矩形,红色矩形(可以移动)和蓝色矩形。 两者都有:x, y, width, height.

当蓝色和红色矩形之间发生碰撞时,我如何用编程语言(例如 Java 表示?

您必须检查沿 x 轴和沿 y 轴的交点。如果缺少其中任何一个,则矩形之间不会发生碰撞。

一维代码:

boolean overlaps(double point1, double length1, double point2, double length2)
{
    double highestStartPoint = Math.max(point1, point2);
    double lowestEndPoint = Math.min(point1 + length1, point2 + length2);

    return highestStartPoint < lowestEndPoint;
}

你必须同时为 x 和 y 调用它:

boolean collision(double x1, double x2, double y1, double y2, double width1, double width2, double height1, double height2)
{
    return overlaps(x1, width1, x2, width2) && overlaps (y1, height1, y2, height2);
}
  1. 计算第一个矩形的 4 个点。将它们记为 pointA、pointB、pointC、pointD。
  2. 计算第二个矩形的 4 个点。将它们记为点 E、F、G H。

  3. 迭代点E,F,G,H (1) 如果其中任何一项在 A、B、C、D 所包围的区域内。 return 碰撞。 (2)否则不碰撞。

对于3.(1)算法。你需要这样的东西。

Xe >= Xa && Xc <= Xb。 && Yc >= Yc && Ye <=Yc

在java中,检测两个矩形是否碰撞,可以使用intersects()方法

示例代码:

Rectangle r1 = new Rectangle(x1,y1,x2,y2);
Rectangle r2 = new Rectangle(x1,y1,x2,y2);
if(r1.intersects(r2))
{
    //what to happen when collision occurs goes here
}
if (RectA.X1 < RectB.X2 && RectA.X2 > RectB.X1 &&
    RectA.Y1 < RectB.Y2 && RectA.Y2 > RectB.Y1) 

假设你有 Rect A 和 Rect B。反证法。四个条件中的任何一个都可以保证不存在重叠:

Cond1. If A's left edge is to the right of the B's right edge, - then A is Totally to right Of B
Cond2. If A's right edge is to the left of the B's left edge, - then A is Totally to left Of B
Cond3. If A's top edge is below B's bottom edge, - then A is Totally below B
Cond4. If A's bottom edge is above B's top edge, - then A is Totally above B
So condition for Non-Overlap is

Cond1 Or Cond2 Or Cond3 Or Cond4

因此Overlap的充分条件正好相反(De Morgan)

不是 Cond1 也不是 Cond2 也不是 Cond3 也不是 Cond4 这相当于:

A's Left Edge to left of B's right edge, and
A's right edge to right of B's left edge, and
A's top above B's bottom, and
A's bottom below B's Top

注 1:很明显,同样的原理可以扩展到任意数量的维度。 注 2:计算一个像素的重叠也应该相当明显,将边界上的 < and/or > 更改为 <= 或 >=.

如果您很难想象它的工作原理,我在 silentmatt.com/intersection.html 制作了一个示例页面,您可以在其中拖动周围的矩形并查看比较。

bool isIntersect(
  int Ax, int Ay, int Aw, int Ah,
  int Bx, int By, int Bw, int Bh)
{
  return
    Bx + Bw > Ax &&
    By + Bh > Ay &&
    Ax + Aw > Bx &&
    Ay + Ah > By;
}