Векторная графика. Обрисовка контура

Дмитрий Маштаков
  Контуры фигур векторной графики, в частности, полилинии (Ломаные линии), можно рисовать вручную. Однако если имеется уже готовый силуэт, или фотография, то эту работу можно автоматизировать, поручив обводку контура подходящему алгоритму.
  Такой алгоритм http://youtu.be/VehXORHLoXg существовавший в программе DM.Print, я перенёс в программу «Стереометрия и Анимация». Заодно я несколько улучшил его - создавать ломаные линии стало легче и удобнее.

  Весь процесс действий связан с нажатием клавиши Ё, поэтому будем называть их Ё-действиями. Почему клавиша Ё? Она – на отшибе, в верхнем левом углу клавиатуры, и найти легко, и случайно пальцем не нажмёшь.
  Слева на иллюстрации вы видите силуэт орла, найденный в интернете, а справа – готовый результат, заштрихованная векторная фигура.
 
  Найденную картинку, однако, сразу обрисовывать нельзя. Её надо к обрисовке подготовить. Для этого мы сначала делаем дискриминацию цвета – обнуляем начальные байты каждой из RGB компонент.
  Серые клеточки фона исчезают, остаётся чёрная фигура на сером однородном фоне. И это казалось бы то, что нужно. Увеличение, однако, показывает, что по самому краю силуэта имеются полутона, и они попадут внутрь нашей обводки, если мы будем делать её снаружи.

  Чтобы убрать полутона, мы делаем очистку контура белым цветом, используя широкую кисть и установив режим, запрещающий окраску пикселей чёрного цвета. На иллюстрации видно, как происходит зачистка, и показан её результат в увеличенном виде – в результате зачистки полутона с кромки силуэта исчезли, они перекрасились в белый цвет. 

  И наконец, приступаем к обводке. Выставляем самый мелкий шаг – цифру 1 на кнопке «размер точки», делаем клик справа от силуэта, и нажимаем клавишу ё на нижнем регистре. Начинается поиск границы – от точки нашего клика влево (если нажать Ё верхнего регистра, то поиск пойдёт вправо).
  Как только граница силуэта будет найдена, вступает в действие наш алгоритм (см.ссылку выше), и силуэт оказывается оконтуренным тонкой линией.
  Но это не та ломаная линия, которую мы в итоге получим. Дело в том, что даже при очень мелком шаге запоминаются координаты не каждой точки контура. При цифре 1 они запоминаются через одну (результат см. на иллюстрации), а при цифре 9 будет записываться каждая 18-я по счёту точка. Таким способом силуэт может быть обрисован с меньшими или большими подробностями.
  Массив, в котором точки хранятся, имеет размер 40000, так что точек в него можно записать очень много. В фигуре орла, которую вы видите на иллюстрации, всего-то 965 точек. Сорок орлов можно записать в этот массив.
  Полученный массив считывается, и в качестве одного из четырёх абрисов присоединяется к точке заливки. Точка заливки создаётся заранее, а на иллюстрации она к тому же ещё и изображает глаз орла.
  Сама же Ломаная линия, которая заливается или заштриховывается (тип заливки или штриховки можно выбирать), сама ломаная состоит из мелких прямых, которыми точки абриса соединяются.

  В использовании ломаных линий есть ещё один аспект – они обрабатываются проще и быстрее, чем кривые Безье. Просто потому, что любая кривая Безье чертится как набор прямых линий, то есть, как бы предварительно превращается в Ломаную. Но и у кривых Безье есть преимущества – их специфическая гладкость, возможность плавной регулировки толщины, а также меньшее число точек, необходимое для запоминания линии.
  Поэтому и кривые Безье хотелось бы иметь в программе. И, как оказалось, это можно сделать, если оформить их как стоки. Что такое стоки, смотрим тут - http://proza.ru/2022/10/27/1379   
 
  Ниже цитируется раздел Help, относящийся к обсуждаемой теме. Как можете видеть, работа с программой описывается исчерпывающе и очень подробно.

__________
18.11.2022

ПРИЛОЖЕНИЕ. Текст раздела Help.

X     Линии абрисов не обязательно рисовать вручную. Контур может быть
       создан автоматически, путём обрисовки однотонного силуэта изнутри,
  или фигуры на однотонном фоне - снаружи.  Силуэт для обводки можно
  подготовить, используя операцию дискриминации цвета в режиме акварели,
  или запомнив рисунок на поле_6 с помощью клавиши E и затем считав его
  с этого поля. После дискриминации можно выделить силуэтом один из
  фрагментов рисунка, сделав рисунок двухцветным (см.п.меню Рисование).
 
     Когда силуэт приготовлен, кликаем точку начала поиска его границы
  внутри силуэта или сбоку от него. При нажатии клавиши ''ё'' поиск будет
  вестись в левую сторону, а при нажатии этой клавиши на верхнем регистре
  поиск пойдёт вправо. Затем начнётся обрисовка.
    В процессе обрисовки, каждая точка контура обозначается активным цветом
  и имеет размер 1 пиксель. Точки контура ставятся вплотную друг к другу.
    По мере появления точек, их X,Y координаты записываются в массив Pee.
  Однако, не каждая точка записывается. Интервал записи задаётся цифрой на
  кнопке ''размер точки'',  он равен 2,4,6... и до 18,  то есть, он равен
  удвоенному значению цифры. В режиме акварели интервал равен 2 и от цифры
  не зависит. Зато, после окончания процесса, контур будет показан точками
  того размера, какой был выставлен.
    Процесс заканчивается, как только контур замкнётся, или если число точек
  в записи достигнет 4000. Сделанная запись сохраняется, и имеющиеся в ней
  точки можно переносить в абрисы.
 
     Делается это опять же, с помощью нажатий клавиши ''ё''.
  Если выбрана Ломаная, то нажатие Ctrl/ё запишет точки в тот абрис, который
  окажется свободным. Если выбран абрис, то точки в нём будут заменены. Это
  действие обратимо - в текстовом поле появляется вопрос о восстановлении
  абриса. Кликнув там, абрис можно восстановить.
 
     Нажатие Alt/ё запишет точки выбранного абриса в массив Pee. Таким
  образом, посредством массива Pee, можно переносить абрисы от одной
  Ломаной к другой, или менять их привязку к собственной ломаной.
  Метод обрисовки силуэта значительно облегчает работу аниматора.