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);
}
- 计算第一个矩形的 4 个点。将它们记为 pointA、pointB、pointC、pointD。
计算第二个矩形的 4 个点。将它们记为点 E、F、G H。
迭代点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;
}
我有两个矩形,红色矩形(可以移动)和蓝色矩形。 两者都有: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);
}
- 计算第一个矩形的 4 个点。将它们记为 pointA、pointB、pointC、pointD。
计算第二个矩形的 4 个点。将它们记为点 E、F、G H。
迭代点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;
}