我正在寻找一种简单的算法来检测aabb的区域是否与弧形区域(由绳索封闭)或馅饼(通过圆形中心关闭)重叠。
我已经找到了这个答案:Intersection of rectangle and circle (or arc)
但这并不是我想要的,因为我对形状的交叉点不感兴趣。大纲,但只是想知道这些区域是否重叠。
例如,非常小的AABB仅包含饼图的中心但AABB的边缘与饼图的圆相交的情况不会在链接的答案中涵盖。 同样,电弧完全包含AABB并且AABB的侧面甚至不会与电线相交也不会被覆盖。
在我开始重新发明轮子之前,我想问一下这种重叠检查是否有已知的算法。
AABB-Sector的一个例子:
答案 0 :(得分:1)
考虑到各种配置,这不是一个容易解决的问题。
通过将扇形十字穿过中心,您可以简化问题,使水平或垂直线不会与圆弧相遇两次,并分别处理碎片。
然后考虑其中一个碎片并在“缩小”矩形时“膨胀”它。更准确地说,扇区的每个点都变成了源自它的矩形(左上角),而矩形则缩小到它的右下角。
您获得的形状(绿色区域)是所谓的Minkowski总和(又称扩张)。
如您所见,它有5条直边和一条弯曲边。您可以轻松预测所有扇形方向的形状。
现在有一个交叉点,如果缩小到一个点的矩形位于这个曲线六边形内。您使用极坐标(r < R
和Θ' < Θ < Θ"
)检查该点是否属于扇区,并通过标准的多边形点测试检查(直)六边形的内部性。
类似的推理适用于圆形段(和弦)。
这种几何变换允许使用“轨迹”方法,即将解集可视化为几何形状,以支持推理。鉴于域的性质(凸六边形),我们可以得出结论,在最坏的情况下,4个比较(涉及线性或二次项)足以通过二分法得到答案!
答案 1 :(得分:0)
行业和细分案例不同。
对于细分:
对于某个扇区,您可以将其视为段加上三角形,或者: