重叠AABB-Arc和AABB-Pie

时间:2015-09-23 16:02:10

标签: algorithm geometry overlap

我正在寻找一种简单的算法来检测aabb的区域是否与弧形区域(由绳索封闭)或馅饼(通过圆形中心关闭)重叠。

我已经找到了这个答案:Intersection of rectangle and circle (or arc)

但这并不是我想要的,因为我对形状的交叉点不感兴趣。大纲,但只是想知道这些区域是否重叠。

例如,非常小的AABB仅包含饼图的中心但AABB的边缘与饼图的圆相交的情况不会在链接的答案中涵盖。 同样,电弧完全包含AABB并且AABB的侧面甚至不会与电线相交也不会被覆盖。

在我开始重新发明轮子之前,我想问一下这种重叠检查是否有已知的算法。

AABB-Sector的一个例子:

example of four AABBs intersecting a two sectors

2 个答案:

答案 0 :(得分:1)

考虑到各种配置,这不是一个容易解决的问题。

通过将扇形十字穿过中心,您可以简化问题,使水平或垂直线不会与圆弧相遇两次,并分别处理碎片。

然后考虑其中一个碎片并在“缩小”矩形时“膨胀”它。更准确地说,扇区的每个点都变成了源自它的矩形(左上角),而矩形则缩小到它的右下角。

您获得的形状(绿色区域)是所谓的Minkowski总和(又称扩张)。

如您所见,它有5条直边和一条弯曲边。您可以轻松预测所有扇形方向的形状。

enter image description here

现在有一个交叉点,如果缩小到一个点的矩形位于这个曲线六边形内。您使用极坐标(r < RΘ' < Θ < Θ")检查该点是否属于扇区,并通过标准的多边形点测试检查(直)六边形的内部性。

类似的推理适用于圆形段(和弦)。

enter image description here

这种几何变换允许使用“轨迹”方法,即将解集可视化为几何形状,以支持推理。鉴于域的性质(凸六边形),我们可以得出结论,在最坏的情况下,4个比较(涉及线性或二次项)足以通过二分法得到答案!

答案 1 :(得分:0)

行业和细分案例不同。

对于细分:

  • Broadphase:如果圆段的AABB没有相交,那么没有。
  • 如果和弦与AABB相交(或在其中),答案是肯定的。这是线段到矩形的测试,我假设你知道该怎么做。
  • 这仅留下AABB在圆弧段内或与圆弧相交的情况。为此,至少部分四边中的一部分必须在该部分内(或者包含整个部分包括和弦,我们会在前一步中找到)。
  • 因此将矩形视为四行,并为每一行
    • 通过与圆的交点
    • 计算圆内的线段
    • 如果存在则通过与和弦比较检查线的任一端是否在圆弧段的内侧。

对于某个扇区,您可以将其视为段加上三角形,或者:

  • 如果圆圈的AABB没有相交,则为。
  • 如果任一径向线相交,则为是。
  • 否则将矩形视为四个线段,并为每个线段:
    • 通过与圆的交点计算圆内的线段。
    • 如果存在,则计算第一条径向线正确一侧的子段。
    • 如果存在,则计算在第二条径向线的正确一侧的子段。