我正在开发一个开源跟踪和地理围栏软件应用程序,并且在确定地理围栏的数学方面遇到了一些困难。
我需要确定一个坐标是否存在于多边形内部。然而,棘手的部分是多边形没有设定数量的边。我需要能够计算五十面或五面。
我的研究表明,最简单的方法是采取我的观点(我称之为x)和多边形之外的一个点(称之为y)并确定是否为行((xx,xy),(yx,yy) )与多边形的边界相交。如果它相交奇数次,则点x必须在多边形内。
然而,我知道如何在算法中表达这一点。我显然需要遍历构造多边形的各种线,但我确实没有检查。有人可以帮忙吗?请知道我不是必须要求解决方案。任何可以帮助我找到答案的东西都是一个巨大的帮助。
非常感谢。
答案 0 :(得分:6)
请参阅here
基本上有一种方法(我认为它的Jordan曲线定理)计算光线与构成多边形的线段相交的次数。如果结果是偶数,那么该点在多边形之外,否则该点位于多边形内。
HTH
修改强> 还有一个与这个问题有关的问题可以找到here
答案 1 :(得分:1)
这里的一个关键是要意识到你可以自由选择任何你喜欢的Y点。一个非常好的选择是点(xx,-infinity)。换句话说,直接从有问题的点向下并且无限远。现在问题变成了:有多少多边形边缘在你所讨论的点下面穿过你的X坐标。因此,只需要考虑跨越X坐标的线段。
如果您的点是P =(x,y),并且段终点是P1 =(x1,y1)和P2 =(x2,y2),则它与x交叉的段的y坐标由sy =给出(x-x1)*(y2-y1)/(x2-x1)+ y1
检查sy< y(仅当x1< x< x2或x2< x< x1)时。如果有奇数个,那么P就在里面。
当多边形的一个顶点与所讨论的点位于完全相同的y位置时,存在一些细微的问题。你必须小心这个案子。
答案 2 :(得分:1)
贾斯汀,
您可能还需要更好地定义“多边形外部”以构建线段。
采取最小和最小所有x&的最大值y坐标并构造矩形(xmin,ymin),(xmax,ymin),(xmax,ymax),(xmin,ymax)。矩形外的任何点肯定都在多边形之外 - 然后像其他人一样在上面显示。每个多边形分段和构造的线由等式y = ax + b定义,并且对于每个分段,定义范围xlo和xhi。您构造的线要么跨越范围内的段,要么不跨越。也就是说,段范围内的两个联立方程的解是存在与否。只需计算存在的解决方案的数量即可获得交叉点的数量。
答案 3 :(得分:0)
我假设你在飞机上(2D)。
答案 4 :(得分:0)
计算多边形的winding number和点。
答案 5 :(得分:0)
试试这个,
public static bool PointinPolygon( Point[] points, Point p )
{
bool result = false;
for( int i = 0; i < points.Length - 1; i++ )
{
if( ( ( ( points[ i + 1 ].Y <= p.Y ) && ( p.Y < points[ i ].Y ) ) || ( ( points[ i ].Y <= p.Y ) && ( p.Y < points[ i + 1 ].Y ) ) ) && ( p.X < ( points[ i ].X - points[ i + 1 ].X ) * ( p.Y - points[ i + 1 ].Y ) / ( points[ i ].Y - points[ i + 1 ].Y ) + points[ i + 1 ].X ) )
{
result = !result;
}
}
return result;
}