我有一个名为LineSegment
的函数bool LineSegment::intersect(LineSegment &otherLineSegment, Point &intersectionPoint, bool continuous=false)
。我添加了continuous
参数,因为我懒得继承我的LineSegment
类来创建Line
类(反之亦然)。这个论点的作用基本上可以检查两个线段之间的交集作为线段,还有就好像这些是线(也就是它们在两个方向上无限跨越)。如果intersectionPoint
返回intersect(...)
,则true
会保留两个对象之间的交叉点。
为了进行此检查,我使用提供的算法here(用于行交叉)和here(用于线段交叉)。
我遇到的问题是当我有两个硬币线段时,这意味着两者之间有无数个交叉点。例如,我们选择线段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或非常非常接近它(以处理舍入误差),则线条重合。这仍然无法帮助我确定如何处理这些信息?