“在计算几何中,H/V 转换、面枚举、半空间交与凸包算法互为对偶视角。半平面交的双端队列算法给出二维 H→V 的一个具体实现:它先采用有界、正面积、无平行边界的明确合约,按方向维护候选边界。C…”
形式陈述
一组直线不等式描述了一个二维可行域。怎样直接得到它的边界,而不是从一个随意画大的矩形开始裁剪?每个输入用有向直线
本页先固定如下输入条件:边界直线两两不平行,最终交集已知有界且有非空内部,所有方向/求交采用精确算术。输入可以含冗余约束。这个版本输出交集的逆时针顶点序列,时间
先按方向
- 若队尾两线的交点在
外,弹出队尾,重复检查 - 若队首两线的交点在
外,弹出队首,重复检查 - 把
加到队尾
所有线处理完,还要闭合首尾:用队首约束检查队尾交点、用队尾约束检查队首交点,只要任一端仍违反就继续删除,直到两端同时有效。最后依次计算相邻交点,包括末线与首线的交点,再合并连续相同的点,首尾相同也只保留一次。两两不平行仍允许三条以上边界共点;严格的“在外”测试可能留下只接触一个顶点的冗余边界,未经这一步规范化的交点序列会含零长度边。
直觉
方向次序把凸边界变成一条只能向同一方向转弯的链。新约束的方向排在所有旧方向后面,因此它可能截掉的候选角点集中在链的两端;中间不能留下“先删一块、再保留一块、再删一块”的交替缺口,否则一条直线与凸链的相交次序会违背凸性。
这里保存的是尚可能属于最终边界的方向有序链。在扫描尚未闭合一圈时,交集可能无界,不能把当前相邻交点草率称为一个已经正确闭合的多边形。末尾的首尾清理正是把开放链变成真实有界边界的必要步骤。
删除队尾的局部理由可以从三条方向递增的线看出:若旧两线交点被新半平面排除,旧尾线在这一端留下的可行边段被夹空;旧前线和新线接起来即可代表这一端的约束边界。队首的论证相同,只发生在方向序列的另一端。这个判断反复应用,保留的每一条边界都有非空的相邻可行段;合约中的最终正面积和有界性保证闭合后至少有三条有效边界。
例子与边界
一条暂存、随后被删的约束
按逆时针顺序取五个点
它们相邻连边的左半平面恰围出这个凸五边形。再加入直线
其方向为
方向排序后,
于是
共点与其他退化边界
例如三角形
同向平行约束可以先保留更紧的一条。例如
两个相反半平面也可能把可行域压成直线;若再加入其他限制,还可能只剩线段或单点。方向队列最后少于三个普通角点,并不能区分这些情况与空集。因此若接口允许它们,应增加独立的可行性与维数分类,再使用相应的无界/低维输出类型;正面积版本仅返回二维有界多边形;扩大输入范围时,应同时扩大输出类型和判定步骤。
已知有界也不是“任选一个大数作框”。若真正解含坐标
推论与应用
比较排序花 while 的最坏长度相加成
它把多面体的 H-表示转换成二维顶点表示;而逐半平面裁剪从一份已知有界轮廓出发,更容易保留点、线段和空集状态。两种算法的输入合约、状态和保证不同。对于已经按方向排列的凸轮廓约束,排序可以省略;队列阶段本身保持线性。
参考资料
- Mark de Berg 等,Computational Geometry: Algorithms and Applications,第 3 版,2008,Chapter 4,二维线性规划、半平面交与对偶。原书课程版本
- Dave Mount,CMSC 754,2020,Lecture 6: Halfplane Intersection and Point-Line Duality,半平面交的几何背景。
- CP-Algorithms 项目,Half-plane intersection 的维护源码与说明,方向排序和队列删除。其包围框、浮点 epsilon 与退化接口不是本页精确有理合约的证明依据。