Студопедия

КАТЕГОРИИ:


Архитектура-(3434)Астрономия-(809)Биология-(7483)Биотехнологии-(1457)Военное дело-(14632)Высокие технологии-(1363)География-(913)Геология-(1438)Государство-(451)Демография-(1065)Дом-(47672)Журналистика и СМИ-(912)Изобретательство-(14524)Иностранные языки-(4268)Информатика-(17799)Искусство-(1338)История-(13644)Компьютеры-(11121)Косметика-(55)Кулинария-(373)Культура-(8427)Лингвистика-(374)Литература-(1642)Маркетинг-(23702)Математика-(16968)Машиностроение-(1700)Медицина-(12668)Менеджмент-(24684)Механика-(15423)Науковедение-(506)Образование-(11852)Охрана труда-(3308)Педагогика-(5571)Полиграфия-(1312)Политика-(7869)Право-(5454)Приборостроение-(1369)Программирование-(2801)Производство-(97182)Промышленность-(8706)Психология-(18388)Религия-(3217)Связь-(10668)Сельское хозяйство-(299)Социология-(6455)Спорт-(42831)Строительство-(4793)Торговля-(5050)Транспорт-(2929)Туризм-(1568)Физика-(3942)Философия-(17015)Финансы-(26596)Химия-(22929)Экология-(12095)Экономика-(9961)Электроника-(8441)Электротехника-(4623)Энергетика-(12629)Юриспруденция-(1492)Ядерная техника-(1748)

Алгоритмы закрашивания




 

Будем считать фигурой плоский геометрический объект, который состоит из линий контура и точек внутри него. В общем виде алгоритм закрашивания произвольного контура, который уже нарисован в растре, предполагает выполнение следующих действий:

– находим пиксел внутри контура фигуры;

– цвет этого пиксела изменяем на нужный цвет заполнения;

– производим анализ соседних пикселов;

– если цвет некоторого соседнего пиксела не равен цвету границы контура или цвету заполнения, то цвет этого пиксела изменяется на цвет заполнения;

– анализируем цвет пикселов, соседних с предыдущим. Продолжаем этот процесс, до тех пор, пока внутри контура все пикселы не перекрасятся в цвет заполнения.

Простейший алгоритм закрашивания. Для всех алгоритмов закрашивания необходимо задавать начальную точку с координатами x 0, y 0 внутри контура. Простейший алгоритм может быть описан следующим образом [21, 24].

1. Определить x 0, y 0.

2. Выполнить процедуру Закрасить (x 0, y 0).

Процедура Закрасить (x, y) описана в виде:

если цвет пиксела (x,y) не равен цвету границы, то

установить для пиксела (x,y) цвет заполнения;

закрасить(x+1, y);

закрасить(x-1, y);

закрасить(x, y+1);

закрасить(x, y-1).

Такое определение процедуры является рекурсивным. Рекурсия позволяет упростить запись некоторых алгоритмов.


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

Волновые алгоритмы закрашивания. Суть подобных алгоритмов состоит в том, что для начальной точки (вершины на графе) находятся соседние точки (другие вершины), которые отвечают двум условиям: во-первых, эти вершины связаны с начальной; во-вторых, они еще не отмечены, т.е. рассматриваются впервые.

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

Относительно закрашивания растровых фигур вершинами графа являются пикселы, а отметка пройденных пикселов делается прямо в растре цветом закрашивания. Это почти полностью повторяет идею простейшего алгоритма, однако здесь не используется рекурсия, что обусловливает другую последовательность обработки пикселов при закрашивании.

Заполнение полигона. Контур полигона (в векторной форме) определяется вершинами, которые соединены отрезками прямых (рис. 9.6).

Один из наиболее популярных алгоритмов заполнения полигона заключается в закрашивании фигуры отрезками прямых горизонтальных линий. Алгоритм представляет собою цикл вдоль оси y, в ходе этого цикла выполняется поиск точек сечения линии контура с соответствующими горизонталями. Этот алгоритм имеет вид:

 

1. Найти min{yi} и max{yi} среди всех вершин Pi.

2. Выполнить цикл по y от y=min до y=max:

3. Найти точки пересечения всех отрезков контура с горизонталью y;

4. Координаты xj точек сечения записать в массив;

5. Отсортировать массив {xj} по возрастанию x;

6. Вывести горизонтальные отрезки с координатами

(x0, y) - (x1, y)

(x2, y) - (x3, y)

………………

(x2k, y) - (x2k+1, y)

Каждый отрезок выводится цветом заполнения.

В этом алгоритме использовано свойство топологии контура фигуры. Оно состоит в том, что любая прямая линия пересекает любой замкнутый контур четное число раз. Для выпуклых фигур существуют ровно две точки пересечения с любой прямой. Таким образом, на шаге 4 этого алгоритма в массив { xj } всегда должно записываться парное число течек сечения.

При нахождении точек пересечения горизонтали с контуром необходимо принимать во внимание особые точки. Если горизонталь имеет координату y, совпадающую с yi вершины Pi, тогда надлежит анализировать то, как горизонталь проходит через вершину. Если горизонталь при этом пересекает контур (как, например, в вершинах P 0 или P 4), то в массив записывается одна точка сечения. Если горизонталь касается вершины контура (в этом случае вершина соответствует локальному минимуму или максимуму, как, например, в вершинах P 1, P 2, P 3 или P 5), тогда координата точки касания или не записывается, или записывается в массив два раза. Это условие четности числа количества точек пересечения, хранящихся в массиве { xj }.

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

Для определения координат (x) точек пересечения для каждой горизонтали необходимо перебрать все n отрезков контура. Координаты пересечения отрезка pi-pk с горизонталью равны:

x = xi + (yk - y)(xk - xi) / (yk - yi).

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

 

9.3. Сглаживание ступенчатости линий на изображении

 

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

Идеализированный образ математической линии имеет постоянную толщину (1 единицу). Такой образ построить невозможно. В чистом виде алгоритм Брезенхема предполагает, что за каждый шаг перемещения по оси x засвечивается только один пиксел. Но можно поступить по другому – засвечивать те пикселы, которые частично перекрываются идеальным образом линии, но задавать им не полную интенсивность, а частичную, пропорциональную степени перекрытия [24].

Контрольные вопросы и задания

1. В чем принцип алгоритма ЦДА?

2. За счет чего достигается быстродействие в алгоритме Брезенхема?

3. Какими способами осуществляется закраска областей?

4. Как устраняется ступенчатость на изображении в системах компьютерной графики?




Поделиться с друзьями:


Дата добавления: 2015-04-25; Просмотров: 4383; Нарушение авторских прав?; Мы поможем в написании вашей работы!


Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет



studopedia.su - Студопедия (2013 - 2024) год. Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав! Последнее добавление




Генерация страницы за: 0.018 сек.