Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

ALL

.pdf
Скачиваний:
240
Добавлен:
12.02.2018
Размер:
15.74 Mб
Скачать

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

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

Радикальным решением для упрощения поиска точек сечения – смещение координат вершин контура или горизонталей заполнения так, чтобы ни одна горизонталь не попала в вершину.

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

ymin + 0.5, ymin - 1.5, ymax - 0.5.

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

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

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

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

Nтактов (ymax – ymin)Nгор

Где ymax, ymin – диапазон координат y, Nгор – число тактов, необходимых для одной горизонтали.

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

Nгор k n

Где k – коэффициент пропорциональности, n – число вершин полигона.

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

контура

Возможны модификации алгоритма для ускорения его работы.

1.Например, можно учесть, что каждая горизонталь в большинстве случаев пересекает небольшое количество ребер контура.

И при поиске точек сечения делать предварительный отбор ребер, которые находятся вокруг горизонтали, тогда количеств тактов уменьшается с Nгор = kn до knр, где nр – число ребер.

2. Например, разделим диапазон ymin – ymax пополам.

Если для диапазона от ymin, до yср составить список отрезков (или вершин), которые попадают в этот диапазон, то в этот список будет включено приблизительно (зависит от формы полигона) вдвое меньшее количество, чем для всего диапазона от ymin до ymax.

Тогда для каждой горизонтали в диапазоне от ymin, до yср нужно не kn тактов, а kn /2.

Аналогично для диапазона yср – ymax можно составить список ребер, который также будет почти вдвое меньшим.

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

общее число тактов:

Nтактов:=( ymax – ymin ) Nгор /2 + Nдоп.

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

Алгоритм эффективен для большого количества вершин.

Делить можно не только пополам, но и на большее число частей — соответственно повышается скорость.

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

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

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

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

СТИЛЬ ЛИНИИ. ПЕРО

Таблица

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

Общее — линия оси, описывающая каждый из объектов.

Разное – элементы вдоль линии оси. Для описания различных по виду изображений на основе линий используют термин стиль линий или перо.

для тонкой непрерывной линии перо соответствует одному пикселю

для толстых линий перо – фигура или отрезок линии, который скользит вдоль оси линии, оставляя за собой след (табл.).

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

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

- - - - -

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

- - - - -

Пусть – это цикл, в котором определяются координаты (х,у) каждого пикселя.

Можно модифицировать алгоритм для вывода толстой линии :

- - - - -

Вывод фигуры (или линии) пера с центром (х, у)

- - - - -

Вместо вывода отдельного пикселя – вывод фигуры или линии, соответствующей перу (прямоугольник, круг, отрезок прямой).

Такой подход к разработке алгоритмов толстых линий имеет преимущества и недостатки.

Преимущество — можно прямо использовать эффективные алгоритмы для вычисления координат точек линии оси, например, Брезенхема.

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

многократно в одних и тех же точках (рис.).

Рис. Прямоугольное и круглое перья работают избыточно

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

2.Алгоритм более эффективен для перьев в виде отрезков линий. Каждый пиксель рисуется только один раз. Важен наклон изображаемой линии. Ширина пера зависит от наклона (рис).

Горизонтальное перо не может

рисовать толстую горизонталь

Рис. Перья в виде отрезков линий

Для вывода толстых линий с помощью пера чаще всего используются отрезки горизонтальной или вертикальной линий, реже — диагональные отрезки под углом 45 градусов.

Причина – большая скоростью вывода горизонтальных и вертикальных отрезков прямой.

Для минимального количества тактов вывода, толстые линии, которые по наклону ближе к вертикальным, рисуют горизонтальным пером, а пологие линии — вертикальным пером.

При выводе толстых линий с использованием пера-отрезка линии заметны разрывы в углах полилиний и «плохие» концы (рис.).

Рис. Вывод толстых линий с

использованием пера-отрезка

Конец не перпендикулярен линии

Излом

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

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

(рис.).

P5

Рис. 3.22.Пример толстой полилинии

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

3.Третья разновидность алгоритмов вывода толстых линий — рисование толстой линии последовательным наложением нескольких тонких линий, смещенных относительно друг друга.

Алгоритмы вывода пунктирной линии

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

------------------------

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

--------------------------

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

--------------------------------------------

Проверка значения счетчика С :

Если С удовлетворяет некоторым условиям,

то вывод пикселя {х, у). Значение С увеличивается на единицу

---------------------------------------------

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

Логическое условие будет определять стиль линии.

Например, если условием будет четность значения С, то получим линию из одиночных точек.

Для рисования пунктирной линии можно анализировать остаток от деления С на 8.

Например, если рисовать пиксели линии только тогда, когда C mod S < 8/2, то получим пунктирную линию с длиной штрихов 8/2 и с шагом 8.

Алгоритмы вывода пунктирной линии

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

Иначе будут нестыковки пунктира.

Использование переменной-счетчика затруднено при генерации пунктирных линий в алгоритмах, которые используют симметрию, например, при выводе круга или эллипса.

В этом случае будут нестыковки пунктира на границах октантов или квадрантов.

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

Объединив алгоритм для вывода толстой непрерывной линии и алгоритм для тонкой пунктирной линии, можно получить следующий алгоритм:

------------------

Проверка значения счетчика (С) :

Если (С) удовлетворяет условию, то

вывод фигуры (линии) пера С центром в (х, y)

C = C + 1;

-----------------

На практике возможны и более сложные алгоритмы.

Стиль заполнения. Кисть. Текстура

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

Понятие текстуры используется для трехмерных объектов, а кисть — для двумерных объектов.

Текстура — это стиль заполнения, закрашивание, которое имитирует сложную рельефную объемную поверхность, выполненную из какого-то материала.

Описание разновидностей подобных алгоритмов можно дать с помощью обобщенной схемы:

-----------------------

Вывод пикселя заполнения цвета C с координатами (х, у)

----------------------

Например, в алгоритме вывода полигонов пиксели заполнения рисуются в теле цикла горизонталей, а все другие операции предназначены для подсчета координат (х, у) пикселей.

Сплошное заполнение означает, что цвет (С) всех пикселей одинаков, С = const.

Для узора задаем C как функцию:

--------------------

 

C = f (x, y)

Рис. Матовая

Вывод пикселя заполнения (x, y) с цветом C

поверхность

---------------------

 

Функция f (x, y) будет определять стиль заполнения.

Аргументами функции цвета являются координаты текущего пикселя заполнения.

В отдельных случаях эти аргументы не нужны.

Например, если цвет C вычислять как случайное значение в определенных границах: C = random (), то получим иллюзию шершавой матовой поверхности (рис).

Стиль заполнения. Кисть. Текстура

Другой стиль заполнения – штриховка (рис.).

Для него функцию цвета также можно записать

в аналитической форме:

• Рис. Штриховка

где S – период, а T – толщина штрихов, Cш – цвет штрихов, Cф – цвет фона. Если не рисовать пиксели фона, то получим полупрозрачную фигуру. Подобную функцию можно записать и для других типов штриховки.

Часто используется копирование небольших растровых изображений.

Алгоритм заполнения можно описать вышеупомянутой схемой, если строку C = f (x, y) заменить двумя другими строками:

---------------------

Координаты пикселя заполнения (x, y) преобразуем в растровые координаты образца кисти (xT, yT)

По координатам (xT, yT) определим цвет пикселя (C) в образце кисти

Вывод пикселя заполнения цвета C с координатами (x, y)

---------------------

Преобразование координат пикселя заполнения (х, у) в координаты внутри образца кисти :

хT = x mod m,

yT = у mod n,

где т, n — размеры растра кисти соответственно по горизонтали и вертикали.

Координаты (хT, уT) будут в диапазоне хT = 0... т – 1, уT = 0...n - при любых значениях х и у.

Соседние файлы в предмете Компьютерная Графика