
Векторная графика
Принципы векторной графики имеют целью построение линейных контуров, составленных из элементарных кривых, описываемых математическими уравнениями в особой параметрической форме.
Для того чтобы линейные контуры, составленные из элементарных кривых, не создавали резких преломлений и разрывов, элементарные кривые должны быть гладкими, что обеспечивается специальным размещением управляющих линий. Общим видом таких кривых являются NURBS-кривые, а более частным — кривые Безье. Первые и вторые используются в трехмерной графике, а вторые — только в программах плоской векторной графики.
Векторная графика в английской терминологии обозначается словами "drawing" или "illustration".
Принципы векторной графики
Дискретизация (на сей раз линейная) позволяет создавать произвольные векторные контуры из элементарных кривых, построенных на основе какой-либо единой формулы.
Отсюда формулируется задача — поиск формулы, которая бы позволяла описывать все многообразие линейных контуров. И поскольку дискретизация имеет линейный характер, общий контур разбивается на достаточно мелкие фрагменты — сплайны. При этом необходимо выбрать наиболее простую формулу (функцию) для их описания, представляемую в параметрической форме. Одной из самых важных причин выбора в качестве средств векторной графики кривых Безье и NURBS-кривых (англ. Non-uniform rational B-spline, читается «нурбс») является управляемая гладкость, а также то, что их форма определяется расположением множества контрольных точек, которые определяют форму только части кривой, находящейся рядом.
В программах векторной графики единственный способ изменения формы — интерактивное перемещение опорных и управляющих точек. На базе кривой Безье основывается и язык описания страниц PostScript, развитие которого шло по пути интегрирования новых возможностей выводных устройств (цветной печати, систем управления цветом и шрифта).
Общие принципы векторной графики
Разум так же близок к истине, как многоугольник к кругу, ибо чем больше число углов вписанного многоугольника, тем больше он приблизится к кругу, но никогда не станет равным кругу даже и в том случае, когда углы будут умножены до бесконечности.
Николай Кузанский
Из школьного курса следует, что определенную линию, например прямую или параболу, можно представить двумя способами:
аналитически, когда используется математическая формула;
графически, или геометрически, когда она изображается визуально на плоскости.
Соблазнительно предположить, что и все многообразие линейной графики можно представить в виде формул, которые бы ее описывали и позволяли экономно фиксировать.
Замечание: вспомним, кстати, что пиксельная графика по критерию экономичности явно проигрывает линейной графике.
Но дело осложняется тем, что составление такой формулы является отнюдь не тривиальной задачей и ее создание может потребовать такое огромное количество времени, что эта процедура станет абсолютно нерентабельной. Более того, необходимость непрерывно изменять форму кривой полностью делает еще более затруднительным такое предположение. Но и расставаться с такой возможностью жаль.
Поэтому, естественно, в этой ситуации возникает идея, как бы с помощью одной-единственной формулы описать все многообразие кривых, используемых в линейной графике.
Но как это сделать? Следует опять мысленно вернуться к принципам пиксельной графики, в основе которой лежит технология дискретизации (разделение плоского изображения на равные площадки — пикселы) и попытаться применить тот же принцип для линейных изображений.
Разумеется, теперь и дискретизация приобретет иной характер — линейный, т. е. пространственная дискретизация, на которой основана пиксельная графика, сменится на линейную, поскольку имеется только одно измерение — вдоль линии.
И если уж разбивать произвольные кривые на отдельные фрагменты (сегменты), разумно принять следующие исходные условия:
разбивать линии на достаточно мелкие (короткие) фрагменты;
выбрать наиболее простую формулу (функцию) для их описания.
Самой простой функцией, естественно, является линейная зависимость, с помощью которой описывается прямая линия — кратчайшее расстояние между двумя точками, лежащими на плоскости.
Разбивая линейный рисунок на достаточно мелкие элементы дискретизации и соединяя полученные точки дискретизации прямыми, можно с помощью исчислимого (конечного) количества этих прямых представить любой линейный объект и любую сложную кривую.
Самым главным достоинством такой технологии является, естественно, простота; для каждой точки достаточно всего двух чисел, определяющих координаты этих точек. Таким образом, огромную кривую можно описать всего-навсего сотней пар чисел.
Однако указанная простота является причиной серьезных недостатков.
Объекты, составленные только из прямолинейных сегментов, лишаются возможности произвольного масштабирования. Пока отрезки достаточно мелкие, они не создают впечатления угловатости, но при значительном коэффициенте увеличения углы становятся очевидными.
Форма объекта, аппроксимированного линейными отрезками, может изменяться, например при вращении.
Для совершенно достоверной аппроксимации формы объекта, когда окружность выглядит как окружность, а не как многоугольник, потребуются десятки тысяч линейных сегментов.
Замечание: такой принцип по-прежнему используется, например, в системах, связанных с режущими устройствами.
Указанные недостатки заставляют искать другие способы описания формы объектов и использовать более сложные кривые, в частности кривые более высоких степеней (второй, третьей и т. д.).
Пример-метафора
Упрощенно говоря, задача формулируется так: найти некий набор заготовок, каких-нибудь бесконечно гибких проволочек, из которых мы единообразным способом с помощью одной и той же формулы получим самые разные формы.
А уже из этих форм составим цепочку, т. е. последовательно свяжем их друг с другом и получим любой произвольный объект.
Для того чтобы перейти к таким кривым, необходимо вспомнить об исторических корнях.
Исторические предшественники
Учение о природе будет содержать науку в собственном смысле лишь в той мере, в какой может быть применена в нем математика.
Иммануил Кант
В докомпьютерные времена специалисты, которые работали с линейными изображениями (архитекторы, кораблестроители и инженеры) для создания своих проектов пользовались только бумагой, карандашами и простейшими чертежными инструментами (линейками, циркулями, угольниками и транспортирами). Однако при создании чертежей больших деталей в натуральную величину, например шпангоутов судов, возникали естественные сложности. Причем проблема состояла не только в размере, но скорее в том, чтобы провести гладкую кривую через определенное количество заранее фиксированных точек.
Пытливая мысль и изобретательность нашли оригинальный способ: в больших помещениях нужную форму кривой получали, выгибая длинные тонкие полоски дерева или металла. Такие полоски называли сплайнами (splines). Для того чтобы придать упругой полоске нужную форму, ее фиксировали в требуемых точках с помощью особых свинцовых грузил, которые за сходство формы назывались "утятами" (ducks). Результирующая кривая получалась гладкой, а форма изменялась перемещением грузил (рис. 12.1).
Рис. 12.1. Чертежные сплайны
Впоследствии понятие сплайна стали применять в математике для похожей цели — описания кривых.
В 1885 году Карл Вейерштрасс сформулировал и доказал теорему, названную его именем. Примерно в таком виде она приводится в современных курсах математического анализа: в соответствии с этой теоремой для любой непрерывной на отрезке функции найдется многочлен, сколь угодно мало отличающийся от данной функции. В более простой формулировке это означает, что согласно доказанной теореме Вейерштрасса можно обрисовать любую функцию с помощью полиномов.
Справка
Вейершрасс Карл (1815—1897) — немецкий математик, иностранный член-корреспондент (1864) и иностранный почетный член (1895) Петербургской Академии Наук. Известен своими трудами в области математического анализа, теории функций и линейной алгебры. Главным его научным достижением считается система логического обоснования математического анализа.
Справка
Слово "полином" происходит от греческого слова "poly", что означает "многочисленный", и латинского слова "nomen" — "имя", русский эквивалент этого понятия — многочлен. Полином представляет собой алгебраическую сумму конечного числа одночленов, например для одного переменного х многочлен имеет вид
y = a0xn +a1xn-1...+an,
где а — коэффициенты многочлена, п — показатели степеней (целые неотрицательные числа). В курсе средней школы нам известны многочлены первой, второй и третьей степени.
Вопрос о построении аппроксимирующего многочлена привлек многих математиков. Среди них одну из решающих ролей сыграл выдающийся ученый Сергей Натанович Бернштейн, который закончил Харьковский университет, учился в Сорбонне, а в начале XX века предложил новое доказательство теоремы Вейерштрасса с помощью теории вероятностей. В этом случае необходимый полином строится в явном виде (не параметрически). Именно данный полином и стал основой сплайновых кривых, в частности NURBS-кривых и кривых Безье.
Пример аппроксимирования кривых Безье см. в разд. "Свойства кривых Безье" данной лекции.
Справка
Бернштейн Сергей Натанович (1880—1968)— математик, академик Академии Наук СССР и Академии Наук Украины. Основные труды относятся к области теории дифференциальных уравнений (условия аналитичности решений), теории функций (приближение функций многочленами), теории вероятностей (аксиоматика, предельные теоремы).
Справка
Аппроксимация происходит от латинского слова "approximo", что переводится как "приближаюсь", в математике это означает замену одних объектов, например сложных функций, другими, более простыми, которые являются более или менее близкими к исходным. Самый простой пример аппроксимации мы уже упоминали — это замена кривых линий совокупностью прямых, образующих ломаную линию, примерно совпадающую с исходной.
К сожалению, нашему великому соотечественнику не очень повезло, поскольку чаще известны имена людей, применивших открытия, чем их авторов. То же случилось с кривыми, которые известны всему миру под именем кривых Безье.
Справка
Безье (Bezier) Пьер Этьен (1910 — 1999) — французский инженер и ученый, который, поступив в 1933 году на завод Рено, с 1960-х годов начал исследования в области компьютерного моделирования, в частности, применил на практике компьютерного проектирования теорию сплайнов трехстепенных функций, разработанных именно Сергеем Натановичем Бернштейном. Пьер Безье — автор четырех книг и множества статей по этой тематике, он почетный доктор многих ведущих университетов мира.
Теперь все компьютерные художники и дизайнеры знают "кривые Безье", "инструменты Безье", а многие пользователи компьютерных программ, например, компьютерных игр, компьютерных шрифтов работает с такими кривыми, даже и не подозревая об этом. И тем не менее справедливее было называть эти кривые кривыми Бернштейна— Безье.
Замечание
В 1981 году состоялась знаменитая выставка "Москва — Париж", сначала во Франции, потом — в СССР. На выставке демонстрировались шедевры русской и французской культуры конца XIX — начала XX веков. Балет, живопись, графика, скульптура, поэзия двух стран имеют очень тесные связи и взаимовлияние. Математика и техника — в том числе. Русский математик разработал довольно абстрактный математический аппарат, а затем этой "абстракции" нашлось применение в виде конкретных очертаний кузова французского автомобиля.