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

问题描述 投票:4回答:5

我有两个矩形,红色矩形(可以移动)和蓝色矩形。两者都有:x,y,宽度,高度。

当蓝色和红色矩形之间发生碰撞时,如何用Java等编程语言说?

java algorithm collision-detection
5个回答
12
投票
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

因此,重叠的充分条件恰恰相反(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:计算一个像素的重叠也应该是相当明显的,将该边界上的<和/或>更改为<=或a> =。

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


6
投票

在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
}

3
投票
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;
}

0
投票

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

1-D代码:

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
投票
  1. 计算第一个矩形的4个点。注意它们为pointS,pointS,pointS,pointS。
  2. 计算第二个矩形的4个点。注意它们是pointE,F,G H.
  3. 如果其中任何一个在A,B,C,D所包围的区域内,则迭代点E,F,G,H(1)。回击。 (2)否则不发生碰撞。

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

车辆> =远&& Xc <= Xb。 && Yc> = Yc && Ye <= Yc

© www.soinside.com 2019 - 2024. All rights reserved.