КГ_3глава (1024106), страница 4
Текст из файла (страница 4)
Вместо вывода отдельного пиксела стоит вывод фигуры или линии, соответствующей перу — прямоугольник, круг, отрезок прямой.
Такой подход к разработке алгоритмов толстых линий имеет преимущества и недостатки. Преимущество— можно прямо использовать эффективные алгоритмы для вычисления координат точек линии оси, например, алгоритмы Брезенхэма. Недостаток — неэффективность для некоторых форм пера. Для перьев, которые соответствуют фигурам с заполнением, количество тактов работы алгоритма пропорционально квадрату толщины линии. При этом большинство пикселов многократно закрашивается в одних и тех же точках (рис. 3.19).
Рис. 3.19. Прямоугольное и круглое перья работают избыточно
Такие алгоритмы более эффективны для перьев в виде отрезков линий. В этом случае каждый пиксел рисуется только один раз. Но здесь важным является наклон изображаемой линии. Ширина пера зависит от наклона ;рис. 3.20).
Очевидно, горизонтальное перо не может рисовать толстую горизонтальную
1ИНИЮ.
Рис. 3.20. Перья в виде отрезков линий
Для вывода толстых линий с помощью пера в качестве отрезка линии чаще всего используются отрезки горизонтальной или вертикальной линий, реже — диагональные отрезки под углом 45 градусов. Целесообразность использования такого способа определяется большой скоростью вывода горизонтальных и вертикальных отрезков прямой. Для того чтобы достигнуть минимального количества тактов вывода, толстые линии, которые по наклону ближе к вертикальным, рисуют горизонтальным пером, а пологие линии — вертикальным пером.
При выводе толстых линий с использованием пера-отрезка линии заметны разрывы в углах полилиний и плохие концы (рис. 3.21).
Рис. 3.21. Вывод толстых линий с использованием пера-отрезка
Для решения таких проблем иногда используют другие алгоритмы вывода толстых линий. Например, вывод толстой полилинии можно выполнить как рисование полигона с заполнением (рис. 3.22).
Рис. 3.22. Пример толстой полилинии
Очевидный недостаток такого подхода— меньшая скорость вывода, поскольку заполнение полигона — это существенно более трудоемкая задача, чем вывод линий, а кроме того, нужно еще определять координаты его вершин.
Третья разновидность алгоритмов вывода толстых линий — рисование толстой линии последовательным наложением нескольких тонких линий, смещенных одна относительно второй.
Алгоритмы вывода пунктирной линии
Алгоритм для рисования тонкой пунктирной линии можно получить из алгоритма вывода тонкой непрерывной линии
заменой процедуры вывода пиксела более сложной конструкцией:
В таком алгоритме используется новая переменная (C — счетчик пикселов линии. Если значение С удовлетворяет некоторому логическому условию, то рисуется пиксел заданного цвета с текущими координатами (х, у). Логическое условие будет определять стиль линии. Например, если условием будет четность значения С, то получим линию из одиночных точек. Для рисования пунктирной линии можно анализировать остаток от деления С на S. Например, если рисовать пикселы линии только тогда, когда С mod S < S/2, то получим пунктирную линию с длиной штрихов S/2 и с шагом S.
При выводе полилиний, которые состоят из отрезков прямых, или сплайновых кривых, необходимо предотвратить обнуление значения счетчика в начале каждого отрезка и обеспечить продолжение непрерывного приращения вдоль всей сложной линии. Иначе будут нестыковки пунктира. Использование переменной-счетчика затруднено при генерации пунктирных линий в алгоритмах, которые используют симметрию, например, при выводе круга или эллипса. В этом случае будут нестыковки пунктира на границах октантов или квадрантов.
Алгоритм вывода толстой пунктирной линии
Объединив алгоритм для вывода толстой непрерывной линии и алгоритм дли тонкой пунктирной линии, можно получить следующий алгоритм:
Такой алгоритм достаточно прост. На практике используются и более изощренные алгоритмы.
3.7. Стиль заполнения. Кисть. Текстура
При выводе фигур могут использоваться различные стили заполнения. Для обозначения стилей заполнения, отличных от сплошного стиля, используют такие понятия, как кисть и текстура. Их можно считать синонимами, однако понятие текстуры обычно используется применительно к трехмерным объектам, а кисть — для изображения двумерных объектов. Текстура — это стиль заполнения, закрашивание, которое имитирует сложную рельефную объемную поверхность, выполненную из какого-то материала.
Для описания алгоритмов заполнения фигур с определенным стилем используем тот же способ, что и для описания алгоритмов рисования линий. Мы уже ранее рассмотрели некоторые алгоритмы заполнения, и вы, наверное, согласитесь, что описание всех разновидностей подобных алгоритмов можно дать с помощью такой обобщенной схемы:
Например, в алгоритме вывода полигонов пикселы заполнения рисуются в теле цикла горизонталей, а все другие операции предназначены для подсчета координат (x, у) этих пикселов. Сплошное заполнение означает, что цвет C всех пикселов одинаков, то есть C=const. Нам нужно как-то изменять цвет пикселов заполнения, чтобы получить определенный узор. Преобразуем алгоритм заполнения следующим образом:
Функция f(x,y) будет определять стиль заполнения. Аргументами функции цвета являются координаты текущего пиксела заполнения. Однако в отдельных случаях эти аргументы не нужны. Например, если цвет С вычислять как случайное значение в определенных границах: С = random (), то можно
создать иллюзию шершавой матовой поверхности (рис. 3.23).
Рис. 3.23. Матовая поверхность Рис. 3.24. Штриховка
Другой стиль заполнения — штриховой (рис. 3.24). Для него функцию цвета также можно записать в аналитической форме:
где S— период, а Г— толщина штрихов, Сш— цвет штрихов, Сф— цвет
фона.
Если не рисовать пикселы фона, то можно создать иллюзию полупрозрачной фигуры. Подобную функцию можно записать и для других типов штриховки. Аналитическая форма описания стиля заполнение позволяет достаточно просто изменять размеры штрихов при изменениях масштаба показа, например, для обеспечения режима WYSIWYG.
Зачастую при использовании кистей и текстур используется копирование небольших растровых изображений. Такой алгоритм заполнения можно описать вышеупомянутой общей схемой, если строку С=f(x, у) заменить двумя другими строками:
Преобразование координат пиксела заполнения (х, у) в координаты внутри образца кисти можно выполнить таким образом:
где т, п — размеры растра кисти соответственно по горизонтали и вертикали. При этом координаты (хт, yт) будут в диапазоне хт= 0...m - 1, ут= 0...п - 1 при любых значениях х и у. Таким образом, обеспечивается циклическое копирование фрагментов кисти внутри области заполнения фигуры (рис. 3.25).
Рис. 3.25. Копирование растра кисти
Удобно, когда размеры кисти равны степени двойки. В этом случае вместо операций взятия остатка (mod) можно использовать более быстродействующие для цифровых компьютеров поразрядные двоичные операции. Приведем пример вычисления остатка от деления на 16.
Здесь можно использовать поразрядную операцию & (И). Еще один пример. Если необходимо вычислить X mod 256, а значение X записано в регистре АХ микропроцессора (совместимого с 80x86), то в качестве результата достаточно взять содержимое младшей байтовой части этого регистра — AL.
Для пикселов текстур часто употребляется название тексел. Растровые текстуры и кисти широко используются в современной компьютерной графике, в том числе и в 3D-графике. Для отображения трехмерных объектов часто используются полигональные поверхности, каждая грань отображается с наложенной текстурой. Поскольку объекты обычно показываются с разных ракурсов — повороты, изменения размеров и тому подобное, то необходимо соответственно трансформировать и каждую грань с текстурой. Для этого используются проективные текстуры.
Общая схема алгоритма заполнения контуров полигонов для проективных ^текстур такая же, как и приведенная выше. Однако растровый образец здесь представляет всю грань, а преобразование координат из (x, у) в (хт, ут) более сложное, например, аффинное:
где коэффициенты А, В, ... , F — константы при пересчете координат всех пикселов для отдельной текстурированной грани. Такое преобразование координат можно использовать, если привязать текстуру к грани по трем опорным точкам. Пример наложения проективной текстуры приведен на рис. 3.26.
Рис. 3.26. Наложение проективной текстуры на две грани объекта Привязывание по трем точкам соответствует уравнениям:
где i = 1, 2, 3. По известным координатам (хТi, yТi и (хi, уi) можно найти коэффициенты А, В, ... , F, если решить систему линейных уравнений. Эта система распадается на две независимые системы третьего порядка. Для упрощения записи заменим хТi на Xi a yТi на Yi