private static int PointInPolygon(Point[] path, Vector3 pt)
{
//returns 0 if false, +1 if true, -1 if pt ON polygon boundary
//See "The Point in Polygon Problem for Arbitrary Polygons" by Hormann & Agathos
//http://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.88.5498&rep=rep1&type=pdf
int result = 0, cnt = path.Length;
if (cnt < 3) return 0;
Point ip = path[0];
for (int i = 1; i <= cnt; ++i)
{
Point ipNext = (i == cnt ? path[0] : path[i]);
if (ipNext.Y == pt.Y)
{
if ((ipNext.X == pt.X) || (ip.Y == pt.Y && ((ipNext.X > pt.X) == (ip.X < pt.X))))
return -1;
}
if ((ip.Y < pt.Y) != (ipNext.Y < pt.Y))
{
if (ip.X >= pt.X)
{
if (ipNext.X > pt.X) result = 1 - result;
else
{
double d = (double) (ip.X - pt.X)*(ipNext.Y - pt.Y) - (double) (ipNext.X - pt.X)*(ip.Y - pt.Y);
if (d == 0) return -1;
else if ((d > 0) == (ipNext.Y > ip.Y)) result = 1 - result;
}
}
else
{
if (ipNext.X > pt.X)
{
double d = (double) (ip.X - pt.X)*(ipNext.Y - pt.Y) - (double) (ipNext.X - pt.X)*(ip.Y - pt.Y);
if (d == 0) return -1;
else if ((d > 0) == (ipNext.Y > ip.Y)) result = 1 - result;
}
}
}
ip = ipNext;
}
return result;
}