重合线

时间:2016-11-08 14:47:36

标签: c++ geometry line intersection line-segment

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

0 个答案:

没有答案