确定坐标是否存在于多边形内部

时间:2010-01-13 19:15:44

标签: geometry polygon intersection

我正在开发一个开源跟踪和地理围栏软件应用程序,并且在确定地理围栏的数学方面遇到了一些困难。

我需要确定一个坐标是否存在于多边形内部。然而,棘手的部分是多边形没有设定数量的边。我需要能够计算五十面或五面。

我的研究表明,最简单的方法是采取我的观点(我称之为x)和多边形之外的一个点(称之为y)并确定是否为行((xx,xy),(yx,yy) )与多边形的边界相交。如果它相交奇数次,则点x必须在多边形内。

然而,我知道如何在算法中表达这一点。我显然需要遍历构造多边形的各种线,但我确实没有检查。有人可以帮忙吗?请知道我不是必须要求解决方案。任何可以帮助我找到答案的东西都是一个巨大的帮助。

非常感谢。

6 个答案:

答案 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)。

  • 计算每一边(在某些坐标系中)的斜率以及从X点到Y点(XY线)的直线斜率。
  • 对于斜率不等于XY斜率的所有边,计算交点。
  • 对于每个点,确定交点是否在线段XY上以及定义边的线段。如果是的话,你越过那边。 (检查交叉点的坐标,看看x和y分量是否都包含在每个线段的值范围内。)
  • 计算过境点的数量,你就得到了答案。

答案 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;
    }