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