我正在寻找一个简单的算法来检测aabb的区域是否与弧(由线闭合)或饼(通过圆的中心闭合)的区域重叠。
我已经找到答案:Intersection of rectangle and circle (or arc)
但这并不是我想要的,因为我对形状轮廓的交点不感兴趣,只是想知道这些区域是否重叠。
如果一个很小的AABB只包含馅饼的中心,但AABB的边缘不与馅饼的圆相交,则链接的答案将不包括在内。
同样的情况下,弧完全包含AABB和AABB的双方甚至不相交的电线将不被涵盖。
现在,在我开始重新设计轮子之前,我想问一下是否有一个已知的算法来进行这种重叠检查。
aabb扇区的一个示例:
algorithm - 重叠AABB-Arc和AABB-Pie-LMLPHP

最佳答案

考虑到配置的多样性,这不是一个容易的问题。
通过用十字穿过中心分割扇形,使水平线或垂直线不会两次与圆弧相交,从而使问题更简单,并分别处理各个部分。
然后考虑其中一个部分,在“放气”矩形的同时“充气”。更准确地说,扇区的每一点都成为源于它的矩形(左上角),而矩形则收缩到右下角。
你得到的形状(绿色区域)是一个所谓的minkowski和(又名膨胀)。
如你所见,它有五条直边和一条曲边。您可以轻松预测所有扇区方向的形状。
algorithm - 重叠AABB-Arc和AABB-Pie-LMLPHP
现在,如果矩形缩小到某个点位于这个曲线六边形内,则会有一个交集使用极坐标(r < RΘ' < Θ < Θ")检查点是否属于扇区,并通过多边形测试中的标准点检查(直)六边形的内部性。
类似的推理也适用于圆段(和弦)。
algorithm - 重叠AABB-Arc和AABB-Pie-LMLPHP
这种几何变换允许使用“轨迹”方法,即将解集可视化为几何图形,以支持推理考虑到域(凸六边形)的性质,我们可以得出结论,在最坏的情况下,4个比较(涉及线性或二次项)就足以通过二分法得到答案!

关于algorithm - 重叠AABB-Arc和AABB-Pie,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/32744344/

10-12 17:41