Перестановка элементов векторной графики

   Векторная графика устроена таким образом, что её элементы выводятся последовательно. То есть существует очередь, и векторные элементы рисуются в порядке этой очереди. Те элементы, которые идут в очереди последними, будут рисоваться поверх предыдущих, перекрывая их.
   Однако иногда требуется переставлять элементы, создавая для них другую очерёдность появления на рисунке. Как это делается?
   
   В программе DM_Paint структура хранения элементов векторной графики проста, наглядна и очень удобна для таких манипуляций с ней.
   Графические элементы представлены в форме строк с целыми числами - по двенадцать чисел в каждой строке. Строки находятся в общем массиве и разделяются на титульные (на иллюстрации они обозначены тёмным цветом) и дополнительные, ссылка на начало которых имеется в третьей позиции титульной строки.
   Титульная строка начинается с логотипа элемента (его номера), в ней также имеются X,Y координаты начальной точки, координаты начала заливки, цвет фона и контура, толщина линии контура, возможно и ещё кое-что, ну и эта самая ссылка на начало дополнительных строк, которые логотипа не имеют, а имеют на его месте число ноль и содержат, в нашем примере, координаты вершин многоугольника и ничего более. Число вершин многоугольника также указывается в титульной строке.

   В каждой строке дополнительной последовательности строк находится информация о пяти вершинах Многоугольника, то же – для Ломаной и Веера, а для Полилинии – о четырёх её точках. Фигуры Безье требуют одну дополнительную строку на каждый её сегмент. Для одиночной кривой Безье нужна только одна дополнительная строка, а вот Паттерн, Круг, Прямая и Прямоугольник дополнительных строк не требуют вовсе – вся информация о них помещается в титульной строке.
   В упорядоченном массиве дополнительные строки следуют сразу за титульными. На окончание массива указывает поинтер NPv.

   В нашем примере на рисунок выводится сначала зелёный многоугольник, за ним – синий, затем красный и коричневый.
   Давайте поменяем эту очерёдность – поставим красный многоугольник в очередь перед синим.
   Для этого, в режиме Показа, произведём «разведку» - кликнув правой кнопкой мыши по начальной точке синего многоугольника, узнаем, что он (его титульная строка) находится на 3-й строке. Затем выделим красный многоугольник, кликнув по его начальной точке (компьютер при этом запомнит, что синий многоугольник находится на строке 7).
   В текстовое поле над кнопкой «Paste» запишем цифру 3 и кликнем начало строки меню «По—замена» («По» означает Поставить сюда).
   
   Что же произойдёт?
   Наша задача состоит в том, чтобы взять элемент со строки N=7 и поставить его перед элементом со строки L=3.
      Компьютер начнёт перебирать строки массива графики, не обращая внимания на дополнительные строки. Встретив 7-ю строку, он тоже пропустит её. Встретив другую титульную строку, он перепишет её в конец массива, а логотип её, находящийся на старом месте обнулит, сделав таким образом эту строку нерабочей. Однако, если эта строка 3-я, то прежде, в конец массива будет поставлена 7-я строка, и уже потом записана 3-я.
   Логотип 7-й строки на старом месте тоже будет обнулён, и мы получим в результате список строк с нулями в начале, а затем – список титульных строк в их новом порядке.

   Дело, как говорится, сделано, и с новым вариантом графики можно работать. Обратите внимание на то, что дополнительные строки при этом не переставлялись. Благодаря привязкам по ссылкам, они прекрасно функционируют на своих прежних местах.
   Хотя хочется массив упорядочить – его и читать не очень просто, и пустые места в нём появились. Упорядочение массива делается путём прогона его через специальное место хранения во внешнем файле – последовательно кликаем строки меню «СОХРАНИТЬ» и «Загрузить». Заодно мы сохраняем графику, имея её «на всякий случай» в недалёком доступе.

На иллюстрации вы можете видеть, какие изменения в графике произошли.

__________
28.11.2020 


  Алгоритм этот простой и хорошо известный, и программисты подобными алгоритмами широко пользуются, когда организуют хранение информации по ссылкам.
  Я рассказываю о нём потому, что не все читатели - программисты. Но если они пользуются графическим редактором, то им было бы неплохо знать, как это всё внутри него происходит. 
  Клип о перестановке элементов смотрим тут - http://youtu.be/NBS4ubPL6E8   


Рецензии