两个矩形相交

我有两个矩形,每个都有4个值:

左侧位置X ,顶部位置Y ,宽度W和高度H

 X1, Y1, H1, W1 X2, Y2, H2, W2 

矩形不旋转,如下所示:

 +--------------------> X axis | | (X,Y) (X+W, Y) | +--------------+ | | | | | | | | | | +--------------+ v (X, Y+H) (X+W,Y+H) Y axis 

确定两个矩形的交点是否为空的最佳解决scheme是什么?

 if (X1+W1<X2 or X2+W2<X1 or Y1+H1<Y2 or Y2+H2<Y1): Intersection = Empty else: Intersection = Not Empty 

如果你有四个坐标 – ((X,Y),(A,B))((X1,Y1),(A1,B1)) – 而不是两个加上宽度和高度,看起来像这样:

 if (A<X1 or A1<X or B<Y1 or B1<Y): Intersection = Empty else: Intersection = Not Empty 

最好的例子

 /** * Check if two rectangles collide * x_1, y_1, width_1, and height_1 define the boundaries of the first rectangle * x_2, y_2, width_2, and height_2 define the boundaries of the second rectangle */ boolean rectangle_collision(float x_1, float y_1, float width_1, float height_1, float x_2, float y_2, float width_2, float height_2) { return !(x_1 > x_2+width_2 || x_1+width_1 < x_2 || y_1 > y_2+height_2 || y_1+height_1 < y_2); } 

也有另一种方式看到这个链接 …并编码你自己..

如果两个矩形的尺寸相同,您可以这样做:

 if (abs (x1 - x2) < w && abs (y1 - y2) < h) { // overlaps } 

我只是试着用ac程序写下面。

 #include<stdio.h> int check(int i,int j,int i1,int j1, int a, int b,int a1,int b1){ return (\ (((i>a) && (i<a1)) && ((j>b)&&(j<b1))) ||\ (((a>i) && (a<i1)) && ((b>j)&&(b<j1))) ||\ (((i1>a) && (i1<a1)) && ((j1>b)&&(j1<b1))) ||\ (((a1>i) && (a1<i1)) && ((b1>j)&&(b1<j1)))\ ); } int main(){ printf("intersection test:(0,0,100,100),(10,0,1000,1000) :is %s\n",check(0,0,100,100,10,0,1000,1000)?"intersecting":"Not intersecting"); printf("intersection test:(0,0,100,100),(101,101,1000,1000) :is %s\n",check(0,0,100,100,101,101,1000,1000)?"intersecting":"Not intersecting"); return 0; } 

使用其中(0,0)是左上angular的坐标系。

我想到了一个垂直和水平滑动窗口,并提出这个:

(B.Bottom> A.Top && B.Top <A.Bottom)&&(B.Right> A.Left && B.Left <A.Right)

如果你把德摩根定律应用于以下,你会得到什么?

不是(B.Bottom <A.Top || B.Top> A.Bottom || B.Right <A.Left || B.Left> A.Right)

  1. B在A之上
  2. B在A以下
  3. B是A的左边
  4. B是A的权利

如果(X1 <= X2 + W2 && X2 <= X1 + W1 && Y1> = Y2-H2 && Y2> = Y1 + H1)相交

在问题Y是最高的位置..

注意:此解决scheme仅在矩形与X / Y轴alignment时才起作用。