Определение, примеры, классификация, способы компьютерного описания и хранения 1 Графические примитивы Процесс создания графических объектов (геометрическое моделирование) на компьютере исследуемых конструкций и процессов является сложным алгоритмическим процессом, включающим в себя: выбор или разработку математической модели описания геометрических объектов; размещение геометрических объектов на сцене (в ограниченной пространственной прямоугольной системе координат); организацию движений графических объектов (анимацию); визуализацию модели. Модель обычно является упрощением оригинала, тем или иным его искажением. Модель можно представить как самостоятельное физическое изделие. Одним из первых действий при создании рисунка является описание составляющих частей изображаемой сцены. Элементами рисунка могут быть деревья и элементы ландшафта, мебель и стены, витрины магазинов и участки улицы, автомобили и рекламные щиты, атомы и молекулы или звезды и галактики. Для каждого типа сцены нужно описать структуру отдельных предметов и координаты их расположения. Функции графического пакета, которые используются для описания различных элементов рисунка, называются графическими примитивами или просто примитивами. Примитивы, описывающие геометрию объекта, как правило, называют геометрическими примитивами. Графические редакторы содержат библиотеки геометрических примитивов – точки, линии, конические сечения, сплайновые кривые и поверхности, плоскости, поверхности второго порядка, простейшие геометрические тела (куб, параллелепипед, сфера, цилиндр, конус, тор и пр.). Из исходных примитивов можно составить более сложные по геометрической форме графические объекты. Из геометрических примитивов формируются детали, из деталей – объекты, а из объектов – сцены. Таким образом, элементы, из которых составляется графический объект, считаются примитивами для этого объекта. 2 Системы координат Чтобы описать рисунок, сначала выбирается удобная декартова система координат, которая называется внешней системой координат и может быть либо двух-, либо трехмерной. Затем описываются предметы на рисунке, для чего с помощью значений внешних координат точек задаются их геометрические спецификации. Прямолинейных отрезок определяется положениями двух его концов, а многоугольник описывается набором координат его вершин. Значения координат хранятся в описании сцены вместе с остальной информацией об объектах, такой как их цвет и координатные границы, т.е. минимальные и максимальные значения координат x, y и z для каждого объекта. Набор координатных границ называют также ограничивающим прямоугольником данного объекта. Затем объекты изображаются – информация о сцене передается стандартным процедурам визуализации, которые определяют видимые поверхности и отображают их на экране монитора. 3 Экранные координаты После того как в выбранной (удобной) внешней системе координат задана геометрия рисунка, примитивы, с помощью стандартных процедур визуализации, проектируются на двухмерную плоскость, соответствующую области изображения устройства вывода, и происходит преобразование внешних координат в целочисленные координаты положений пикселей. Местоположение на экране монитора выражается через целочисленные экранные координаты, которые соответствуют положениям пикселей в буфере кадра. Значения координат пикселей дают номер строки развертки (значение координаты y) и номер столбца (значение координаты x в этой строке развертки). При аппаратном выполнении таких процессов, как обновление экрана, как правило, положения пикселей отсчитываются от левого верхнего угла экрана. Тогда строкам развертки присваиваются значения от 0 (верхняя строка экрана) до какого-то целочисленного значения ymax (нижняя строка экрана), а положения пикселей в каждой строке развертки нумеруются от 0 до xmax в направлении слева направо. 4 Абсолютные и относительные координаты Все рассмотренные выше координаты являлись абсолютными координатами. Это означает, что задаются действительные положения точек в используемой системе координат. В некоторых графических пакетах положения точек можно также задавать с помощью относительных координат. Воспользовавшись этим способом, можно задавать координаты точки относительного последнего положения, к которому обращалась система (его называют текущим положением). Например, если точка с координатами (3, 8) – это последнее положение, к которому обращалась программа, то относительные координаты (2, -1) соответствуют абсолютным координатам (5, 7). В таком случае, перед тем, как задать какие-либо координаты для функций примитивов, используется дополнительная функция, устанавливающая текущее положение. Тогда, чтобы описать такой объект, как набор соединенных между собой прямолинейных отрезков, нужно задать только последовательность относительных координат (смещений) после того, как будет установлено текущее положение. Графические системы могут предлагать опции, позволяющие задавать положение точки с помощью либо относительных, либо абсолютных координат. 5 Виды примитивов Точка – это бесконечно малая величина, размещенная в определенном месте пространства. При ее визуализации на растровом устройстве физическая величина точки равна размеру пиксела на плоскости или воксела (единичного элемента изображения) в пространстве. Линия – это множество соприкасающихся друг с другом в определенном направлении точек. При ее отображении на растровом устройстве физическая толщина линии равна размеру пиксела на плоскости или размеру воксела в пространстве. Линия, описываемая линейной зависимостью, называется прямой, нелинейной – кривой. Линии могут быть замкнутыми (окружность, эллипс и пр.) и разомкнутыми (парабола, гипербола и пр.). Поверхность, описываемая линейной зависимостью, называется плоскостью; нелинейной зависимостью – кривой (криволинейной) поверхностью или просто поверхностью. Поверхность, линия пересечения которой плоскостью во всех возможных направлениях (т.е. линией, точки которой принадлежат одновременно плоскости и поверхности), является замкнутой, также называется замкнутой (например, поверхность сферы, эллипсоида и др.). Выделенная часть поверхности, имеющая ограничения в определенных направлениях, называется ограниченной. 6 Кривые При моделировании объектов, описании траекторий в анимации, построении графиков данных и функций, а также в других графических приложениях могут оказаться полезными функции построения различных кривых. Чаще всего встречаются такие кривые, как конические сечения, тригонометрические и показательные функции, распределения вероятности, полиномы общего вида и сплайны. Кривая линия на плоскости в большинстве случаев описывается либо уравнениями линии в неявной форме: f ( x, y ) 0, либо уравнениями линии в параметрической форме: P(t ) ( x(t ), y(t )). Важным понятием при моделировании является понятие ориентации линии. Используя это понятие, легко формализовать передачу позиционной информации о взаимном расположении точек и линий (слева, справа, внутри, снаружи). Направляющий вектор касательной к линии V=(Vx,Vy) начинается в точке Pi=P(ti)=(xi,yi) и направлен по касательной в сторону увеличения t. Уравнение касательной имеет следующий dx(t ) dy (t ) вид: x(t)=xi+Vxt, y(t)=yi+Vyt, где Vx и Vy dt dt в точке ti. - значения соответствующих производных Связь между вектором нормали и касательным вектором, ввиду их ортогональности, описывается следующими выражениями: N (Vy , Vx ); V ( N y , N x ). Самый простой способ изображения кривой линии – аппроксимировать ее прямолинейными отрезками. Параметрические представления позволяют получить на траектории кривой точки (концы отрезков), находящиеся на одинаковом расстоянии друг от друга. 7 Конические сечения В общем случае коническое сечение можно описать с помощью уравнения второго порядка: Ax2 By 2 Cxy Dx Ey F 0, где A, B, C, D, E и F – коэффициенты. Определяя коэффициенты A, B, C, D, E и F можно получить разные конические сечения – параболы, гиперболы, эллипсы, окружности. Это уравнение описывает также вырожденные конические сечения: точки и прямые линии. Вид конического сечения можно определить, найдя дискриминант: 0, эллипс (или окружность) B 4 AC 0, парабола 0, гипербола 2 Такие кривые часто используют в прикладной машинной графике, например, для разработки деталей или в чертежных системах. 8 Полиномы и сплайны Полиномиальная функция n-го порядка по x определяется как n y ak x k a0 a1 x k 0 an 1 x n 1 an x n , где n – неотрицательное число, а ak – константы, причем an 0. При n=1 получим прямую линию, при n=2 – кривую второго порядка, при n=3 – кубический полином, при n=4 – кривую четвертого порядка, и т.д. Полиномы используются в ряде графических приложений, в том числе при проектировании формы предметов, описании траекторий в анимации, построении графиков данных по дискретным наборам точек. При проектировании формы предмета или траектории движения, как правило, сначала задается несколько точек, которые определяют общий вид кривой и представляют собой необходимый контур, а затем по выбранным точкам подбирается подходящий полином. Один из способов подбора кривой – это соединить каждую пару заданных точек кубическим участком кривой. Каждый такой участок следующим образом описывается в параметрической форме: x ax0 ax1u ax 2u 2 ax3u3 , y ay 0 ay1u a y 2u 2 a y 3u 3. Значения коэффициентов axi , a yi , i 0, ,3 определяются из граничных условий для участков кривой. Одно из граничных условий заключается в том, что конец одного участка кривой совпадает с началом следующего, а второе условие – это совпадение тангенсов угла наклона двух кривых на общей границе, таким образом, в результате получается непрерывная гладкая кривая. Непрерывные кривые, образованные из полиномиальных фрагментов, называются сплайновыми кривыми или просто сплайнами. 9 Многоугольники (полигоны) Согласно математическому определению полигон (многоугольник) – это плоская фигура, которая задается с помощью набора из 3-х или больше точек – вершин, последовательно соединенных прямолинейными отрезками, которые называются ребрами или сторонами многоугольника. Вершины полигона упорядочены циклически вдоль его границы. Полигон является простым, если он не пересекает самого себя. Полигоны с самопересечением всегда можно разделить на несколько простых полигонов. Примеры многоугольников: треугольники, прямоугольники, восьмиугольники, десятиугольники. В приложениях компьютерной графики возможны такие ситуации, когда не все перечисленные вершины многоугольника лежат строго в одной плоскости. Это может быть связано с ошибкой округления при вычислении значений, либо с ошибкой определения координат вершин или (что более характерно) с аппроксимацией криволинейной поверхности набором многоугольных участков. Один из способов исправления этой ситуации – просто разделить заданную сетку многоугольников на треугольники. 10 Классификация многоугольников Рис. 1. Многоугольники: а) выпуклый; б) невыпуклый Внутренним углом многоугольника называется угол внутри границы многоугольника, образованный двумя соседними сторонами. Если все внутренние углы многоугольника меньше или равны 180 градусам, то многоугольник выпуклый. Другие эквивалентные определения выпуклого многоугольника: • Весь многоугольник должен лежать по одну сторону от бесконечной прямой, являющейся продолжением любой из его сторон. • Если выбрать любые 2 точки внутри выпуклого многоугольника, то прямолинейный отрезок, соединяющей эти точки, также будет полностью находиться внутри многоугольника. Невыпуклые многоугольники создают дополнительные проблемы. Реализация алгоритмов закрашивания и других графических процедур для невыпуклых многоугольников намного сложнее, поэтому, как правило, перед обработкой эффективнее разделить невыпуклый многоугольник на набор выпуклых. Как и другие алгоритмы предварительной обработки многоугольников, функции разделения невыпуклого многоугольника часто не входят в графическую библиотеку. Для некоторых графических пакетов, в том числе и OpenGL, необходимо, чтобы все закрашиваемые многоугольники были выпуклыми. Кроме того, в некоторых системах допускается только закрашивание треугольных областей, что значительно облегчает многие алгоритмы создания изображений. 11 Распознавание невыпуклых многоугольников Признаки невыпуклого многоугольника, которые можно положить в основу алгоритма распознавания невыпуклых многоугольников : по крайней мере один внутренний угол больше чем 180 градусов; продолжения некоторых сторон невыпуклого многоугольника будут пересекать другие ребра, а вершины находиться по разные стороны от такого продолжения; некоторые пары внутренних точек дадут отрезки, пересекающие границы многоугольника. если рассматривать каждую сторону многоугольника как вектор, то в проверке на выпуклость может использоваться векторное произведение двух соседних сторон. Для выпуклого многоугольника все такие векторные произведения будут одного знака (положительные или отрицательные). Следовательно, если одни векторные произведения будут положительными, а другие – отрицательными, то данный многоугольник – невыпуклый. 12 Деление невыпуклых многоугольников Если при обходе вершин против часовой стрелки, проекция векторного произведения сторон, образуемых этими вершинами, на ось z становится отрицательным, то многоугольник невыпуклый и его можно разделить, продолжив первый вектор стороны из этой пары векторов, произведение которых рассматривается. 13 Разделение выпуклого многоугольника на набор треугольников Если дан список вершин выпуклого многоугольника, его можно преобразовать в набор треугольников. Для этого сначала определяется любая последовательность из трех идущих подряд вершин, которые образуют новый многоугольник (треугольник). После этого, из исходного списка вершин удаляется средняя вершина треугольника. Затем та же процедура выполняется с измененным списком вершин, и вырезается еще один треугольник. Формирование треугольников продолжается до тех пор, пока исходный список вершин многоугольника не уменьшится до трех, которые и определяют координаты вершин последнего треугольника этого набора. 14 Таблицы многоугольников Таблица сторон, дополненная указателями на грани Рис. 2 Объекты сцены часто описываются как наборы многоугольных граней поверхностей. Графические пакеты часто предлагают функции определения формы поверхности в виде сетки многоугольных участков. Описание каждого объекта включает информацию о координатах, с помощью которых задается геометрия многоугольных граней, и других параметров поверхности, таких как цвет, прозрачность и светоотражающие свойства. Эти данные размещаются в таблицах, которые используются при последующей обработке, выводе на экран и выполнении различных операций с объектами сцены. Информационные таблицы многоугольников можно объединить в две группы: геометрические таблицы и таблицы атрибутов. В геометрических таблицах содержатся координаты вершин и параметры, которые позволяют определить пространственную ориентацию многоугольных поверхностей. К атрибутам объекта, например, относятся величины, определяющие степень прозрачности объекта, отражающую способность его поверхности и текстурные характеристики. Геометрическую информацию об объектах сцены удобно распределить по трем спискам: таблице вершин, таблице сторон и таблице поверхностных граней (рис. 2). Координаты всех вершин объекта записываются в таблицу вершин. В таблице сторон содержатся ссылки на таблицу вершин, позволяющие определить вершины, принадлежащие каждой стороне многоугольника. В таблице граней поверхности содержатся ссылки на таблицу сторон, определяющие границы каждого многоугольника. Далее можно сформировать и другие таблицы: • Например, расширенную таблицу сторон, включающую указатели на таблицу поверхностных граней, чтобы быстрее определить общие стороны многоугольников. Это особенно удобно для процедур визуализации, в которых затенение поверхности при переходе через ребро от одного многоугольника к другому должно изменяться плавно. • Аналогичным образом, для более быстрого доступа к данным можно расширить таблицу вершин, дополнив ее ссылками на соответствующие стороны. • Можно составить расширенную таблицу граней (многоугольников) с указанием отдельных поверхностей в сцене, которые они 15 формируют. Уравнения плоскости Каждый многоугольник сцены лежит в какой-то бесконечной плоскости. Общий вид уравнений плоскости: Ax By Cz D 0, где (x,y,z) – произвольная точка на этой плоскости, а коэффициенты A,B,C и D (которые называются параметрами плоскости) – константы, описывающие пространственные свойства плоскости. Значения констант A,B,C и D можно найти, решив систему из трех уравнений плоскости, подставив в нее координаты трех неколлинеарных точек, лежащих в этой плоскости. Для этого можно выбрать три вершины многоугольника (x1,y1,z1), (x2,y2,z2), (x3,y3,z3), взятые против часовой стрелки, и решить следующую систему линейных уравнений плоскости относительно отношений A/D, B/D и C/D: ( A / D) xk ( B / D) yk (C / D) zk 1, k 1, 2,3. Выражения для коэффициентов плоскости: A y1 ( z2 z3 ) y2 ( z3 z1 ) y3 ( z1 z2 ), B z1 ( x2 x3 ) z2 ( x3 x1 ) z3 ( x1 x2 ), C x1 ( y2 y3 ) x2 ( y3 y1 ) x3 ( y1 y2 ), D x1 (y 2 z3 y3 z2 ) x2 (y3 z1 y1 z3 ) x3 (y1 z2 y2 z1 ). Эти выражения справедливы и для случая: D 0. 16 Передние и задние грани многоугольника Поскольку обычно многоугольные поверхности, с которыми приходится иметь дело в графических приложениях, представляют собой внешнюю оболочку объекта, необходимо различать две стороны каждой поверхности. Определение положения точек в пространстве относительно передней и задней сторон многоугольника является основной задачей многих графических алгоритмов, например, алгоритма определения видимых частей объекта. Чтобы определить положения точек в пространстве относительно многоугольных граней объекта, можно воспользоваться уравнением плоскости. Для любой точки (x,y,z): если если Ax By Cz D 0, Ax By Cz D 0, то точка ( x, y, z ) находится за плоскостью; то точка ( x, y, z ) находится перед плоскостью. Здесь параметры плоскости A, B, C и D вычисляются с помощью координат, выбранных строго против часовой стрелки, если смотреть на внешнюю поверхность. Ориентацию многоугольной поверхности в пространстве можно описать с помощью вектора нормали к плоскости многоугольника, который имеет компоненты: (A,B,C) – внешняя нормаль. Компоненты вектора нормали можно также найти, вычисляя векторное произведение. 17 Примитивы символов Рис. 3. Буква «В», представленная в виде: а) узора битового отображения размером 8 на 8; б) с помощью контура, состоящего из прямолинейных отрезков и участков кривых линий. а) б) Буквы, цифры и другие символы могут иметь разный размер и изображаться в различных стилях. Общий вид стиля набора символов называется начертанием. Сегодня существуют тысячи различных начертаний (шрифтов), доступных разным компьютерным приложениям. Примеры нескольких широко распространенных начертаний – Courier, Helvetica, Times New Roman, Arial и Tahoma. Высота всех символов шрифта 72 пункта приблизительно равна 2,54 см (1 дюйм), 14 пунктов составляет приблизительно 0.5 см. Шрифты можно разделить на две большие группы: с засечками и без засечек. У шрифта с засечками есть небольшие черточки, или штрихи, в конце главных штрихов знаков, тогда как при начертании без засечек таких штрихов нет. Например, этот текст набран шрифтом с засечками (Times New Roman). А это предложение напечатано шрифтом без засечек (Arial). Шрифт с засечками, как правило, более удобочитаемый; т.е. при таком шрифте легче читать большие фрагменты текста. С другой стороны, в шрифтах без засечек легче распознаются отдельные символы. По этой причине шрифты без засечек называют более разборчивыми. Эти шрифты хороши для обозначений и коротких названий. Также шрифты классифицируются по тому, являются ли они моноширинными или пропорциональными. При моноширинном начертании все символы имеют одинаковую ширину. Для пропорциональных шрифтов характерно изменение ширины символов. При хранении компьютерных шрифтов используются два различных вида (рис. 3). Простой способ описания формы символа определенного начертания – это задать узор из бинарных значений прямоугольной решетки. В таком случае набор символов называют растровым (битовым) шрифтом (рис. 3,а). Другой, более гибкий, способ – описать форму символов с помощью прямолинейных отрезков и участков кривых линий, например так, как это делается в шрифте PostScript. В этом случае набор символов называют векторным шрифтом (рис. 3,б). Растровые шрифты самые простые для описания и изображения: нужно только перенести сетку символа в буфер кадра. Однако в общем случае для записи растровых шрифтов необходимо больше памяти, поскольку нужно записывать каждую версию (с разными размерами и форматом) шрифта. Для записи векторных шрифтов требуется меньше памяти, поскольку для каждой версии не нужен отдельный кэш шрифта. Полужирный шрифт, курсив или шрифты различных размеров можно создавать путем изменения определений кривых, образующих контуры символов. Однако для обработки векторных шрифтов нужно больше времени, поскольку для них 18 необходимо выполнять процедуру растеризации кривых с закраской внутренней области.