Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лекции 6-10.DOC
Скачиваний:
1
Добавлен:
01.03.2025
Размер:
833.54 Кб
Скачать

Алгоритм заполнения с упорядоченным списком ребер

В компьютерной графике генерацию сплошных областей называют заполнением (закраской) многоугольников (контуров). Алгоритмы заполнения с упорядоченным списком ребер относятся к группе методов «растровой развертки». В таких алгоритмах для всех ребер многоугольника, за исключением горизонтальных, в произвольной последовательности определяются точки их пересечения с осями сканирующих строк, сдвинутыми по оси y на пол пикселя вверх относительно координат адресуемых точек соответствующих рядов пикселей. Следуя вдоль каждой сканирующей строки, имеющей такие пересечения, от ее начала к концу, сортируют точки пересечения попарно. Интервалы между точками пересечения, входящими в пары, заполняются цветом многоугольника. Для интервалов между этими парами пересечений и крайних (от начала строки до первого пересечения и от последнего пересечения до конца строки) используется фоновый цвет.

При задании многоугольника целочисленными координатами его вершин возможный вариант последовательности действий алгоритма заполнения с упорядоченным списком ребер такова:

  • определить для каждого ребра многоугольника точки пересечений с осями сканирующих строк (горизонтальные ребра игнорировать); если ось сканирующей строки с вертикальной координатой y0 пересекает ребро с вершинами P1 (x1 , y1) и P2 (x2 , y2), горизонтальная координата точки пересечения определяется по формуле ;

  • занести каждое пересечение (x, y + 0,5) в список;

  • отсортировать список по строкам (сверху вниз) и по возрастанию x в строке – (x1 , y1) предшествует (x2 , y2), если y1 > y2 или y1 = y2 и x1 < x2 ;

  • выделить из отсортированного списка пары элементов (x1 , y1) и (x2 , y2); при этом структура списка будет гарантировать, что в таких парах y1 = y2 и x1 < x2 ;

  • заполнить на соответствующих сканирующих строках пиксели с горизонтальными координатами x адресуемых точек, удовлетворяющих условию x1 x + 0,5 x2 на каждом интервале (т.е. пиксели, центры которых попадают в интервалы между выделенными парами точек пересечения).

При работе подобного алгоритма по заполнению, например, приведенного на рис.3 пятиугольника на оси сканирующей строки y0 = 3,5 будут выделены две пары точек: с x = 1,5 и x = 3,25; с x = 5 и x = 6,75. На самой сканирующей строке заполнятся пиксели с координатами адресуемых точек (1, 3), (2, 3), (5, 3) и (6, 3), т.к. для первых двух пикселей выполняется условие: 1,5 x + 0,5 3,25, а для вторых двух: 5 x + 0,5 6,75. Рис.3 иллюстрирует также полный результат работы алгоритма.

Д алее приведен возможный вариант такого алгоритма на псевдокоде (см. приложение 1). В нем используются следующие обозначения: M – число вершин многоугольника; Вершины – список целочисленных координат вершин; MinY и MaxY – наименьшая и наибольшая у-координаты вершин; уmin и уmax – наименьшая и наибольшая у-координаты обрабатываемого ребра; Пересечения – список, содержащий вещественные значения x точек пересечения ребер с осями сканирующих строк и соответствующие целочисленные значения y; N – общее число таких точек пересечения; Список – список x-координат точек пересечения на обрабатываемой строке, сортируемый в процессе обработки; xлев и xпр – левая и правая x-координаты интервала между парой точек пересечения, обрабатываемого в подпрограмме Интервал; Треб_знач – переменная, которая идентифицирует цвет заполняемого многоугольника.

Инициализация переменных

Вершины [M+1] = Вершины [1]

MinY = Вершины [1].y

MaxY = MinY

j = 0

Определение горизонтальных координат точек пересечения ребер с осями сканирующих строк; занесение их в список Пересечения вместе с целочисленными координатами y сканирующих строк; определение границ многоугольника по y

for i = 1 to M

if Вершины [i].y < > Вершины [i+1].y then

if Вершины [i].y < Вершины [i+1].y then

уmin = Вершины [i].y

уmax = Вершины [i+1].y

else

уmin = Вершины [i+1].y)

уmax = Вершины [i].y

end if

for y = уmin to уmax – 1

j = j + 1

Пересечения [ j].x = (Вершины [i+1].x Вершины [i].x) /

(Вершины [i+1].y – Вершины [i].y) *

( y + 0.5 – Вершины [i].y) + Вершины [i].x

Пересечения [ j].y = y

if MinY > уmin then MinY = уmin

if MaxY < уmax then MaxY = уmax

next y

end if

next i

N = j

Получили список Пересечения всех точек пересечения (значения x – вещественные, y – целые); число элементов – N

Построчная обработка точек пересечения с сортировкой их по x и заполнением интервалов между парами пересечений

for y = MaxY – 1 to MinY step –1

j = 0

for i = 1 to N

if Пересечения [i].y = y then

j = j + 1

Список [ j].x = Пересечения [i].x

end if

if j = 1 go to 1

k = j

while (Список [k].x < Список [k–1].x)

Врем = Список [k].x

Список [k].x = Список [k–1].x

Список [k–1].x = Врем

k = k – 1

if k = 1 go to 1

end while

1 next i

Получили список x-координат точек пересечения в текущей строке с сортировкой по возрастанию; выходное значение j – число пересечений

Заполнение интервалов между парами пересечений

for i = 1 to j – 1 step 2

call Интервал (Список [i].x, Список [i+1].x, y)

next i

next y

finish

Подпрограмма заполнения интервала между парой точек пересечения

subroutine Интервал (xлев , xпр , y)

Определение x-координаты самого левого пикселя в строке, удовлетворяющего условию xлев x + 0.5

x = Integer (xлев + 0.5)

if x = xлев + 0.5 then x = x – 1

while (x + 0.5 xпр)

Пиксель (x, y) = Треб_знач

x = x + 1

end while

return