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

CheckInRegion() static private method

static private CheckInRegion ( GeoRegion region, double x, double y ) : bool
region SuperMap.WindowsPhone.Core.GeoRegion
x double
y double
return bool
        internal static bool CheckInRegion(GeoRegion region, double x, double y)
        {
            Point2DCollection points = region.Parts[0];

            double pValue = double.NaN;
            int i = 0;
            int j = 0;

            double yValue = double.NaN;
            int m = 0;
            int n = 0;

            double iPointX = double.NaN;
            double iPointY = double.NaN;
            double jPointX = double.NaN;
            double jPointY = double.NaN;

            int k = 0;
            int p = 0;

            yValue = points[0].Y - points[(points.Count - 1)].Y;
            if (yValue < 0)
            {
                p = 1;
            }
            else if (yValue > 0)
            {
                p = 0;
            }
            else
            {
                m = points.Count - 2;
                n = m + 1;
                while (points[m].Y == points[n].Y)
                {
                    m--;
                    n--;
                    if (m == 0)
                    {
                        return true;
                    }
                }
                yValue = points[n].Y - points[m].Y;
                if (yValue < 0)
                {
                    p = 1;
                }
                else if (yValue > 0)
                {
                    p = 0;
                }
            }


            //使多边形封闭
            int count = points.Count;
            i = 0;
            j = count - 1;
            while (i < count)
            {
                iPointX = points[j].X;
                iPointY = points[j].Y;
                jPointX = points[i].X;
                jPointY = points[i].Y;
                if (y > iPointY)
                {
                    if (y < jPointY)
                    {
                        pValue = (y - iPointY) * (jPointX - iPointX) / (jPointY - iPointY) + iPointX;
                        if (x < pValue)
                        {
                            k++;
                        }
                        else if (x == pValue)
                        {
                            return true;
                        }
                    }
                    else if (x == jPointY)
                    {
                        p = 0;
                    }
                }
                else if (y < iPointY)
                {
                    if (y > jPointY)
                    {
                        pValue = (y - iPointY) * (jPointX - iPointX) / (jPointY - iPointY) + iPointX;
                        if (x < pValue)
                        {
                            k++;
                        }
                        else if (x == pValue)
                        {
                            return true;
                        }
                    }
                    else if (y == jPointY)
                    {
                        p = 1;
                    }
                }
                else
                {
                    if (x == iPointX)
                    {
                        return true;
                    }
                    if (y < jPointY)
                    {
                        if (p != 1)
                        {
                            if (x < iPointX)
                            {
                                k++;
                            }
                        }
                    }
                    else if (y > jPointY)
                    {
                        if (p > 0)
                        {
                            if (x < iPointX)
                            {
                                k++;
                            }
                        }
                    }
                    else
                    {
                        if (x > iPointX && x <= jPointX)
                        {
                            return true;
                        }
                        if (x < iPointX && x >= jPointX)
                        {
                            return true;
                        }
                    }
                }
                j = i;
                i++;
            }

            if (k % 2 != 0)
            {
                return true;
            }
            return false;
        }