Geometry 包含所有直线交点的最小矩形

Geometry 包含所有直线交点的最小矩形,geometry,lines,Geometry,Lines,我试图找到一种算法,可以找到一组直线的所有交点,并计算出包含O(n logn)时间内所有交点的最小矩形。到目前为止,我猜测它与对偶性和凸包有关,但我有点执着于它如何帮助我解决这个问题 如果有人对此有想法,请告诉我。谢谢:)在O(n log n)时间内?哇!我没想到这是可能的 我还没有看到任何其他的答案,所以这里有一个想法——无可否认,这是一个黑暗中的机会。你可以随心所欲 想法:从按方向角或坡度对线进行排序开始。在其他条件相同的情况下,几乎平行的线似乎可能在边远点相交;当然,你感兴趣的是边远地区

我试图找到一种算法,可以找到一组直线的所有交点,并计算出包含O(n logn)时间内所有交点的最小矩形。到目前为止,我猜测它与对偶性和凸包有关,但我有点执着于它如何帮助我解决这个问题

如果有人对此有想法,请告诉我。谢谢:)

在O(n log n)时间内?哇!我没想到这是可能的

我还没有看到任何其他的答案,所以这里有一个想法——无可否认,这是一个黑暗中的机会。你可以随心所欲

想法:从按方向角或坡度对线进行排序开始。在其他条件相同的情况下,几乎平行的线似乎可能在边远点相交;当然,你感兴趣的是边远地区


你的凸包概念听起来好像应该是正确的,但是考虑到船体可能有几乎平行的侧面,其切线或延伸部分与感兴趣的区域相交。总而言之,这听起来像是一项重要的编程工作。祝你好运。

让我们从一个框B[0]开始,框B[0]最小地限定三角形中的三个交点

如果找不到三角形,则我们有以下特殊情况之一,可以单独处理:

  • 所有的线都是平行的
  • 所有交叉口都沿一条线。如果除一条线外的所有线都平行,则可能发生这种情况
  • 所有直线在一个点相交
  • 因此,让我们忽略这些细节,假设可以找到一个三角形,找到它不会给算法增加太多时间

    阶段1-扩大长方体,使其包含每条线的一个交点:

  • 标记形成初始三角形的三条线
  • 选择一条未标记的线,并找到与标记线的交点P。这总是可能的,因为至少有三条标记线彼此不平行
  • 将方框扩大到包含P
  • 从2开始重复,直到标记所有线,即它们在框中至少有一个交点
  • 调用结果框B[0]

    第2阶段-检测线是否在方框外相交:

    关键的观察结果是:对于框内相交的两条线A和B,顺时针绕框走,我们会遇到交替的线:例如A B B。对于框外相交的两条线,顺时针走不会交替:例如A B A。当然,这些线有可能在框边界上相交,或是并发的,但在描述主算法后,将作为详细信息处理

  • 选择线的方向:如果线不是水平的,则让线朝向+y方向,并让水平线朝向+x方向。其中一条线是箭头,然后选择箭头尽可能指向上方,如果箭头是水平的,则指向右侧。有了这个方向,每条线都有一个进入框的点(其中定向线指向框中),还有一个退出点。它们可能是相同的点
  • 从右上角开始,沿边界顺时针走出口交点,创建线的“出口序列”
  • 从框的右上角开始顺时针走输入交点,创建线的“输入顺序”
  • 如果所有交点都位于方框内部,则进入和退出顺序将相互循环,B[i]是交点的最小边界框
  • 否则,将两个序列与任意元素对齐(通过循环旋转)
  • 找出序列中第一个不同的元素。这两条线必须在方框外有一个交点P,因此通过将B[i]增长到包含P来形成B[i+1]
  • 从2开始重复
  • 这是不完整的,因为如果一组线在边界上有一个公共的进入点或退出点,则没有很好地定义进入和退出序列。对于具有一个公共的进入点或退出点的每组线L,使用稍微大一点的框对L进行排序


    请注意,此算法不会发出所有交点,但它确实保证(我希望)盒子里装的都是这些东西。

    所以,我想你的问题是如何找到所有的交点?它们是线段,还是直线?+1.如果以前没有这样做过,你可以写一篇关于这方面的期刊论文。干得好。@thb:谢谢,我不知道如何发布它,特别是如果计算领域有更优雅的解决方案的话图维奥的评论让我怀疑这是一门教授试图让他们练习CG思想的课程。