Окт 13

Многоугольники

Прямоугольник является частным случаем многоугольника. Для рисования произвольного многоугольника предназначена функция Polygon:
BOOL PolygonCHDC hdc. CONST POINT IpPoints, int nCount);
Работа этой функции напоминает рисование ломаных линий функцией Polyline. Второй параметр функции принимает адрес массива точек, а третий — количество точек. В отличие от Polyline, функция Polygon автоматически замыкает фигуру. В случае использования геометрического пера функция Polygon, так же как и Polyline, оформляет каждую вершину в соответствии с атрибутом соединения.
Для выпуклых многоугольников внутренняя область определяется достаточно четко. Однако невыпуклый многоугольник может состоять из нескольких частей, как, например, пятиконечная звезда, что затрудняет определение его внутренней области. Такие же проблемы могут возникнуть при перекрытии одного многоугольника другим. В связи с этим Win32 GDI предусматривает два режима заполнения многоугольников: режим ALTERNATE и режим WINDING. Контекст устройства содержит соответствующий атрибут, который можно изменять, вызывая функцию SetPolyFillMode. По умолчанию установлен режим заполнения многоугольников ALTERNATE.
В режиме ALTERNATE принадлежность некоторой точки внутренней области определяется при помощи довольно простого алгоритма:
1. Проведем мысленно горизонтальную линию сканирования через интересующую нас точку.
2. Пронумеруем точки пересечения этой линии с встречающимися на ее пути линиями многоугольника.
3. Если интересующая нас точка лежит между нечетным и четным пересечениями, то она принадлежит внутренней области многоугольника.
В режиме WINDING принадлежность некоторой точки внутренней области определяется с учетом направления рисования сторон многоугольника по следующему алгоритму:
1. Проведем мысленно горизонтальную линию сканирования через интересующую нас точку.
2. Установим нулевое значение счетчика count до первого пересечения этой линии с многоугольником.
3. При каждом следующем пересечении линии многоугольника анализируем направление рисования этой линии по отношению к линии сканирования. Если это направление по часовой стрелке, то значение счетчика count увеличивается на единицу, если против часовой стрелки, то уменьшается на единицу.
4. Если текущее значение счетчика count больше нуля, то точка принадлежит внутренней области, в противном случае точка считается внешней.