形式陈述
给定两个逆时针凸多边形公理库简单多边形Simple polygon由不自交的闭合折线围成、没有孔洞并具有明确内部与外部的平面多边形。 ,怎样输出闭集合 的边界?这里要求输入没有零长度边,边界算内部。输出可能是凸多边形、线段、单点或空集,接口应显式区分这些情况。
窗口 是其每条有向边左侧闭半平面公理库仿射超平面与半空间Affine hyperplane · Half-space由非零线性泛函的等值集及其两侧不等式区域定义的仿射几何对象。的交。对窗口边 ,记
表示保留。扫描当前轮廓中每条有向边 ,按下面的规则输出顶点,输出顺序就是新的边界顺序:
- 两端都在内部:输出
- 在内、 在外:输出与边界线的交点
- 在外、 在内:先输出交点,再输出
- 两端都在外:不输出
只有内外分类不同才计算交点。设 ,则
这一分支中 ,且 。相邻重复输出应合并,首尾重复也只留一份;边界端点可能既由求交产生、又由“输出 ”产生,去重不能省略。
直觉
一条边从外面进到窗口,必须先从门口进入,所以先写交点再写终点;从里面离开,则只写最后还留在窗口里的交点。整条轮廓被一条直线切开后,新轮廓沿原边界走一部分,再沿切口连接回来。凸性保证保留部分只有一个连通轮廓。
第 轮的不变量是:当前顶点序列准确表示
初始 成立。一条边与半平面相交只有上述四种情形,按循环次序连接保留下来的边段就得到与下一半平面的交。归纳后,处理完窗口的全部边,得到的恰是 。
逐边裁剪的三次状态
例子与边界
取
先处理 。第一条边 从外进入,交点是 ;最后一条边 从内离开,交点是 。当前轮廓依次为
下一轮 把右侧两条边截在 和 。处理 时,左下边又产生 ;最后处理 ,得到
因此交集不是整个矩形:左下角的一小块原本就不属于 。用鞋带公式求面积为 ,也等于矩形面积 减去底为 、高为 的三角形面积 。这个独立面积核对能发现漏交点或顶点顺序错误。
若改用窗口 ,交集只有点 ;再把左边移到 ,交集为空。不能把“少于三个顶点”一律解释为无交,也不能给一个单点输出伪造面积非零的闭环。线段可以用两个端点表示,继续裁剪时按线段与半平面相交处理即可。
此页让两个输入都凸。若被裁对象是凹多边形,一刀可能留下多个分离部分;单个顶点环会用重合桥连接它们,不能再当成一个普通简单多边形返回。若裁剪窗口本身非凸,更不能直接把所有边的左半平面相交当成该窗口:那样得到的是一个凸集。
推论与应用
单个半平面裁剪含 个顶点的凸轮廓需要 工作和输出存储。一次裁剪至多新增两个交点,而边数最多增加一;经过 个半平面后至多有 个顶点。因此裁一个 顶点凸多边形到 边窗口的直接界是
辅助轮廓存储为 。窗口边数固定时为 。对于两个都很大的凸多边形,存在更专门的线性求交算法;本页不把逐边扫描的成本写成那种算法的界。
所有内外分支都由方向判定公理库方向判定Orientation test用二维或高维行列式符号判断点组转向或仿射定向的基本谓词。决定,几何符号必须一致。整数坐标可用足够宽的精确整数求方向,有理交点则保留分子分母;浮点坐标需要带误差保证的谓词。把所有“接近零”都强行算成内部,会改变边界并可能在连续裁剪中留下自相矛盾的点序。
裁剪与点在多边形内判定公理库点在多边形内判定Point in polygon · Point-in-polygon test先识别边界,再以射线横截奇偶或绕数把查询点分类为简单多边形内部、外部或边界。的输出不同:后者只回答一个点的位置,前者构造整个交集。对于给定窗口、绘图区域和局部可行域,逐边裁剪的每个中间状态都能直接画出并检查。
参考资料
- Ivan E. Sutherland、Gary W. Hodgman,Reentrant Polygon Clipping,CACM 17(1),1974,32–42。原始算法来源,介绍逐个裁剪平面处理顶点流的结构。
- University of Utah,PLOT79,CLPSH2 原始软件说明,二维 Sutherland–Hodgman 裁剪的输入/输出及流水阶段。
- Joseph O’Rourke,Computational Geometry in C,第 2 版,1998,Chapter 7。作者代码与勘误索引