Функция позволяет проверить попадание точки в замкнутую фигуру любой сложности. То есть, работает как для выпуклого так и для вогнутого многоугольника.
static bool PointInPolygon(Point p, Point[] poly)
{
Point p1, p2;
bool inside = false;
if (poly.Length < 3)
{
return inside;
}
Point oldPoint = new Point(
poly[poly.Length - 1].X, poly[poly.Length - 1].Y);
for (int i = 0; i < poly.Length; i++)
{
Point newPoint = new Point(poly[i].X, poly[i].Y);
if (newPoint.X > oldPoint.X)
{
p1 = oldPoint;
p2 = newPoint;
}
else
{
p1 = newPoint;
p2 = oldPoint;
}
if (
(newPoint.X < p.X) == (p.X <= oldPoint.X)
&&
( p.Y - p1.Y)* (p2.X - p1.X)
<
( p2.Y - p1.Y)* (p.X - p1.X)
)
{
inside = !inside;
}
oldPoint = newPoint;
}
return inside;
}