判断点在多边形范围之内的方法

判断点在多边形范围之内的方法,网上找的,觉得挺有用的,共享一下……

 

/// <summary>
        /// 测试点是都在多边形之内
        /// </summary>
        /// <param name="xt">点的X坐标</param>
        /// <param name="yt">点的Y坐标</param>
        /// <param name="listPolygon">多边形坐标点集合</param>
        /// <returns></returns>
        private bool TestRange(double xt, double yt, List<Tuple<double, double>> listPolygon)
        {
            int nCount = listPolygon.Count;
            int nCross = 0;
            for (int i = 0; i < nCount; i++)
            {
                double tempx1 = listPolygon[i].Item1;
                double tempx2 = listPolygon[(i + 1) % nCount].Item1;
                double tempy1 = listPolygon[i].Item2;
                double tempy2 = listPolygon[(i + 1) % nCount].Item2;
                // 求解 y=p.y 与 p1p2 的交点 
                if (tempy1 == tempy2) // p1p2 与 y=p0.y平行 
                    continue;

                if (yt < Math.Min(tempy1, tempy2)) // 交点在p1p2延长线上 
                    continue;
                if (yt >= Math.Max(tempy1, tempy2)) // 交点在p1p2延长线上 
                    continue;

                // 求交点的 X 坐标 
                double x = (double)(yt - tempy1) * (double)(tempx2 - tempx1) / (double)(tempy2 - tempy1) + tempx1;

                if (x > xt)
                    nCross++; // 只统计单边交点 
            }
            // 单边交点为偶数,点在多边形之外
            return (nCross % 2 == 1);
        }

 

 

posted @ 2014-03-11 09:39  了了之  阅读(917)  评论(0编辑  收藏  举报