该算法 FindIntersections(S)
是一种平面扫描算法,旨在找到平面上一组线段 S
中所有交点。它是计算几何中的一个基本算法。以下是详细说明:
输入: 平面上的一组线段 S
。
输出: 交点集。对于每个交点,算法还会识别包含它的线段。
1. 初始化:
Initialize an empty event queue Q
:创建一个空事件队列 Q
。此队列将存储事件点,即发生有趣事情的点(例如线段的开始或结束,或交点)。Q
通常实现为优先队列,按事件点的 x 坐标排序(如果 x 坐标相等,则按 y 坐标排序)。Insert segment endpoints into Q
:将 S
中所有线段的端点插入到 Q
中。至关重要的是:
Initialize an empty status structure T
:创建一个空状态结构 T
。此结构将存储当前在扫描线(一条假想的垂直线,从左到右穿过平面)上“活动”的线段。T
通常实现为平衡二叉搜索树,按扫描线上线段的 y 坐标排序。2. 主循环:
while Q is not empty
:只要队列中有事件,算法就继续执行。Determine the next event point p in Q and delete it
:检索并从 Q
中删除具有最小 x 坐标(如果 x 坐标相等,则具有最小 y 坐标)的事件点 p
。HandleEventPoint(p)
:算法的核心逻辑包含在 HandleEventPoint
函数中。此函数针对每个事件点 p
调用,并处理不同的情况:HandleEventPoint(p) 内部:
事件点 p
有三种可能的情况:
p
是线段的下端点:
p
关联的线段 s
插入到状态结构 T
中。s
与其在 T
中的邻居(紧邻其上方和下方的线段)的交点。如果发现交点位于扫描线右侧,则将这些交点作为新事件添加到 Q
中。p
是线段的上端点:
T
中删除与 p
关联的线段 s
。T
中紧邻 s
上方和下方的线段现在成为邻居,则检查它们是否相交。如果它们在扫描线右侧相交,则将该交点作为新事件添加到 Q
中。p
是一个交点:
p
以及在 p
处相交的线段。T
中相交线段的顺序。这是因为在交点之后,它们的垂直顺序会发生变化。Q
中。关键思想及其工作原理: