Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
shpory_po_KG.doc
Скачиваний:
3
Добавлен:
01.05.2025
Размер:
1.8 Mб
Скачать
  1. Учет вершин полигона?

При нахождении точек пересечения горизонтали с контуром необходимом принимать во внимание особые точки. Если горизонталь имеет координату у, совпадающую с уi вершины Рi, тогда надлежит анализировать то, как горизонталь проходит через вершину. Если горизонталь при этом пересекает контур, как, например, в вершинах P0 или Р4, то в массив записывается одна точка сечения. Если горизонталь касается вершины контура (в этом случае вершина соответствует локальному минимуму или максимуму как, например в вершинах P1, P2, P3 или P5), тогда координата точки касания или не записывается, или записывается в массив два раза. Это - условие четности количества точек пересечения, хранящихся в массиве X.

Процедура определения точек пересечения контура с горизонтальной разверткой, учитывая анализ на локальный максимум, может быть достаточно сложной. Это замедляет работу. Радикальным решением для упрощения поиска точек сечения может быть смещение координат вершин контура или горизонталей заполнения таким образом, чтобы ни одна горизонталь не попала в вершину. Смещение можно выполнять различными способами, например, ввести в растр дробные координаты для горизонталей: ymin + 1.5, …, ymax - 0.5. Отметим, что однако такое упрощение процедуры нахождения точек пересечения приводит к искажению формы полигона.

Для определения координат х точек пересечения для каждой горизонтали необходимо перебирать все п отрезков контура. Координата пересечения отрезка

рipk с горизонталью у равна

.

Количество тактов работы этого алгоритма определяется как:

где ymin , ymax диапазон координат у, Nгop число тактов, необходимых для одной горизонтали. Если оценить величину Nгop как пропорциональную числу вершин, то

Nгop: k•п,

где k – коэффициент пропорциональности, п – число вершин полигона.

  1. Ускорение работы алгоритма?

Возможны модификации приведенного алгоритма для ускорения его работы. Например, можно принять во внимание то, что каждая горизонталь в большинстве случаев пересекает небольшое количество ребер контура. Поэтому если при поиске точек сечения делать предварительный отбор ребер, которые находятся вокруг каждой горизонтали, то можно добиться уменьшения количества тактов работы с Nгop: k•п до k nр, где nр число отобранных ребер. Например, разделим диапазон (ymin - ymax) пополам. Если для диапазона от (ymin - yср) составить список отрезков (или вершин), которые попадают в этот диапазон, то в этот список будет включено приблизительно вдвое меньшее количество, чем для исходного диапазона. Приблизительность в данном случае ибо это зависит от формы полигона.

Аналогично для диапазона (усрутах) также можно составить список ребер, который также будет почти вдвое меньшим. Теперь общее число тактов будет

где Nдоп – количество тактов для создания списка ребер.

Такой способ повышения быстродействия эффективен для большого количества вершин. Контур можно делить не пополам, а на более мелкие части – соответственно повышается скорость.

Приведенные выше алгоритмы заполнения могут быть использованы не только для рисования фигур. На основе алгоритмов заполнения могут быть разработаны алгоритмы для других целей, как например, для определения площади фигуры, если считать площадь пропорциональной количеству пикселов заполнения, или для поиска объектов по внутренней точке – эта операция часто используется в векторных графических редакторах. I

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]