/*
函數的輸入:
(1)當前點的座標p
(2)區域頂點數組pt[];
(3)頂點數nCount
輸出: 在區域內返回TRUE,否則返回FALSE。
Point類型是一個結構:
struct Point
{
類型 x;//此處類型根據採用的經緯度類型決定。
類型 y;
};
*/
BOOL PtInPolygon(Point p, Point pt[], int nCount)
{
int nCross = 0;
for (int i = 0; i < nCount; i++)
{
Point p1 = pt[i];
Point p2 = pt[(i + 1) % nCount];
if (p1.y == p2.y)
{
if (p.y == p1.y && p.x >= min(p1.x, p2.x) && p.x <= max(p1.x, p2.x))
return true;
continue;
}
if (p.y < min(p1.y, p2.y) || p.y > max(p1.y, p2.y))
continue;
double x = (double)(p.y - p1.y) * (double)(p2.x - p1.x) / (double)(p2.y - p1.y) + p1.x;
if (x > p.x)
nCross++;
else if (x == p.x)
return true;
}
if (nCross % 2 == 1)
return true;
return false;
}