线交叉问题是使用线扫描技术解决的问题。 首先,让我们正式定义问题。
c++实现:
https://www.hackerearth.com/practice/math/geometry/line-intersection-using-bentley-ottmann-algorithm/tutorial/
https://blog.csdn.net/derbi123123/article/details/106531120
JavaScript实现:
https://github.com/tmpvar/2d-polygon-self-intersections
以下包含C#实现:
https://www.mianshigee.com/project/justcoding121-Advanced-Algorithms
https://qa.1r1g.com/sf/ask/314323201/
https://web.archive.org/web/20141211224415/http://www.lems.brown.edu/~wq/projects/cs252.html
算法思路
Bentley-Ottmann 是用"扫描线"求平面上一组线段全部交点的经典算法:一条垂直扫描线从左到右移动,只维护与它相交的线段集合(按 y 排序)。
- 事件点有两类:线段端点(插入/删除)与已发现的交点(交换相邻线段次序)。
- 每次只检查相邻线段是否相交,避免两两比较,复杂度为 O((n+k)log n)(n 为线段数,k 为交点数)。
- 常用于多边形自交检测、路径规划与 GIS 几何运算。
- 实现难点是事件队列与状态结构的维护,以及交点重合、端点共线等退化情况的处理。