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