边界矩形碰撞试验?

时间:2010-08-10 23:36:45

标签: c++ c

我有复杂的多边形,我知道最小x,最小y,最大x和最大y。我还有另一个矩形,我知道左上角和右上角的顶点。知道了这些信息,我怎么知道这两个边界框是否发生碰撞?感谢

4 个答案:

答案 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)时间 - 从谷歌搜索结果复制。