我正在尝试找到一种算法,该算法将找到一组线的所有交点,并在 O(n log n) 时间内计算包含所有交点的最小矩形。到目前为止,我猜测它与对偶性和凸包有关,但我有点坚持它实际上如何帮助我解决这个问题。
如果有人对此有任何想法,请告诉我。谢谢 :)
让我们从一个最小限制三角形中三个交点的框 B[0] 开始。
如果找不到三角形,那么我们有以下特殊情况之一,可以单独处理:
所以让我们忽略这些情况作为细节并假设可以找到一个三角形并且找到它不会给算法增加太多时间。
第 1 阶段 - 扩大框以包含每条线的一个交叉点:
调用结果框 B[0]。
第 2 阶段 - 检测线是否在框外有交叉点:
这是关键的观察:对于在盒子内相交的两条线 A 和 B,顺时针绕盒子走,我们会遇到交替的线:例如 ABA B。对于在盒子外相交的两条线,顺时针走不交替:例如 ABB A. 当然也有可能是线在box边界上相交,或者是并发的,但是在描述了主要算法之后会作为一个细节来处理。
这并不完整,因为如果组线在边界上有一个共同的进入点或退出点,则进入和退出序列没有明确定义。对于具有公共入口或出口点的每组线 L,请使用稍大的框来订购 L。
请注意,此算法不会发出所有的交叉点,但它确实保证(我希望)盒子包含所有交叉点。
在 O(n log n) 时间内?哇。我没想到这是可能的。
我在这里没有看到任何其他答案,所以这里有一个想法——诚然,在黑暗中开枪。你可以随心所欲。
想法:首先按方位或坡度对线条进行排序。在其他条件相同的情况下,几乎平行的线似乎很可能在偏远点相交;当然,您感兴趣的是外围点。
您的凸包想法听起来应该是正确的,但考虑到凸包可能具有几乎平行的边,其切线或延伸与感兴趣的区域相交很远。总而言之,这听起来像是一项主要的编程工作。祝你好运。