Правка и сглаживание контуров векторных фигур

   Правка контуров фигур векторной графики простым движением стилуса очень удобна, и поэтому я постарался создать такие возможности в своей программе. Но как это сделать?
   У меня был опыт подобного копирования в растре - http://proza.ru/2019/10/20/1299 и пример из этой статьи, с искривлением растрового изображения текста, вы можете видеть на иллюстрации. Растровые преобразования имеют существенный недостаток – небольшие дефекты изображения в них постепенно накапливаются, чёткость контуров утрачивается, и восстановить хорошее их качество практически невозможно. Поэтому изображение приходится постоянно корректировать, а время от времени и перерисовывать его заново.
   Кроме того, растровые правки изображения не являются избирательными в отношении разных его составляющих, если только эти составляющие не разнесены по разным слоям. А слои, подобные слоям Фотошопа, Визуал Бейсик, в котором я программирую, делать не умеет.
   А вот векторная графика, позволяет разделять изображения и без создания слоёв, поскольку в принципе своём выводит графические фигуры не сразу, а по очереди, накладывая их друг на друга.
   Итак, как делается редактирование контура векторной фигуры?

   ПОТОЧЕЧНОЕ РЕДАКТИРОВАНИЕ.

  Один вид правки контура я уже освоил - это поточечное редактирование. Кликом правой кнопки мыши по начальной точке фигуры мы её выбираем, а затем, используя клавиши клавиатуры > и <, входим на её сегменты и передвигаемся по ним. Дойдя до десятой точки Ломаной линии, а эта фигура на иллюстрации у нас изображает травку, мы останавливаемся. Теперь мы можем, используя клавиши со стрелочками, передвигать 10-ю точку вправо, влево, вверх или вниз, и даже делать это не с одной точкой, а с группой точек, удерживая клавишу «Shift» и передвигая примыкающие друг к другу точки сразу.
  Важно при этом то, что крайние точки группы передвигаются на меньшее расстояние, и поэтому мы видим не резкий выброс в сторону, а бугорок с пологими краями.
  Удобно ли поточечное редактирование контура?
Не совсем. Во-первых, бугорок получается недостаточно плавным и красивым, положение его краёв трудно предугадать и контролировать, повторные правки с появлением новых бугорков создают на контуре зазубрины. Правда, оказалось, что всякие зазубрины можно тут же быстро и эффективно устранять, сглаживая контур (для этого используется находящаяся рядом со стрелочками клавиша «end» ), н об этом я вам сейчас расскажу.

     СГЛАЖИВАНИЕ КОНТУРА

   Алгоритм сглаживания следующий –
1. Для каждой текущей точки берутся её соседи по списку и определяется точка, средняя между этими соседями
2. Полученная средняя точка усредняется с текущей с весом CW. То есть, вес CW берётся для средней, а вес 10-CW для текущей точки.
  И так не по всему контуру, а только по области вблизи десятой точки. Значение CW берётся по цифре на кнопке «W» на верхней панели. При значении CW=9 контур сглаживается очень эффективно.

Результаты показаны на иллюстрации. Для левого столбца область сглаживания небольшая, а у следующего она пошире (ширина области регулируется опциями кнопки «сс» на левой панели).
  Значение CW=0 соответствует сильному перевесу текущей точки, и в результате нескольких произведённых «сглаживаний» контур не только не сглаживается, а обостряется. Что тоже неплохо – с такой опцией травку можно успешно выращивать.

     ПРАВКА КОНТУРА ПЕРЕНОСОМ ТОЧЕК

  Перенос точек делается в режиме Показа, при установленной ЗЕЛЁНОЙ опции на кнопке для рисования кистью. Кнопка эта находится на внешнем крае левой панели. Это та самая кнопка, которая будучи жёлтой и имея маркировку буквой «а» обеспечивает режим рисования векторных фигур. Но при Показе мы векторные фигуры не рисуем, поэтому эту же кнопку можно использовать по другому назначению.

    Алгоритм переноса точек –
1. Касаемся стилусом планшета, обозначая начальную точку вектора переноса. Координаты этой точки редактор запоминает.
2. Ведём стилус по планшету и отрываем его, обозначая тем самым конечную точку вектора переноса.
  По значению цифры на кнопке «Градиент» определяется радиус окружности, описанной вокруг начальной точки – все точки, составляющие контур выбранной фигуры и попавшие в этот круг, будут перенесены.
  Но перенесены они будут не на одинаковое расстояние. Точки близкие к центру круга будут перенесены в соответствии с длиной вектора переноса, а точки, находящиеся на краю круга, сдвинутся совсем немного – зависимость выполаживается к краю пятна. Чтобы не вычислять коэффициенты сдвига каждый раз, они предварительно записываются в массив из 50-ти чисел (эта зависимость изображает Косинус на интервале от нуля до Пи, делёный на два, плюс 1/2).

  На иллюстрации видно, что делая перенос, можно как сглаживать контур, так и обострять его. Разумеется, в промежуточном положении начальной точки фрагмент контура просто перемещается, не меняя сильно свои очертания.

  Сглаживать контуры Ломаной и Многоугольника можно и без переноса точек. Контур из точек внутри установленного круга может быть сглажен простым касанием и отрыванием стилуса. И уже после этого осуществляется перенос точек, в зависимости от того, был ли стилус перемещён, или нет. Такой режим дополнительного сглаживания – режим зелёной «L», устанавливается кликом ПРАВОЙ кнопкой мыши по зелёной кнопке включённой опции переноса. Выход из режима – вторичный клик, или полный выход из «зелёной» опции.
  Сила сглаживания, так же, как и при сглаживании с выбором отдельной точки, регулируется цифрой над кнопочкой w на верхней панели.

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


  Комбинируя перенос точек со сглаживанием контура можно очень эффективно редактировать векторную графику.
__________
18.03.2021


Рецензии