Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/user-interface/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Geometry &引用;光线穿过顶点“;多边形中检测点的特殊情况_Geometry_Gis_Polygon_Point - Fatal编程技术网

Geometry &引用;光线穿过顶点“;多边形中检测点的特殊情况

Geometry &引用;光线穿过顶点“;多边形中检测点的特殊情况,geometry,gis,polygon,point,Geometry,Gis,Polygon,Point,若要检测点是否位于多边形中,请从该点向无穷远处投影一条线,然后查看该点与多边形的顶点相交的数量。。。很简单。我的问题是,如果光线在其中一个点上与多边形相交,那么它将被视为与两个线段相交,并被视为在多边形之外。我修改了我的函数,使其在光线与多边形的一个点相交时只计算其中一个线段,但在某些情况下,一条线也可以与该点相交,同时仍在外部。以这张图片为例: 如果假设左上角的点为“无穷大”,并将光线投射到其他任一点,则两个点都在多边形的某个点相交,并且即使一个在内部,一个在外部,也会被视为与相同数量的顶点

若要检测点是否位于多边形中,请从该点向无穷远处投影一条线,然后查看该点与多边形的顶点相交的数量。。。很简单。我的问题是,如果光线在其中一个点上与多边形相交,那么它将被视为与两个线段相交,并被视为在多边形之外。我修改了我的函数,使其在光线与多边形的一个点相交时只计算其中一个线段,但在某些情况下,一条线也可以与该点相交,同时仍在外部。以这张图片为例:

如果假设左上角的点为“无穷大”,并将光线投射到其他任一点,则两个点都在多边形的某个点相交,并且即使一个在内部,一个在外部,也会被视为与相同数量的顶点相交


有什么方法可以弥补这一点,还是我只需要假设那些边缘情况不会出现?

如果光线正好穿过顶点上的一条边,则仅当另一个顶点在光线上方时才计算该边。那会解决你的案子的

例如,在您发布的图片中,较低的光线在左上角顶点处穿过正方形的两侧,但一侧在光线上方,另一侧在下方,因此贡献率为1,目标点位于内部。上部光线在右上顶点处穿过两侧,两侧都在光线下方,因此它们对计数的贡献为0,并且发现目标点位于外侧

更新


我记得读过一篇文章,描述了一种处理一般单数情况的技巧。如果有兴趣,请阅读我的另一个答案。

虽然我的第一个答案可以解决这个简单的问题,但我不得不提到,存在处理这类特殊情况的通用技巧

描述一种处理此类问题的一般技术。他们提供的第一个例子就是你问的算法

其思想是将aka应用于计算符号扰动

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

这是我最初学习这一技术的博客文章,它为这项技术提供了一些很好的背景知识,作者在博客中写了很多关于自动区分(AD)的内容


尽管外观是一种非常实用的技术,尤其是在支持操作符重载的语言中(例如:C++、Haskell、Python……),我在“现实生活”(C++中的工业应用)中使用了它。

< P>在另一个方向发送射线。

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

与考虑拐角情况相比,这将简化代码


最坏的情况是
O(n)*检查复杂性(n)
,这很可能是
O(n^2)
。如果不可接受,您可以按从点到顶点的方向对所有顶点进行排序,然后选择某个间隔的中间位置。这将给出
O(n*logn)

如果一条光线与左下角相交会怎样?那么两边都在上方,这将为计数贡献2,这是偶数,因此该点将被视为在正方形之外。啊,我明白你的意思了。我会试试看。谢谢没问题。顺便说一句,简化计算的一种方法是只使用水平光线,这将使计算更简单,代码更快。顺便说一句,我记得读过关于处理此类问题的一般技术。我会用这些信息更新我的帖子。