SuperMap.WindowsPhone.Utilities.Extensions.CheckInRegion1 C# (CSharp) Method

CheckInRegion1() static private method

static private CheckInRegion1 ( GeoRegion region, double x, double y ) : bool
region SuperMap.WindowsPhone.Core.GeoRegion
x double
y double
return bool
        internal static bool CheckInRegion1(GeoRegion region, double x, double y)
        {
            // 判断是否在边线上。
            // 设点为Q,线段为P1P2 ,判断点Q在该线段上的依据是:( Q - P1 ) × ( P2 - P1 ) = 0 且 Q 在以
            // P1,P2为对角顶点的矩形内。前者保证Q点在直线P1P2上,后者是保证Q点不在线段P1P2的延长线或反向延长线上

            Point2D p1;
            Point2D p2;
            bool isInLine = false;
            for (int i = 0; i < region.Parts.Count; i++)
            {
                for (int j = 0; j < region.Parts[i].Count; j++)
                {
                    p1 = region.Parts[i][j];
                    if (j == region.Parts[i].Count - 1)
                    {
                        continue;
                    }
                    else
                    {
                        p2 = region.Parts[i][j + 1];
                    }
                    if (p1.X == p2.X && p1.Y == p2.Y) // 同一点
                    {
                        continue;
                    }
                    double cross = (x - p1.X) * (p2.Y - p1.Y) - (y - p1.Y) * (p2.X - p1.X);

                    bool xIsInLine = x <= Math.Max(p1.X, p2.X) && x >= Math.Min(p1.X, p2.X);
                    bool yIsInLine = y <= Math.Max(p1.Y, p2.Y) && y >= Math.Min(p1.Y, p2.Y);
                    if (cross == 0 && xIsInLine && yIsInLine)
                    {
                        isInLine = true;
                        break;
                    }
                }

                if (isInLine)
                {
                    break;
                }
            }
            if (isInLine)
            {
                return true;
            }

            bool oddNODES = false;

            for (int p = 0; p < region.Parts.Count; p++)
            {
                int polySides = region.Parts[p].Count;
                double[] polyX = new double[polySides];
                double[] polyY = new double[polySides];
                int j = 0;

                for (int i = 0; i < polySides; i++)
                {
                    polyX[i] = region.Parts[p][i].X;
                    polyY[i] = region.Parts[p][i].Y;
                }

                for (int i = 0; i < polySides; i++)
                {
                    j++;
                    if (j == polySides)
                    {
                        j = 0;
                    }
                    bool innerY = polyY[i] < y && polyY[j] >= y;
                    bool innerY2 = polyY[j] < y && polyY[i] >= y;
                    innerY = innerY || innerY2;
                    if (innerY && (polyX[i] + (y - polyY[i]) / (polyY[j] - polyY[i]) * (polyX[j] - polyX[i]) < x))
                    {
                        oddNODES = !oddNODES;
                    }
                }

                // 已经在某一部分的内部,所以不需要继续判断。
                if (oddNODES)
                {
                    return oddNODES;
                }
            }

            return oddNODES;
        }
    }