“裁剪与点在多边形内判定的输出不同:后者只回答一个点的位置,前者构造整个交集。对于给定窗口、绘图区域和局部可行域,逐边裁剪的每个中间状态都能直接画出并检查。”
形式陈述
输入是顶点循环序列定义的简单多边形 inside、outside 或 boundary。算法先对每条边用方向测试与坐标包围判断
Ray crossing 方法从
对通过筛选的边,计算水平交点
仅当
对已通过纵向筛选的上升边,只在 orientation 为正时翻转;对下降边,只在它为负时翻转。这样交点比较也使用同一个精确符号谓词,不必先舍入一个交点坐标。分母不会为零,因为水平边已经被纵向条件排除。普通顶点的上下邻边合计一次,局部极值处则合计零次或两次,因此奇偶性反映真正的横穿。最终奇数为内部、偶数为外部。Winding number 方法则按边向上或向下穿越的方向累加
直觉
Jordan 曲线定理保证这里的两侧确为内部与外部。从内部走向无穷远,每次真正横穿边界都会在内部与外部之间切换;终点在外部,所以起点在内部恰对应奇数次切换。恰好触碰顶点却不穿过去时,不应发生切换。半开规则让这类触碰贡献偶数次,同时让普通穿越贡献一次。
边界是第三种真实答案,不应在最后随意并入内部或外部。API 若只允许布尔值,必须明确 boundary 的归属。
例子与边界
按顺序取 L 形顶点
查询
若射线穿过局部极值顶点,相邻两边都在水平线同侧,几何上只是触碰边界而未真正穿入另一区域。半开条件会让两边贡献零或配对抵消;若简单地把“射线与闭线段相交”全部计数,就可能把一次触碰误当横穿。
浮点坐标下,点几乎落在线上会让 orientation 的符号不稳定。精确整数谓词、自适应精度或明确误差模型比统一 epsilon 更可靠;后者可能破坏对称性,使同一点在相邻边测试中得到互相矛盾的结果。自交多边形还需先选择奇偶填充或非零绕数规则,本页结论只针对简单多边形。
推论与应用
点内判定用于拾取、地图围栏、碰撞检测和多边形布尔运算。大量静态查询可先三角剖分,再建立具有相应最坏界的平面点定位结构,将查询降到
Ray crossing 与 winding number 在简单多边形上给一致分类,却携带不同推广能力:绕数保留方向信息,可描述某些自交曲线;奇偶法只记录穿越次数的模二值。
参考资料
-
W. Randolph Franklin,PNPOLY — Point Inclusion in Polygon Test,作者技术说明,访问于2026年,The Inequality Tests are Tricky、Point on a (Boundary) Edge:半开计数与单独的边界检测。
-
Franco P. Preparata and Michael I. Shamos, Computational Geometry: An Introduction, Springer, 1985, Ch. 2.
-
Joseph O’Rourke, Computational Geometry in C, 2nd ed., Cambridge University Press, 1998, §7.4.