当测试点位于多边形边缘时,多边形算法中的点返回真

Posted

技术标签:

【中文标题】当测试点位于多边形边缘时,多边形算法中的点返回真【英文标题】:Point in polygon algorithm that returns true when the test point is on a polygon edge 【发布时间】:2016-03-04 17:45:52 【问题描述】:

我已经实现了基于http://alienryderflex.com/polygon/ 的多边形点算法。

它工作正常,但正如文章中所说:

如果测试点在多边形的边界上,这个算法会产生不可预知的结果

事实证明,当测试点位于多边形的边界/边缘(和顶点)上时,我需要算法返回 true。

有没有:

一种对我有帮助的替代算法;或 一种修改此算法以获得我想要的结果的方法(例如,在运行算法之前稍微扩展多边形)

【问题讨论】:

该算法适用于浮点数,因此通常“在边缘”的概念比看起来更棘手。参见例如What Every Computer Scientist Should Know About Floating-Point Arithmetic 和Clas-s-room Examples of Robustness Problems in Geometric Computations。 在任何情况下,您都可以针对您关心的情况进行预检查。 IE。如果该点在多边形边缘的 epsilon 内,则返回 true。如果您的坐标是整数,那么您甚至可以使用 epsilon = 0 来执行此操作。但是即使对于距离为 epsilon 的多边形外部的点,该算法也可能返回 true,因为它可能适用于浮点数 【参考方案1】:

稍微扩展多边形是一种选择,但对于凹多边形来说这可能会很棘手。

我的建议是将点向不同的方向(上/下/左/右)移动一小部分,并对每个移动点进行计算。如果确定至少有一个移位点在内部,则将其视为在内部。

另一种选择是让计算交叉点的线沿不同方向延伸,而不仅仅是水平方向。

但这可能不值得花时间,因为正如您链接的文章所述: “这通常不是问题,因为多边形的边缘无论如何都是无限薄的,并且正好落在边缘上的点可以任意移动而不会损害多边形的外观。”

【讨论】:

以上是关于当测试点位于多边形边缘时,多边形算法中的点返回真的主要内容,如果未能解决你的问题,请参考以下文章

顶点定义框算法中的点?

多边形算法中的点有时会给出错误的结果[关闭]

SQL Server 的多边形算法中的点

sp::over() 用于多边形分析中的点

cf Round 613

不相交多边形中的点