我正在尝试找到一种算法,该算法将找到一组线的所有交点,并计算包含O(n log n)时间内所有交点的最小矩形。到目前为止,我猜它与二元和凸壳有关,但我有点坚持它实际上如何帮助我解决这个问题。
如果有人对此有所了解,请告诉我。谢谢:))
答案 0 :(得分:3)
让我们从一个B [0]开始,它最小化三角形中的三个交叉点。
如果找不到三角形,那么我们有以下特殊情况之一可以单独处理:
因此,让我们忽略这些情况作为细节,并假设可以找到一个三角形,找到它不会给算法增加太多时间。
阶段1 - 增加框以包含每行的一个交叉点:
调出结果框B [0]。
阶段2 - 检测线条之外是否有交叉点:
这是关键的观察结果:对于在框内相交的两条线A和B,顺时针绕着框走,我们遇到交替的线:例如A B A B.对于与盒子外侧相交的两条线,顺时针行走不会交替:例如A B B A.当然,线条可能在框边界上相交,或者是并发的,但在描述主算法后,这将被视为细节。
这是不完整的,因为如果组线在边界上具有共同的进入或退出点,则进入和退出序列没有很好地定义。对于具有共同进入或退出点的每组线L,使用稍大的框来订购L.
请注意,此算法不会发出所有交叉点,但它确实(我希望)该框包含所有交叉点。
答案 1 :(得分:1)
在O(n log n)时间?哇。我没想到这是可能的。
我在这里没有看到任何其他答案,所以这里有一个想法 - 无可否认地在黑暗中拍摄。你可以按照自己的意愿去做。
想法:首先按轴承或斜率对线进行排序。在其他条件相同的情况下,几乎平行的线似乎可能在外围点相交;当然,这是你感兴趣的外围点。
你的凸壳概念听起来应该是正确的,但考虑到船体可能有几乎平行的边,其切线或延伸部分远离感兴趣的区域。总而言之,这听起来像是一项重要的编程工作。祝你好运。