【问题标题】:Overlap AABB-Arc and AABB-Pie重叠 AABB-Arc 和 AABB-Pie
【发布时间】:2015-09-23 16:02:10
【问题描述】:

我正在寻找一种简单的算法来检测 aabb 的面积是否与圆弧(由绳子闭合)或饼图(通过圆心闭合)的面积重叠。

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

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

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

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

AABB-Sector 的一个例子:

【问题讨论】:

标签: algorithm geometry overlap


【解决方案1】:

考虑到配置的多样性,这不是一个简单的问题。

您可以通过将带有十字穿过中心的扇形分割为更简单的方法,这样一条水平或垂直的线就不会与圆弧相交两次,并分别处理各个部分。

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

您获得的形状(绿色区域)是所谓的 Minkowski 和(又名膨胀)。

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

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

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


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

【讨论】:

    【解决方案2】:

    行业和细分领域的情况不同。

    对于一个片段:

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

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

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

    【讨论】:

    • 在您链接的已接受答案中,最后有一条注释“请注意,它依赖于这样一个事实,即矩形的边框不能与扇区的边框相交而不与其圆形部分相交."。我不明白所描述的算法如何涵盖所有情况。我在我的问题中添加了一个图形,以突出显示 3 个案例,我看不到链接答案中的算法如何区分这些案例。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-05
    • 2011-10-03
    • 2017-12-26
    • 2011-04-14
    相关资源
    最近更新 更多