“给定两个逆时针凸多边形 $P,W$,怎样输出闭集合 $P\cap W$ 的边界?这里要求输入没有零长度边,边界算内部。输出可能是凸多边形、线段、单点或空集,接口应显式区分这些情况。”
形式陈述
在二维实仿射空间中固定坐标;两点的线段指所有
Jordan 曲线定理保证上述简单边界的补集恰有两个连通分支:一个有界内部和一个无界外部。本页的简单多边形指闭包“内部
为正;顺时针时为负。符号依赖坐标系方向约定;方向测试只是判断局部转向和检测相交的算法工具,不参与简单多边形对象的定义。
直觉
“简单”只表示边界不穿过自己,不表示多边形凸、边数少或外观规整。凹陷可以任意深,只要沿边界走一圈时每个非相邻边段互不相遇,仍能清楚区分内部与外部。这个拓扑保证是点内判定、三角剖分和多边形布尔运算能够建立不变量的起点。
顶点列表不仅是一组点,还规定相邻关系和方向。同样的点集按不同顺序连接,可能得到简单多边形,也可能得到自交折线;因此凸包或点集排序不能替代边界输入。
例子与边界
轴对齐的 L 形边界是凹简单多边形:其某些内角大于
连续重复顶点会产生零长度边,非相邻边只在端点“轻触”会让边界不再是 Jordan 曲线,共线边重叠则使同一边界片段被走多次。这些退化输入不能靠“肉眼仍像一个区域”忽略;几何算法应拒绝它们,或先明确一种更宽的弱简单多边形模型。
一个外框加一条内框可以描述带孔多边形区域,却不是单个简单多边形的内部,因为边界有两个连通分支。类似地,自交多边形可用奇偶规则或绕数定义填充区域,但那是另一种对象,不能直接套用简单多边形的三角剖分结论。
推论与应用
简单边界使点可稳定分类为 interior、exterior 或 boundary,也保证存在不引入新顶点的三角剖分。耳切通过合法耳逐次缩小边界;单调划分再接线性栈剖分,则利用两条有序边界链减少工作。若两个输入还都凸,逐半平面裁剪可以直接构造它们的交。孔洞、自交与退化输入改变这些算法的合约,需要同步处理。
有向面积还提供全局方向检查,但面积非零本身不能证明简单性:蝴蝶结各部分的有向贡献可能抵消或留下非零值。验证输入仍需检查非相邻边相交,而不是用一个数值替代拓扑条件。
参考资料
- Joseph O’Rourke, Computational Geometry in C, 2nd ed., Cambridge University Press, 1998, Chs. 1–2.
- Mark de Berg, Otfried Cheong, Marc van Kreveld, and Mark Overmars, Computational Geometry: Algorithms and Applications, 3rd ed., Springer, 2008, Ch. 3.