Сталкинг GameDev-а

gamedev, разработка игр, графика

  • Добро пожаловать

Функция позволяет проверить попадание точки в замкнутую фигуру любой сложности. То есть, работает как для выпуклого так и для вогнутого многоугольника.

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