我有两个矩形,红色矩形(可以移动)和蓝色矩形。 两者都有:x,y,宽度,高度。
当蓝色和红色矩形之间发生碰撞时,如何用Java等编程语言说出来?
答案 0 :(得分: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:计算一个像素的重叠也应该是相当明显的,改变&lt;和/或&gt;在该边界上与&lt; =或a&gt; =。
如果您很难想象它的工作原理,我在 silentmatt.com/intersection.html 上做了一个示例页面,您可以在其中拖动矩形并查看比较。
答案 1 :(得分: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
}
答案 2 :(得分: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;
}
答案 3 :(得分: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);
}
答案 4 :(得分:-1)
计算第二个矩形的4个点。请注意它们为pointE,F,G H.
迭代点E,F,G,H (1)如果其中任何一个在A,B,C,D所包围的区域内。回击。 (2)否则没有碰撞。
对于3.(1)算法。你需要这样的东西。
Xe&gt; = Xa&amp;&amp; Xc <= Xb。 &安培;&安培; Yc> = Yc&amp;&amp; Ye&lt; = Yc