我有复杂的多边形,我知道最小x,最小y,最大x和最大y。我还有另一个矩形,我知道左上角和右上角的顶点。知道了这些信息,我怎么知道这两个边界框是否发生碰撞?感谢
答案 0 :(得分:3)
尝试这样的事情:
typedef struct rect {
int top; // maximum y-coord
int bottom; // minimum y-coord
int left; // minimum x-coord
int right; // maximum x-coord
} rectangle;
// Returns 1 if the point (x, y) lies within the rectangle, 0 otherwise
int is_point_in_rectangle(rectangle r, int x, int y) {
if ((r.left <= x && r.right >= x) &&
(r.bottom <= y && r.top >= y))
return 1;
return 0;
}
// Returns 1 if the rectangles overlap, 0 otherwise
int do_rectangles_intersect(rectangle a, rectangle b) {
if ( is_point_in_rectangle(a, b.left , b.top ) ||
is_point_in_rectangle(a, b.right, b.top ) ||
is_point_in_rectangle(a, b.left , b.bottom) ||
is_point_in_rectangle(a, b.right, b.bottom))
return 1;
if ( is_point_in_rectangle(b, a.left , a.top ) ||
is_point_in_rectangle(b, a.right, a.top ) ||
is_point_in_rectangle(b, a.left , a.bottom) ||
is_point_in_rectangle(b, a.right, a.bottom))
return 1;
return 0;
}
您可以对任何多边形执行相同操作,只需遍历其所有点并使用它们调用is_point_in_rectangle
。由于您只有复杂多边形的边界框,因此此方法可能会给出误报(即,矩形位于复杂多边形的边界框内但在多边形本身之外)。但是,此限制适用于将复杂形状简化为边界框的任何方法。
答案 1 :(得分:2)
如果间隔[Ax1,Ax2]和[Bx1,Bx2]重叠且间隔[Ay1,Ay2]和[By1,By2]重叠,则矩形A和B发生碰撞。< / p>
答案 2 :(得分:0)
我认为以下工作最次,但它肯定比边界框检查更准确,虽然更复杂。看看以下问题:
Polygon in rectangle algorithm?
在那里,您会看到一个算法,用于查明某个点是否在多边形内。您可以将此测试应用于第一个多边形w.r.t的每个点。第二个。然后相反。如果测试至少通过一次,则会发生碰撞。
答案 3 :(得分:0)
创建矩形左右边缘的x坐标的排序数组。然后,使用“扫描线”通过矩形从左向右移动。保留二进制搜索树,其中包含与扫描线重叠的矩形的顶部和底部边缘的y坐标。对于数组的每个元素,检查它是左边还是右边。如果是右边缘,请从BST中移除相应的顶部和底部边缘。如果是左边缘,则在BST中搜索与当前矩形重叠的矩形;如果有,则返回重叠。然后,将矩形的顶部和底部边缘的y坐标添加到BST。搜索需要O(n log n)时间,因为对矩形进行排序需要O(n log n)时间,并且每2n次迭代需要O(log n)时间 - 从谷歌搜索结果复制。