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