要检测某个点是否在多边形中,您将从该点投影到无限远,并查看与其相交的多边形顶点的数量......足够简单。我的问题是,如果光线与其中一个点上的多边形相交,那么它将被计为相交两个线段,并在多边形外部进行考虑。我改变了我的函数,使它只在光线与多边形的一个点相交时才计算其中一个线段,但是有些情况下线条也可以与点相交,同时仍然在外面。以此图片为例:
如果假设左上角的点是“无穷大”,并将光线投射到其他任意一个点,则两者都在多边形的一个点上相交,并且即使有一个点也会计算为相交数量的顶点相交在里面,一个在外面。
有没有办法弥补这一点,或者我只是假设那些边缘情况不会弹出?
答案 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)
。