检测多边形中的点时“射穿顶点”特殊情况

时间:2013-01-02 23:14:13

标签: geometry gis polygon point

要检测某个点是否在多边形中,您将从该点投影到无限远,并查看与其相交的多边形顶点的数量......足够简单。我的问题是,如果光线与其中一个点上的多边形相交,那么它将被计为相交两个线段,并在多边形外部进行考虑。我改变了我的函数,使它只在光线与多边形的一个点相交时才计算其中一个线段,但是有些情况下线条也可以与点相交,同时仍然在外面。以此图片为例:

two examples of a ray crossing a polygon vertex

如果假设左上角的点是“无穷大”,并将光线投射到其他任意一个点,则两者都在多边形的一个点上相交,并且即使有一个点也会计算为相交数量的顶点相交在里面,一个在外面。

有没有办法弥补这一点,或者我只是假设那些边缘情况不会弹出?

3 个答案:

答案 0 :(得分:2)

如果光线精确地穿过顶点的一侧,则只有在另一个顶点位于光线上方时才计算该边。这将解决你的角落问题。

例如,在您发布的图片中,较低的光线穿过左上顶点的正方形的两边,但是一边在光线上方而另一边在下面,因此贡献1并且找到目标点在里面。上部光线穿过右上顶点的两侧,两侧都在光线下方,因此它们对计数贡献0,并且发现目标点在外面。

<强>更新

我记得读过一篇文章,该文章描述了一般处理单个案例的技巧。如果有兴趣,请阅读我的其他答案。

答案 1 :(得分:0)

虽然我的第一个答案应该解决这个简单的问题,但我不禁要提到存在处理这些特殊情况的一般技巧。

This article描述了一种处理这类问题的技术。他们提供的第一个例子之一就是你问的算法!

我们的想法是应用Automatic differentiation aka Dual numbers来计算符号扰动。

顺便说一下,同样的技术也可以用来避免在程序中作为特殊情况处理0/0!

Here是我最初从中学到的博客文章,它为该技术提供了一些很好的背景,作者在博客上发表了很多关于自动区分(AD)的文章。

尽管出现AD是一种非常实用的技术,特别是在对运算符重载有很好支持的语言中(例如:C ++,Haskell,Python ...),我在“现实生活”中使用它(C ++中的工业应用程序)。 / p>

答案 2 :(得分:0)

向另一个方向发送光线。

如果您尝试n+1个不同的方向(n是多边形点的数量),其中一个肯定不会通过任何顶点。

与考虑极端情况相比,这将简化代码。

最坏情况变为O(n)*CheckComplexity(n),可能是O(n^2)。如果不可接受,您可以按照从点到它们的方向对所有顶点进行排序,并选择某个间隔的中间位置。这将给出O(n*log n)