Как устроена векторная графика

  О том, как устроена векторная 3D графика, я расскажу на примере программы «Стереометрические модели». В этой программе примитивами являются точки, прямые, плоскости и сечения. В программе используется идентификация элементов по их цвету и воздушная перспектива для демонстрации удалённости тех или иных частей модели.

  Программа показывает модель в её вращении вокруг вертикальной оси и имеет массу инструментов для создания и преобразования модели.
  Элементы векторной графики находятся в программе, и вне её, в целочисленном виде. Если это координаты, то они указаны в пикселях, умноженными на 10. Таким образом, точность задания положения точек и концов отрезков прямых линий составляет одну десятую писеля. Практика показывает, что этого вполне достаточно.

  Все целые числа находятся в едином массиве Pvv(1500,12) и размера этого массива тоже, как оказывается, вполне достаточно. Хотя по первому индексу массив можно было бы и существенно удлинить. Что касается второго индекса, то он, меняясь, соответствует логотипу строки (0-пустая строка, 1-точка, 2-отрезок и т.д.), далее идут координаты, если это отрезок, то ещё и координаты второго его конца, потом ещё пара позиций и буквенно-цифровое обозначение (если оно есть), затем цвет, размер точки (или толщина линии). Кончается строка номером, уникальным для каждого элемента.
  Отдельно используется ещё и список номеров  Mvv(511,2),  в котором  практически используется только нулевой столбец. Первый индекс его соответствует номеру элемента, а находятся в нём ссылки на номера строк в массиве Pvv.
  Таким образом, оба массива ссылаются друг на друга, и это удобно. Если, например, мы хотим удалить графический элемент, то мы обнуляем его логотип в массиве Pvv и ставим 0 по индексу номера элемента в массив Mvv, тем самым мы показываем, что этот номер свободен, и мы можем присвоить его вновь создаваемому элементу.
  Легко сообразить, что при такой тактике пустые строки в массиве Pvv постепенно накапливаются. Но мы можем легко сжать массив, выведя его в текстовый файл в уплотнённом режиме, и затем считать графику из этого файла.

  Ещё одним преимуществом использования целых чисел является их удобная читаемость, как в текстовом файле, так и в специальном окне программы - для этого нужно кликнуть по кнопке «просмотр».

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

  Цвет в системе RGB, как  известно, определяется тремя байтами своих компонент.  Беря старшие 5 бит от каждой компоненты и сдвигая их вместе, мы получаем целое число, которое обозначает цвет и записывается в 10-ю позицию строки. Прочерчивая векторный элемент, мы проделываем обратную операцию и к каждым из пяти бит в компонентах цвета приписываем снизу три бита, взятые из номера элемента. То есть, номер элемента мы раздёргиваем на три части, по три бита в каждой. Полученным цветом мы и рисуем.

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

     УПОРЯДОЧЕНИЕ МАССИВА

  Одним из видов преобразования является упорядочение массива.
  Из массива не только удаляются пустые строки, но и элементы устанавливаются друг за другом в порядке их удалённости.
  Дело в том, что элементы рисуются на экране поочерёдно – сначала обрабатывается и рисуется первая строка, затем вторая, потом третья и так далее. Элементы, нарисованные позже, перекрывают собой те, что были нарисованы раньше. Что для зрительного восприятия не всегда удачно.
  Помимо воздушной перспективы хотелось бы, чтобы сначала рисовались бы самые дальние элементы, потом те, что чуть поближе, потом ещё более близкие. Тогда и перекрывать друг друга они будут правильно.
 
  В даль у нас уходит ось Y. Поэтому и упорядочение массива делается по координате Y – от отрицательных значений к положительным.
  Результат вы можете видеть на иллюстрации. К изображению черепушки я добавил заштрихованное сечение. Если посмотреть на координаты, то оно должно находиться внутри. Но поскольку я это изображение добавлял, то строки его оказались в массиве последними. Потому и видится оно на рисунке неправильно.
  Сделанное преобразование исправило этот огрех. Заодно и некоторые элементы черепушки стали выглядеть более правильно.
  В общем, векторная графика – интересная вещь.
  Захотите поиграть с программой, вот она - http://disk.yandex.ru/d/5dbAp05h-XtTcw   работает в системе Виндос.

________
31.8.2022


Рецензии