Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
шпоры по кг2 2009.doc
Скачиваний:
0
Добавлен:
01.03.2025
Размер:
1.05 Mб
Скачать

Заполнение областей.

Область может быть задана следующим образом:

  1. гранично – определенная область – описаны пикселы, лежащие на границе области.

  2. внутри – определенная область – пикселы лежат внутри области.

  3. область представляет из себя многоугольник с заданным списком вершин.

С 1) и 2) связано понятие связность.

Область называется четырехсвязной, если из одного пиксела в соседний можно попасть 4-мя движениями:    .

Область восьмисвязная, если в соседний пиксел может попасть из 8-ми положений, ещё по диагонали.

П ример: 4-связн.

Простейший алгоритм заполнения

8-ми связной области гранично-

опред.

Fill (x, y, new, border)

x – точка

new – новый цвет

border – цвет границы

if

end if

end.

Минусы: алгоритм глубоко рекурсывный, за каждый проход закрашивается один пиксел.

Пусть область считаем совокупностью горизонтальных интервалов ……. и запрашиваем строку целиком. Полосы сверху и снизу от закрашенной полосы могут быть либо граничные, либо внутренние. После того, как полоса закрашена , над ней и под ней ищем внутренние пикселы, если находим, то ищем самый правый и его используем в качестве зат-равки? на на следующей итерации.

3) Заполнение обл. с заданным списком вершин.

Есть многоугольник.

Закраска его в два этапа:

  1. нужно произвести отсечение многоугольника по границам поля вывода

  2. закрасить что осталось

Алгоритм отсечения многоугольников Сазерленда – Нодмана : последовательно производим отсечение многоугольника по всем 4-м границам поля вывода.

С каждым ребром относительно границ м.б 4 случая:

т. Р - начальная

т.S – конечная

  1. внутри области – к выходному списку вершин добавляем т.S

  1. внутри снаружи

3) вне области

4) внутри вне области

На входе массив из вершин V1….Vn

Построить выодной список вершин:

1.Шаг

for c=1 to n S=Vi

if inside (S)  { if т.S находится внутри области}

if inside (P)

output (S) {это 1)}

else

q = intessed (P,S)

output (q)

output (S)

end if

else

if inside (P)

q = intessed (P,S)

output (q)

end if

end if

P = S

end for

П усть есть:

Граница области задана отрезком P1P2:

Векторное произведение : на нас

от нас

если от нас, то коор-та z – отрицательная

если на нас, то коор-та z - положительная

z – коор-та будет равна:

если полож. , то z внутри области.