0

我有一个LineSegment带有名为bool LineSegment::intersect(LineSegment &otherLineSegment, Point &intersectionPoint, bool continuous=false). 我添加了continuous参数,因为我懒得从我LineSegment的类继承来创建一个Line类(反之亦然)。这个论点所做的基本上是可以检查两条线段之间的交叉点,既可以作为线段,也可以将它们作为线段(即它们在两个方向上无限地跨越)。如果返回intersectionPoint,则保存两个对象之间的交点。intersect(...)true

  • 第一种情况涵盖了我们需要知道两条线段是否真的相交的情况。
  • 第二种情况涵盖了即使两条线段不相交的情况,我们仍然需要知道 - 如果我们将这两条线段视为两条线的一部分 - 在某处发生相交。

为了进行此检查,我使用此处提供的算法(用于线段相交)和此处(用于线段相交)。

我遇到的问题是当我有两个并列的线段时,这意味着两者之间有无数个交叉点。例如,让我们以线段l1(Point(0, 1), Point(1, 1))l2(Point(-1, 1), Point(2, 1)). 如果我们将两者都可视化,我们会得到

[Point(-1, 1)------[(0, 1)------(1, 1)]------Point(2, 1)]

连续检查(即如果线相交)返回true(相交点Point(2, 1)甚至不是相交点的一部分,l2并且直接与相交点的属性相矛盾,该属性可以使用任何一条线/线段的方程来计算) 在这种情况下,当线段交点返回时false

我该如何处理这种情况?我当然可以检查两者,如果我得到这样的不匹配,我可以说“好吧,你有重合的线条”。然而,这对我没有进一步帮助,因为:

  • 双重检查很昂贵,必须对我想要的每一对线段进行
  • 重叠意味着有无限的交点(当然,在使用机器浮点数时情况并非如此,因为(由于存储和准确性)我们在该区间内有一组有限(但仍然足够大)的数字)。这显然是不可能处理的,所以必须例外

另一方面,我也不能任其发展,并在我的代码中创建未定义或不正确的行为。一种可能的解决方案是检查两个向量之间的角度(相应线/线段的每个部分),如果角度为 0 或非常非常接近它(以处理舍入误差),则线重合。这仍然不能帮助我确定如何处理这些信息?

4

0 回答 0