Компьютерная геометрия и графика 7 семестр_ 6.pptx
- Количество слайдов: 24
Компьютерная геометрия и графика Лекция 5 Алгоритмы заполнения многоугольников.
Заполнение областей Растровая развертка • Определение в порядке сканирования строк, лежит ли точка внутри многоугольника или контура. Эти алгоритмы обычно идут от "верха" многоугольника к "низу". Затравочное заполнение • Предполагается, что известна некоторая точка внутри контура. Ищут точки, соседние с ней и расположенные внутри контура. Если соседняя точка расположена не внутри контура, то обнаружена граница. Если точка расположена внутри, то она становится затравочной точкой и поиск продолжается рекурсивно.
Простейший способ заполнения многоугольника Простейший способ - определить принадлежит ли текущий пиксел внутренней части многоугольника. Если принадлежит, то пиксел заносится. Определить принадлежность пиксела многоугольнику можно, например, подсчетом суммарного угла с вершиной на пикселе при обходе контура многоугольника. Если пиксел внутри, то угол будет равен 360°, если вне - 0°.
Простейший способ заполнения многоугольника Затраты можно уменьшить путем вычисления прямоугольной оболочки. Использование прямоугольной оболочки иногда намного сокращает число проверяемых пикселей.
Растровая развертка сплошной области Для растровых устройств соседние пикселы часто имеют одинаковые характеристики. Это когерентность растровых строк. Характеристики пикселов на данной строке изменяются только там, где ребро многоугольника пересекает строку. Эти пересечения делят сканирующую строку на области.
Модификация системы координат сканирующей строки и теста активации Прямоугольник имеет координаты (1, 1) (5, 1), (5, 4), (1, 4). Площадь, покрываемая активированными пикселами, равна 20, а настоящая - 12. Сканирующие строки проходят через центр строк пикселов. Тест активации проверяет, лежит ли внутри центр пиксела, расположенного справа от пересечения.
Особенности пересечения со строками сканирования
Простой алгоритм с упорядоченным списком ребер Подготовить данные: • Определить для каждого ребра многоугольника точки пересечений со сканирующими строками, проведенными через середины интервалов. Горизонтальные ребра игнорируются. Занести каждое пересечение в список. Отсортировать список по строкам и по возрастанию х в строке. • Выделить из отсортированного списка пары элементов (x 1, у1) и (х2, у2). Структура списка гарантирует, что y = у1 = у2 и x 1<= x 2. Преобразовать в Активировать на сканирующей строке у пикселы для растровую целых значений x, таких, что x 1< x + 1/2 <= x 2. форму:
Простой алгоритм с упорядоченным списком ребер
Более эффективный алгоритм с упорядоченным списком ребер Подготовить данные: Преобразовать в растровую форму: • Определить для каждого ребра многоугольника точки пересечений со сканирующими строками, проведенными через середины интервалов Горизонтальные ребра не учитывать. Поместить координату y точки пересечения в группу, соответствующую у. Для каждой у -группы отсортировать список координат х точек пересечений в порядке возрастания. • Для каждой сканирующей строки выделить из списка координат х точек пересечений пары точек пересечений. Активировать на сканирующей строке у пикселы для целых значений х, таких, что x 1 <= x + 1/2 <= x 2.
Более эффективный алгоритм с упорядоченным списком ребер
Упорядоченный список ребер вместе с CAP Подготовить данные: Преобразовать в растровую форму: • Используя сканирующие строки определить для каждого ребра наивысшую сканирующую строку, пересекаемую ребром. Занести ребро многоугольника в соответствующую у -группу. Сохранить в связном списке начальное значение координат х точек пересечения, Dy - число сканирующих строк, пересекаемых ребром многоугольника, и Dx - шаг приращения по х при переходе от одной сканирующей строки к другой. • Для каждой строки проверить соответствующую у -группу на наличие новых ребер. Новые ребра добавить в CAP. Отсортировать координаты х точек пересечения из CAP в порядке возрастания. Выделить пары точек пересечений. Активировать у пикселы для целых значений х, таких, что x 1 <= x + 1/2 <= x 2. Для каждого ребра из CAP уменьшить Dy на 1. Если Dy < 0, то исключить данное ребро из CAP. Вычислить новое значение координат х точек пересечения хнов = xстар + Dx. Перейти к следующей строке.
Упорядоченный список ребер вместе с CAP
Упорядоченный список ребер вместе с CAP
Упорядоченный список ребер вместе с CAP
Общая схема алгоритма с САР 1. 2. 3. 4. Подготовить служебные целочисленные массивы Y-координат вершин и номеров вершин. Совместно отсортировать Y-координаты по возрастанию и массив номеров вершин для того, чтобы можно было определить исходный номер вершины. Определить пределы заполнения по оси Y Y_мin и Y_max. Стартуя с текущим значением Y_tek = Y_min, исполнять пункты 4 -9 до завершения раски. Определить число вершин, расположенных на строке Y_tek - текущей строке сканирования.
Общая схема алгоритма с САР 5. ◦ ◦ ◦ Если вершины есть, то для каждой из вершин дополнить список активных ребер, используя информацию о соседних вершинах. Для каждого ребра в список активных ребер заносятся: максимальное значение Y-координаты ребра, приращение X-координаты при увеличении Y на 1, начальное значение X-координаты. Если обнаруживаются горизонтальные ребра, то они просто закрашиваются и информация о них в список активных ребер не заносится. Если после этого обнаруживается, что список активных ребер пуст, то заполнение закончено.
Общая схема алгоритма с САР 6. 7. ◦ ◦ ◦ 8. 9. По списку активных ребер определяется Y_след - Y-координата ближайшей вершины. В цикле от Y_tek до Y_след: выбрать из списка активных ребер и отсортировать Xкоординаты пересечений активных ребер со строкой сканирования; определить интервалы и выполнить закраску; перевычислить координаты пересечений для следующей строки сканирования. Проверить не достигли ли максимальной Yкоординаты. Если достигли, то заливка закончена, иначе выполнить пункт. Очистить САР от ребер, закончившихся на строке Y_след и перейти к пункту 4.
Сортировка методом распределяющего подсчета Описания: int Max_число; /* Верхняя граница значений */ int *Повтор; /* Длина этого массива = Max_число */ int Кол_чисел; /* Кол-во сортируемых чисел */ int *Исходный_массив; /* Длина этого массива >= Кол_чисел */ int *Результат; /* Длина этого массива >= Кол_чисел */ int ii, jj, kk; /* Рабочие переменные */ Обнуляется служебный массив для подсчета числа повторений исходных кодов. for (ii=0; ii
Сортировка методом распределяющего подсчета Массив просматривается и вычисляется количество повторений каждого числа: for (ii= 0; ii < Кол_чисел; ++ii) { jj= Исходный_массив[ii]; Повтор[jj]= Повтор[jj] + 1; } Суммируется количество повторений каждого числа: jj= 0; for (ii=0; ii
Сортировка методом распределяющего подсчета Просматривается исходный массив и числа из него заносятся в массив результатов той же длины. Индекс занесения числа J в массив результатов равен значению J-го элемента массива Повтор. После занесения числа J значение Повтор[J] уменьшается на 1: for (ii= 0; ii < Кол_чисел; ++ii) { jj= Исходный_массив[ii]; kk= Повтор[jj]; Результат[kk]= jj; Повтор[jj]= Повтор[jj] - 1; }
1. 2. 3. 4. Построчный алгоритм заливки с затравкой для граничноопределенной области Координата затравки помещается в стек, затем до исчерпания стека выполняются пункты 2 -4. Координата очередной затравки извлекается из стека и выполняется максимально возможное закрашивание вправо и влево по строке с затравкой, т. е. пока не попадется граничный пиксел. Пусть это Хлев и Хправ, соответственно. Анализируется строка ниже закрашиваемой в пределах от Хлев до Хправ и в ней находятся крайние правые пикселы всех незакрашенных фрагментов. Их координаты заносятся в стек. То же самое проделывается для строки выше закрашиваемой.
Простой алгоритм для граничноопределенной 4 -х связной области Заливка выполняется следующим образом: ◦ определяется является ли пиксел граничным или уже закрашенным, ◦ если нет, то пиксел перекрашивается, затем проверяются и если надо перекрашиваются 4 соседних пиксела.
Итеративный алгоритм для гранично -определенной 4 -х связной области 1. 2. 3. 4. 5. 6. Поместить координаты затравки в стек Пока стек не пуст Извлечь координаты пиксела из стека. Перекрасить пиксел. Для всех четырех соседних пикселов проверить является ли он граничным или уже перекрашен. Если нет, то занести его координаты в стек.


