查找具有公差的所有线交叉点(最好是预先存在的实现)

时间:2012-09-17 12:27:05

标签: computational-geometry

Bentley-Ottmann算法可用于在n log n时间内扫描一组线段中的所有交点。但是有一个版本可以用可变精度做到这一点吗?即如果线条比某一距离更近,则认为线条相交?

2 个答案:

答案 0 :(得分:1)

假设您正在谈论2D中的线段。

AFAIK,没什么特别的。您只需调整intersects(...)类/对象的LineSegment函数。如果两个段之间的最小距离低于预定义阈值,则返回boolean,而不是返回指示“真实”交叉点的true(或其他)值,表示您对交叉点的定义。算法没有变化。


1 见:

答案 1 :(得分:1)

如果2个段不相交,则它们之间的最小距离至少在一个段终点上。因此,在您的情况下,测试一对段是否相交或某段段终点是否在其他段附近就足够了。

第一个测试是Bentley-Ottmann算法的标准测试,第二个部分可以在扫描线上添加和删除段。当段被添加到SL(左端点)时,它足以测试SL上靠近左端点的段和从SL到左给定距离的段。从SL中删除段时类似。

我认为,由于对称性,这足以仅测试一侧,例如将段添加到SL。

由于端点已排序,因此此搜索应该很快。如果有一些担保表明段的容差不是很严重,那么此更改不会改变原始算法的n log n运行时间。