8.08. Векторная графика
Векторная графика
Общее определение и принципиальное отличие от растровой графики
Векторная графика — это способ представления изображений, при котором визуальное содержимое описывается не как набор цветных точек (пикселей), а как совокупность геометрических примитивов: точек, линий, отрезков, кривых, окружностей, многоугольников и других фигур, задаваемых аналитически — через координаты, параметры и правила построения. Ключевая особенность векторного представления заключается в его масштабируемости без потери качества: поскольку изображение описывается формально, а не фиксируется в разрешении, его можно отрисовать с любой степенью детализации, ограниченной лишь возможностями выводного устройства.
Это фундаментально отличает вектор от растра. Растровое изображение — это матрица значений, где каждое значение соответствует цвету конкретного пикселя на фиксированной сетке. При увеличении растрового изображения проявляется «пикселизация»: пиксели становятся видимыми, и детали теряются. Вектор же остаётся гладким, потому что при каждом новом рендеринге фигуры пересчитываются заново в соответствии с текущими параметрами отображения: разрешением экрана, масштабом, углом поворота и т.п.
Этот принцип лежит в основе большинства современных систем отображения графики: от шрифтов (например, OpenType с контурами в формате TrueType или CFF), до интерфейсов (SVG, PDF, UI-фреймворки), 2D/3D-движков и геоинформационных систем.
Понятие вектора в контексте компьютерной графики
В повседневной речи «вектор» часто ассоциируется с файлами .svg или схематичными иллюстрациями. Однако в теоретическом фундаменте графики термин вектор имеет строгое математическое значение — и при этом используется в нескольких смежных, но различимых смыслах.
Во-первых, вектор как элемент векторного пространства — это упорядоченный набор чисел, задающий величину и направление. В двумерной графике это пара чисел (x, y), в трёхмерной — тройка (x, y, z). Важно понимать, что вектор сам по себе не привязан к конкретной точке пространства: он описывает смещение. Например, вектор (3, 2) означает: «сдвинуться на 3 единицы по оси X и на 2 по оси Y», вне зависимости от того, откуда начинать движение.
Это различие критично для корректной интерпретации данных в графических системах. Точно так же, как в физике различают точку приложения силы и направление её действия, в графике различают:
- точки (позиции) — абсолютные координаты в некоторой системе отсчёта;
- векторы направления — указывают, куда смотрит объект, куда направлен луч света, как ориентирована поверхность;
- нормали — частный случай векторов направления, которые перпендикулярны поверхности в данной точке и используются в расчётах освещения, коллизий и т.д.
Нормаль — единичный вектор (длина которого приведена к единице) с определённым знаком, задающим сторону поверхности: внешнюю или внутреннюю. Это позволяет алгоритмам различать, например, лицевую и тыльную сторону полигона — что особенно важно при визуализации (отбраковка невидимых граней, back-face culling) и при физических симуляциях.
Таким образом, в графических API (например, в WebGL, DirectX, Vulkan) типы данных часто явно разделяют точки и векторы, хотя на уровне памяти они могут храниться одинаково. Правильное семантическое различение предотвращает ошибки: например, попытку «перенести» направление (нормаль) как точку приведёт к искажению результатов освещения, поскольку нормали должны подвергаться только вращениям и отражениям, но не переносам.
Матрицы и трансформации
Если вектор — это величина с направлением, то матрица в графике — это оператор, который преобразует векторы. Любое геометрическое преобразование — перенос, поворот, масштабирование, сдвиг, отражение — может быть выражено как умножение вектора на матрицу подходящей размерности.
Самый распространённый тип — аффинные преобразования, которые сохраняют прямолинейность и параллельность линий. Они составляют основу практически всех 2D- и 3D-трансформаций в интерактивной графике.
Рассмотрим базовые виды:
-
Перенос (translation) — смещение всех точек на заданный вектор. В двумерном случае перенос на (tx, ty) требует трёхкомпонентного представления точки — отсюда возникает необходимость в однородных координатах, о чём будет сказано отдельно.
-
Масштабирование (scaling) — изменение размеров вдоль осей. Может быть равномерным (один коэффициент для всех осей) или неравномерным (разные коэффициенты по X, Y, Z). Отрицательный масштаб приводит к отражению (зеркальному отображению).
-
Поворот (rotation) — изменение ориентации вокруг заданной оси (в 3D) или точки (в 2D). Поворот сохраняет длину векторов и углы между ними (является ортогональным преобразованием). Последовательность поворотов вокруг разных осей не коммутативна: сначала поворот вокруг X, потом вокруг Y — не то же самое, что в обратном порядке. Это источник частых ошибок при анимации и управлении камерой.
Все эти преобразования можно комбинировать: умножая матрицы друг на друга, получаем результирующую матрицу, которая выполняет последовательность действий за один шаг. Например, чтобы повернуть объект вокруг своей локальной оси, а не вокруг начала координат, обычно выполняют:
- перенос объекта в начало координат,
- поворот,
- обратный перенос.
Это эквивалентно одной составной матрице, и выполнение всех трёх шагов за один проход существенно повышает производительность.
Матрицы не хранят геометрию — они хранят инструкции по её изменению. Это делает их идеальными для иерархических систем: если у персонажа есть рука, а у руки — пальцы, то движение тела автоматически включает в себя трансформации всех его частей через цепочку умножений матриц.
Однородные координаты и проективная геометрия
Для того чтобы представить перенос как матричное умножение, необходимо ввести дополнительную размерность. Точка (x, y) в двумерном пространстве представляется как тройка (x, y, 1); вектор направления — как (vx, vy, 0). Такое расширение называется однородным представлением.
Основное преимущество: все аффинные преобразования, включая перенос, становятся представимыми в виде единообразного матричного умножения. Это позволяет объединить цепочку трансформаций (масштаб → поворот → перенос) в одну матрицу 3×3 (в 2D) или 4×4 (в 3D).
Ещё важнее то, что однородные координаты открывают путь к проективным преобразованиям — таким, которые моделируют перспективу. Перспективное искажение (например, схождение параллельных рельсов в точку на горизонте) нельзя выразить с помощью аффинных преобразований, но можно — с помощью проекционной матрицы, которая изменяет значение последней компоненты (w) и требует последующего деления:
реальная позиция = (x/w, y/w, z/w).
Таким образом, после всех трансформаций (модель → мир → вид → проекция) полученная точка находится в однородных клиппинг-координатах. Только после деления на w она переводится в нормализованные координаты устройства (NDC), а затем — в экранные пиксели. Эта последовательность — строгая математическая необходимость для корректной перспективы.
Использование w-компоненты также позволяет корректно обрабатывать точки на бесконечности (например, направления света, заданные как «бесконечно далёкие источники»): такие векторы имеют w = 0, и при перспективном делении остаются неизменными — что соответствует физическому смыслу «параллельных лучей».
Системы координат и цепочка преобразований
В трёхмерной графике редко бывает достаточно одной системы координат. Объекты моделируются в удобной для их создания локальной системе, затем интегрируются в общую сцену, из которой выделяется вид из камеры, и, наконец, проецируются на плоскость экрана. Эта последовательность называется графическим конвейером преобразований координат.
-
Локальная (модельная) система координат — система, в которой задана сама геометрия: например, модель автомобиля может быть создана так, чтобы его центр масс находился в (0, 0, 0), а передняя ось совпадала с X. Все вершины меша хранятся относительно этого начала.
-
Мировая система координат — единое пространство сцены, в котором располагаются все объекты. Матрица модель-мир определяет положение, ориентацию и масштаб объекта в мире. Именно в этой системе происходят расчёты физики, освещения (если источник глобальный), коллизий.
-
Система координат вида (камеры) — пространство, «привязанное к глазу наблюдателя». Начало координат находится в точке расположения камеры, ось Z обычно направлена вглубь сцены (вперёд), X — вправо, Y — вверх. Матрица мир-вид (view matrix) инвертирует положение и ориентацию камеры: вместо того чтобы двигать камеру, мы двигаем всю сцену в противоположную сторону. Это математически эквивалентно и вычислительно эффективнее.
-
Экранные (оконные) координаты — двумерные координаты в пикселях на устройстве вывода. Перед этим этапом происходит проецирование (перспективное или ортогональное) и отсечение невидимых частей (clipping). Важно: Z-координата не теряется — она сохраняется в буфере глубины (depth buffer) для правильного наложения объектов.
Понимание этой цепочки критично. Ошибка на любом этапе — например, применение освещения в локальных координатах или неправильное инвертирование view-матрицы — приводит к артефактам: «плавающим» объектам, искажённому освещению, разрывам в геометрии. Современные шейдеры (vertex shader, в частности) явно реализуют эту цепочку: вершинный шейдер принимает позицию в локальных координатах и возвращает однородные координаты после полного преобразования — это стандартный интерфейс, заложенный в API вроде OpenGL или Vulkan.
Геометрическое моделирование
Геометрическое моделирование — это область, посвящённая описанию и манипуляции формой объектов с помощью математических конструкций. В контексте векторной графики речь идёт о представлении формы, из которого изображение лишь выводится как один из возможных результатов. Это принципиально: модель может использоваться для визуализации и для расчётов — прочности, аэродинамики, маршрутизации, 3D-печати.
Существует несколько основных подходов к описанию геометрии. Каждый из них имеет свои компромиссы между точностью, компактностью, вычислительной сложностью и удобством редактирования.
Поверхности Безье
Поверхности Безье — один из самых ранних и интуитивно понятных способов параметрического описания гладких кривых и поверхностей. В основе лежит идея интерполяции между опорными точками (control points) с помощью полиномов Бернштейна.
Ключевая особенность: кривая не проходит через большинство опорных точек — они лишь «притягивают» форму, задавая её общую траекторию и натяжение. Лишь первая и последняя опорные точки лежат на кривой. Это делает поверхности Безье удобными для художественного моделирования (например, в Adobe Illustrator или в дизайне шрифтов), где важна управляемость формы, а не строгое соответствие точкам.
Однако у чистых поверхностей Безье есть существенный недостаток: увеличение числа опорных точек повышает степень полинома, что приводит к нестабильности — локальные изменения начинают влиять на всю кривую (глобальный контроль). Это неприемлемо для сложных моделей, где требуется точное редактирование отдельных участков.
B-сплайны и NURBS
Для преодоления ограничений Безье были разработаны B-сплайны (basis splines) — кусочно-полиномиальные функции, построенные из нескольких сегментов низкой степени, сшитых с заданной гладкостью (например, C¹ — непрерывная первая производная, C² — и вторая).
Главное преимущество B-сплайнов — локальный контроль: перемещение одной опорной точки влияет только на ограниченное число соседних сегментов, а не на всю кривую. Кроме того, степень полинома фиксируется независимо от числа опорных точек — можно иметь сотни опорных точек и при этом работать с квадратичными или кубическими полиномами.
NURBS (Non-Uniform Rational B-Splines) — дальнейшее обобщение B-сплайнов. Слово rational означает, что координаты точек вычисляются как отношение двух полиномов, а не как простой полином. Это позволяет точно представлять конические сечения — окружности, эллипсы, параболы, гиперболы, — чего нельзя сделать с помощью обычных (нерациональных) сплайнов. NURBS стали де-факто стандартом в CAD-системах (AutoCAD, SolidWorks, CATIA), аэрокосмической и автомобильной промышленности, где требуется соответствие строгим инженерным требованиям и совместимость между системами (например, через формат STEP, в котором геометрия часто хранится именно в виде NURBS).
NURBS — это математически строгий инструмент, обеспечивающий точное, однозначное, обратимое представление. Это критично для производства: если деталь спроектирована как NURBS-поверхность, станок с ЧПУ может рассчитать траекторию инструмента с заданной точностью — без дискретизации и потерь.
Полигональные сетки (meshes)
Несмотря на мощь сплайнов, подавляющее большинство интерактивных приложений (игры, VR, мобильная 3D-графика) используют полигональные сетки — приближённое представление поверхности в виде множества плоских многоугольников (чаще всего треугольников).
Причина проста: треугольники — это минимальная фигура, которую можно однозначно отрендерить на GPU. Все современные графические конвейеры оптимизированы под потоковый вывод треугольников. Плюс к этому, сетки легко поддаются оптимизации: упрощению, LOD (уровням детализации), физической симуляции (масс-спринг-системы), коллизиям (bounding volumes).
Однако сетка — всегда аппроксимация. Гладкость достигается за счёт увеличения числа полигонов или использования техник вроде сглаживания по нормалям (Phong shading), когда для каждой вершины хранится усреднённая нормаль, и интерполяция в шейдере создаёт иллюзию гладкой поверхности — хотя геометрия остаётся остроугольной.
Это приводит к необходимости постоянной работы с компромиссом «качество–производительность». Отсюда возникают три ключевые процедуры:
-
Упрощение (decimation, mesh reduction) — алгоритмы, уменьшающие число вершин и граней при сохранении визуальной формы. Примеры: алгоритм Квадратичной ошибки (QEM), edge collapse с контролем геометрического отклонения. Применяется для адаптации моделей под мобильные устройства или удалённую визуализацию.
-
Сглаживание (smoothing, fairing) — итеративное перемещение вершин для устранения шумов или «ступенчатости», возникающей при сканировании или автоматической триангуляции. Не следует путать с визуальным сглаживанием в шейдере: здесь меняется сама геометрия.
-
Ремешинг (remeshing) — полная или частичная перестройка топологии сетки: изменение распределения рёбер, улучшение соотношения сторон треугольников (avoiding slivers), выравнивание плотности. Это необходимо, когда исходная сетка имеет «плохие» треугольники (слишком острые или вытянутые), что приводит к ошибкам в физике, тесселяции или анимации (например, skinning на «плохой» сетке даёт артефакты).
Ремешинг особенно важен при подготовке моделей для анимации: в зонах сгиба (локти, колени) требуется более плотная и регулярная сетка, в то время как на плоских поверхностях (спина) можно использовать крупные полигоны.
ГИС и географические системы
В геоинформационных системах (ГИС) векторная графика играет центральную роль — в отличие, например, от спутниковых снимков (растровые данные), векторные слои хранят семантически насыщенную информацию о географических объектах.
В ГИС вектор — это геометрия, привязанная к геодезической системе отсчёта (например, WGS84 или ПЗ-90), и дополненная атрибутивными данными. Граница участка — это не polyline, а многоугольник с координатами в градусах/метрах, к которому прикреплены атрибуты: кадастровый номер, площадь, собственник, категория земли.
Типы векторных объектов в ГИС
-
Точки (point features) — объекты, размер которых несущественен в масштабе карты: скважины, вышки, геодезические пункты, адреса. Могут включать дополнительные параметры: высота (Z), время (T), точность измерения.
-
Линии (linestring, polyline) — линейные объекты: дороги, реки, трубопроводы, границы административных единиц. В продвинутых системах используются мультисегментные линии (MultiLineString) и ориентированные линии (с семантикой направления — например, одностороннее движение).
-
Полигоны (polygon) — замкнутые области: земельные участки, водоёмы, зоны застройки. Полигоны могут иметь внутренние «дыры» (например, участок с озером внутри). Топологически корректный полигон должен быть замкнутым, непересекающимся и иметь правильную ориентацию (обычно против часовой стрелки для внешнего контура).
Современные форматы (GeoJSON, GML, Shapefile) поддерживают эти типы, а также составные (multipart) геометрии. При этом обязательным является указание системы координат (CRS — Coordinate Reference System), поскольку одни и те же числа (например, 55, 37) могут означать совершенно разные места в зависимости от проекции.
Картография и проекции
Земля — трёхмерный эллипсоид, а карта — двумерна. Процесс перевода сфероидальных координат (широта, долгота, высота) в плоские (X, Y) называется картографической проекцией.
Ни одна проекция не может сохранить одновременно углы, площади, расстояния и формы — это следует из теоремы Гаусса о невозможности изометричного отображения сферы на плоскость. Поэтому выбирают проекцию, минимизирующую искажения для конкретной задачи:
- Меркатор — сохраняет углы (конформна), удобен для навигации, но искажает площади (Гренландия кажется больше Африки).
- Альбера — сохраняет площади (эквивалентна), используется в тематической картографии (плотность населения).
- UTM (Universal Transverse Mercator) — поперечная цилиндрическая проекция, разбивает Землю на зоны по 6° долготы; в пределах зоны искажения минимальны — применяется в инженерных и кадастровых работах.
Векторная графика в ГИС всегда проходит этап проецирования перед отображением. При этом геометрия пересчитывается — координаты вершин линий и полигонов трансформируются в соответствии с формулами проекции. Это не просто «растяжка картинки»: это точное математическое преобразование, часто с коррекцией высоты, геоида и зоны UTM.
Векторизация
Векторизация — процесс преобразования растровых геоданных (сканы карт, снимки БПЛА, классифицированные изображения) в векторные объекты.
Это не всегда автоматизируемая задача. Простой пример: сканированная топокарта 1950-х годов — на ней леса обозначены штриховкой, дороги — линиями разной толщины, контуры — пунктиром. Автоматическая трассировка (например, через алгоритмы skeletonization или edge detection) даёт «сырой» вектор, который затем требует ручной чистки, топологической проверки и привязки к современной системе координат.
Современные подходы используют машинное обучение: сегментационные нейросети (U-Net, Mask R-CNN) выделяют объекты на растровом изображении, после чего выполняется полигонизация — построение замкнутых контуров с учётом гладкости и топологических правил (например, «дорога не может разрываться внутри населённого пункта»).
Векторизация критична для обновления кадастра, создания цифровых двойников городов, мониторинга изменений ландшафта. Особенно сложно векторизовать объекты с нечёткими границами — например, границу леса (ecotone), где переход идёт постепенно. В таких случаях прибегают к фаззи-геометрии или вероятностным полигонам — но это уже выходит за рамки классической векторной модели.