Bentley-Ottmann算法可用于在n log n
时间内扫描一组线段中的所有交点。但是有一个版本可以用可变精度做到这一点吗?即如果线条比某一距离更近,则认为线条相交?
答案 0 :(得分:1)
假设您正在谈论2D中的线段。
AFAIK,没什么特别的。您只需调整intersects(...)
类/对象的LineSegment
函数。如果两个段之间的最小距离低于预定义阈值,则返回boolean
,而不是返回指示“真实”交叉点的true
(或其他)值,表示您对交叉点的定义。算法没有变化。
1 见:
答案 1 :(得分:1)
如果2个段不相交,则它们之间的最小距离至少在一个段终点上。因此,在您的情况下,测试一对段是否相交或某段段终点是否在其他段附近就足够了。
第一个测试是Bentley-Ottmann算法的标准测试,第二个部分可以在扫描线上添加和删除段。当段被添加到SL(左端点)时,它足以测试SL上靠近左端点的段和从SL到左给定距离的段。从SL中删除段时类似。
我认为,由于对称性,这足以仅测试一侧,例如将段添加到SL。
由于端点已排序,因此此搜索应该很快。如果有一些担保表明段的容差不是很严重,那么此更改不会改变原始算法的n log n
运行时间。