我有一个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 或非常非常接近它(以处理舍入误差),则线重合。这仍然不能帮助我确定如何处理这些信息?