Тест принадлежности точки многоугольнику

Заполнение многоугольника в порядке сканирования строк

Растровая развертка в реальном времени

Можно разработать более эффективный тест на принадлежность внутренней части, если воспользоваться тем фактом, что соседние пикселы, вероятно, имеют одинаковые характеристики (кроме пикселов граничных ребер). Это свойство называется пространственной когерентностью. Для растровых графических устройств соседние пикселы на сканирующей строке, вероятно, имеют одинаковые характеристики. Это когерентность растровых строк.

Обозначим ребра простого многоугольника на рис..10. P1P2, P2P3,..., PnP1. Пусть A(x, y) - точка, не лежащая на ломаной и нужно определить, принадлежит она многоугольнику или нет.

Проведем через точку горизонтальную полупрямую с правым концом в точке. Отметим на ней точку Q, которая заведомо не принадлежит многоугольнику.

В результате возникают следующие варианты:

  1. Нет пересечений с многоугольником ==> точка А внешняя (точка 1).
  2. Нечетное число пересечений ==> точка А внутренняя (точки 3 и 4).
  3. Четное число пересечений ==> точка А внешняя (точка 5).

Точное определение тех пикселов, которые должны активироваться, требует некоторой осторожности. Рассмотрим простой прямоугольник, изображенный на рис. 2.11. Прямоугольник имеет координаты (1,1) (5,1), (5,4), (1,4). Сканирующие строки с 1 по 4 имеют пересечения с ребрами многоугольника при х = 1 и 5. Вспомним, что пиксел адресуется координатами своего левого нижнего угла, значит, для каждой из этих сканирующих строк будут активированы пикселы с x-координатами 1, 2, 3, 4 и 5. На рис. 2.11,а показан результат. Заметим, что площадь, покрываемая активированными пикселами, равна 20, в то время как настоящая площадь прямоугольника равна 12.

Модификация системы координат сканирующей строки и теста активации устраняет эту проблему, как это показано на рис. 2.11,b. Считается, что сканирующие строки проходят через центр строк пикселов, т. е. через середину интервала, как это показано на рис. 2.11,b. Тест активации модифицируется следующим образом:проверяется, лежит ли внутри интервала центр пиксела, расположенного справа от пересечения. Однако пикселы все еще адресуются координатами левого нижнего угла. Как показано на рис. 2.11,b, результат данного метода корректен. Перебирая все линии сверху вниз, мы получим заполнение в порядке сканирования строк.

Алгоритм можно улучшить, если повысить эффективность сортировки. Последнее достигается разделением сортировки по строкам в направлении y и сортировки в строке в направлении x с помощью групповой сортировки по y. Таким образом, развертка начинается до завершения


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: