КГ_3глава (1024106), страница 3

Файл №1024106 КГ_3глава (Компьютерная графика) 3 страницаКГ_3глава (1024106) страница 32017-07-12СтудИзба
Просмтор этого файла доступен только зарегистрированным пользователям. Но у нас супер быстрая регистрация: достаточно только электронной почты!

Текст из файла (страница 3)

Рис. 3.12. Количество циклов OneStep

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

Приведем запись алгоритма на языке C++. Этот пример взят из [32], незна­чительно усовершенствован и переработан для использования в среде Windows.

В программах функция LineFiii используется таким образом:

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

Рис. 3.13. Количество циклов LineFiii

Так же, но немного быстрее, работает функция FloodFiii API Windows. Раз­ница в быстродействии обусловлена тем, что для LineFiii мы использовали стандартные функции для интерфейса прикладных программ, a FloodFiii оптимизирована на системном уровне.

Алгоритмы заполнения, которые используют математическое описание контура

Математическим описанием контура фигуры может служить уравнение у = f(x) для окружности, эллипса или другой кривой. Для многоугольника (полигона) контур задается множеством координат вершин i, уi). Возможны и другие формы описания контура. В любом случае алгоритмы данного клас­са не предусматривают обязательное предварительное создание пикселов контура растра — контур может совсем не выводиться в растр. Рассмотрим некоторые из подобных алгоритмов заполнения.

Заполнение прямоугольников. Среди всех фигур прямоугольник заполнять наиболее просто. Если прямоугольник задан координатами противополож­ных углов, например, левого верхнего (x1, у1) и правого нижнего 2, у2), то­гда алгоритм может заключаться в последовательном рисовании горизон­тальных линий заданного цвета (рис. 3.14).

Рис. 3.14. Заполнение прямоугольника

Заполнение круга. Для заполнения круга можно использовать алгоритм вы­вода контура, который мы уже рассмотрели в разд. 3.2. В процессе выполне­ния этого алгоритма последовательно вычисляются координаты пикселов контура в границах одного октанта. Для заполнения надлежит выводить го­ризонтали, которые соединяют пары точек на контуре, расположенные сим­метрично относительно оси y (рис. 3.15).

Так же может быть построен и алгоритм заполнения эллипса.

Рис. 3.15. Заполнение круга

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

фигуры.

Рис. 3.16. Пример полигона

Рассмотрим один из наиболее популярных алгоритмов заполнения полигона. Его основная идея — закрашивание фигуры отрезками прямых линий. Наи­более удобно использовать горизонтали. Алгоритм представляет собою цикл вдоль оси у, в ходе этого цикла выполняется поиск точек сечения линии кон­тура с соответствующими горизонталями. Этот алгоритм получил назва­ние XY [33]:

1. Найти min{y±} и юах{у±} среди всех вершин Pi.

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

{

3. Нахождение точек пересечения всех отрезков контура

с горизонталью у. Координаты xj точек сечения записать в массив.

4. Сортировка массива { xj } по возрастанию x.

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

Рис. 3.17. Заполнение полигона

При нахождении точек пересечения горизонтали с контуром необходимо принимать во внимание особые точки. Если горизонталь имеет координату (у), совпадающую с уi вершины Р I тогда надлежит анализировать то, как горизонталь проходит через вершину. Если горизонталь при этом пересекает контур, как, например, в вершинах Ро или Р4, то в массив записывается одна точка сечения. Если горизонталь касается вершины контура (в этом случае вершина соответствует локальному минимуму или максимуму как, например, в вершинах P1 , P2, , Р3 или Р5), тогда координата точки касания или не записы­вается, или записывается в массив два раза. Это условие четности количества точек пересечения, хранящихся в массиве { xj }.

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

ymin + 1.5, .... . ymax - 0,5.

Но такое упрощение процедуры нахождения точек пересечения приводит к искажению формы полигона.

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

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

где ymax , ymin — диапазон координат у, Nгор — число тактов, необходимых

для одной горизонтали.

Оценим величину Nsop как пропорциональную числу вершин

где к — коэффициент пропорциональности, п — число вершин полигона. Возможны модификации приведенного алгоритма для ускорения его работы. Например, можно принять во внимание то, что каждая горизонталь в боль­шинстве случаев пересекает небольшое количество ребер контура. Поэтому если при поиске точек сечения делать предварительный отбор ребер, которые находятся вокруг каждой горизонтали, то можно добиться уменьшения коли­чества тактов работы с Nгор = к п до к пр, где пр — число отобранных ребер. Например, разделим диапазон ymin - ymax пополам. Если для диапазона от ymin до уср составить список отрезков (или вершин), которые попадают в этот диапазон, то в этот список будет включено приблизительно вдвое меньшее количество, чем для всего диапазона от ymin до утax. Почему приблизитель­но — ибо это зависит от формы полигона. Таким образом, при работе алго­ритма для каждой горизонтали в диапазоне ymin до уср уже нужно не кп так­тов, а ~ к -п/2.

Аналогично для диапазона усрymax также можно составить список ребер, который также будет почти вдвое меньшим. Если принять, что подсчеты для каждой горизонтали теперь выполняются за вдвое меньшее количество так­тов, а именно за (Nгор /2), то общее число тактов:

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

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

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

3.6. Стиль линии. Перо

Что общее и что разное у объектов, изображенных на рис. 3.18?

Рис. 3.18. Примеры стилей линий

Общее — линия оси, описывающая каждый из восьми объектов. Разное — элементы вдоль линии оси. Для описания различных по виду изображений на основе линий используют термин стиль линий или перо. Термин перо ино­гда делает более понятной суть алгоритма вывода линий для некоторых сти­лей — в особенности для толстых линий. Например, если для тонкой непре­рывной линии перо соответствует одному пикселу, то для толстых линий пе­ро можно представить себе как фигуру или отрезок линии, который скользит вдоль оси линии, оставляя за собой след (табл. 3.1).

Таблица 3.1

Алгоритмы вывода толстой линии

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

Вывод пиксела (х, у)

Можно представить себе такой алгоритм, как цикл, в котором определяются координаты (х,у) каждого пиксела. Этот алгоритм можно модифицировать для вывода толстой линии следующим образом:

Характеристики

Тип файла
Документ
Размер
449,5 Kb
Тип материала
Высшее учебное заведение

Список файлов книги

Свежие статьи
Популярно сейчас
А знаете ли Вы, что из года в год задания практически не меняются? Математика, преподаваемая в учебных заведениях, никак не менялась минимум 30 лет. Найдите нужный учебный материал на СтудИзбе!
Ответы на популярные вопросы
Да! Наши авторы собирают и выкладывают те работы, которые сдаются в Вашем учебном заведении ежегодно и уже проверены преподавателями.
Да! У нас любой человек может выложить любую учебную работу и зарабатывать на её продажах! Но каждый учебный материал публикуется только после тщательной проверки администрацией.
Вернём деньги! А если быть более точными, то автору даётся немного времени на исправление, а если не исправит или выйдет время, то вернём деньги в полном объёме!
Да! На равне с готовыми студенческими работами у нас продаются услуги. Цены на услуги видны сразу, то есть Вам нужно только указать параметры и сразу можно оплачивать.
Отзывы студентов
Ставлю 10/10
Все нравится, очень удобный сайт, помогает в учебе. Кроме этого, можно заработать самому, выставляя готовые учебные материалы на продажу здесь. Рейтинги и отзывы на преподавателей очень помогают сориентироваться в начале нового семестра. Спасибо за такую функцию. Ставлю максимальную оценку.
Лучшая платформа для успешной сдачи сессии
Познакомился со СтудИзбой благодаря своему другу, очень нравится интерфейс, количество доступных файлов, цена, в общем, все прекрасно. Даже сам продаю какие-то свои работы.
Студизба ван лав ❤
Очень офигенный сайт для студентов. Много полезных учебных материалов. Пользуюсь студизбой с октября 2021 года. Серьёзных нареканий нет. Хотелось бы, что бы ввели подписочную модель и сделали материалы дешевле 300 рублей в рамках подписки бесплатными.
Отличный сайт
Лично меня всё устраивает - и покупка, и продажа; и цены, и возможность предпросмотра куска файла, и обилие бесплатных файлов (в подборках по авторам, читай, ВУЗам и факультетам). Есть определённые баги, но всё решаемо, да и администраторы реагируют в течение суток.
Маленький отзыв о большом помощнике!
Студизба спасает в те моменты, когда сроки горят, а работ накопилось достаточно. Довольно удобный сайт с простой навигацией и огромным количеством материалов.
Студ. Изба как крупнейший сборник работ для студентов
Тут дофига бывает всего полезного. Печально, что бывают предметы по которым даже одного бесплатного решения нет, но это скорее вопрос к студентам. В остальном всё здорово.
Спасательный островок
Если уже не успеваешь разобраться или застрял на каком-то задание поможет тебе быстро и недорого решить твою проблему.
Всё и так отлично
Всё очень удобно. Особенно круто, что есть система бонусов и можно выводить остатки денег. Очень много качественных бесплатных файлов.
Отзыв о системе "Студизба"
Отличная платформа для распространения работ, востребованных студентами. Хорошо налаженная и качественная работа сайта, огромная база заданий и аудитория.
Отличный помощник
Отличный сайт с кучей полезных файлов, позволяющий найти много методичек / учебников / отзывов о вузах и преподователях.
Отлично помогает студентам в любой момент для решения трудных и незамедлительных задач
Хотелось бы больше конкретной информации о преподавателях. А так в принципе хороший сайт, всегда им пользуюсь и ни разу не было желания прекратить. Хороший сайт для помощи студентам, удобный и приятный интерфейс. Из недостатков можно выделить только отсутствия небольшого количества файлов.
Спасибо за шикарный сайт
Великолепный сайт на котором студент за не большие деньги может найти помощь с дз, проектами курсовыми, лабораторными, а также узнать отзывы на преподавателей и бесплатно скачать пособия.
Популярные преподаватели
Добавляйте материалы
и зарабатывайте!
Продажи идут автоматически
6384
Авторов
на СтудИзбе
308
Средний доход
с одного платного файла
Обучение Подробнее