Динамика кисти в компьютерном рисовании

  Динамическая кисть для компьютерного рисования связывает свои параметры с характером движения стилуса. На простых планшетах, где не отслеживается нажим стилуса на поверхность планшета, его наклон и проч., единственным параметром, который можно отслеживать и эффективно использовать, является скорость движения стилуса по планшету. Умеренно быстрая скорость это 100 пикселей в секунду. Медленная, это 5 пикселей в секунду и меньше. Из этого и нужно исходить.

  Я сделал в своей программе опцию, которая позволяет увеличивать размер красящего пятна при увеличении скорости движения стилуса http://proza.ru/2023/06/23/679
  Опция оказалась удобной. Следуя по этому же пути, можно связать со скоростью прозрачность кисти или её цвет. И я тоже сделал это. Поскольку главное в рисовании это удобство, а не точное математическое соответствие, то и скорость у меня это не совсем скорость. То есть не скорость в данный текущий момент, а некая усреднённая демпфированная величина, которая изменяется плавно даже в том случае, если вы двигаете стилус трясущейся рукой.
  Да и удобства оказались для разных случаев разными, в результате такой разницы кисть набирает свой динамический размер немного прежде, чем, например, изменяет свой цвет. Поэтому не надо удивляться тому, что точки полученные экспериментально, на левом графике иллюстрации выпадают из кривых вверх и влево, это следствие плавно устанавливающейся скорости движения стилуса, а именно эта величина отложена по оси абцисс.
  По вертикальной оси на левом графике иллюстрации отложена величина пропорциональная диаметру динамической кисти.

  Если кисть представить круговым пятном, содержащим внутри себя Im пикселей, то это число Im будет квадратично зависеть от радиуса пятна – серый столбик слева от графика показывает эту зависимость.
  При конструировании расширяющейся кисти число пикселей Im=700 было взято как число, ограничивающее расширение – расширять пятно до большего размера, вплоть до 1327, можно, но рисование с таким пятном в некоторых кистях начинает зависать, поэтому и было введено такое ограничение.
 
  Целью тех экспериментов, которые я описываю, было изучение особенностей динамики расширения пятна и динамики изменения цвета.
  Казалось бы, зачем изучать особенности того, что сам и сделал? Но смысл есть – как я уже говорил, конструируя кисти, я стремился к удобству их использования, и оценивал эти удобства качественно. Но теперь, когда динамическая кисть уже создана, интересно посмотреть на динамическое регулирование с количественных позиций, и подумать, а всё ли правильно было сделано?

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

  Под графиком на иллюстрации показан такой след. Я держал часы возле уха и, слушая их тиканье, постарался сделать след с равномерной скоростью между отметками 0 и 200 ровно за одну секунду. Было очень интересно наблюдать за тем, что получается. Получалось немного не то, чего я ожидал. Я ожидал, что получу ровненькие кривые, но нет.
  Оранжевые точки на графике быстро побежали вверх, а потом, отклонившись вправо, дружно сгруппировались в участок кривой на верхушке над абциссой 100. И так было каждый раз – точки подходили к месту группировки в компактный трек, двигаясь сначала вверх, и только затем слева направо.
  Какой след при этом получается, вы видите внизу – он сначала расширяется, и только затем начинает менять свой цвет с оранжевого на белый. В принципе, так и было задумано.

  Однако изменим динамику движения - не будем сразу стремиться к скорости 200 пикселей в секунду, а будем рисовать стилусом круг, стараясь плавно и постепенно увеличивать скорость его движения. Цвет рисования я изменил на чёрный, и вы видите, что  чёрные точки не бегут сразу вверх, а формируют очень компактную кривую, переходящую на больших скоростях в столь же компактный оранжевый трек.
  Почему так происходит? А потому, что динамика расширения кисти и динамика изменения её цвета сделана разной. При плавном изменении скорости динамика цвета поспевает за динамикой размера, а при резких изменения скорости она отстаёт. И это хорошо – при одинаковой динамике (я это пробовал) след то неожиданно становится белым, то вновь резко оранжевым. Потому и пришлось делать для цвета другую динамику.

  Сделать хорошую динамическую кисть не так просто, как кажется с первого взгляда. Особенно в связи с тем, что события таймера происходят не очень часто - интервал между событиями равен 15 миллисекундам, что сопоставимо со временем перехода центра красящего пятна с одного пикселя на другой.
  При быстром рисовании мы, отслеживая таймер, получаем целочисленные значения 5,4,3,2,1 и даже 0, как информацию о скорости движения стилуса, и чтобы суметь воспользоваться такой не очень удобной информацией нужно «по умному» ею распорядиться – накопить, усреднить, сгладить и проч.

  Пока динамика кисти не включена, пятно кисти имеет фиксированный размер, задающийся условными цифрами от 1 до 9-ти на кнопке «размер кисти». Каждому выставленному размеру соответствует своё R – радиус пятна в первом сером столбце на правой стороне иллюстрации и своё значение Imo – количество пикселей в красящем пятне (во втором столбце).
Например, для выставленного размера 1  R=1, Imo=9.
  Для 5-ти - R=6, Imo=137
  Для 8-ми - R=12, Imo=495
  Для 9-ти - R=14, Imo=665

  При включённой динамике пятно при повышении скорости расширяется –  значение Im увеличивается, начиная от выставленного значения Imo и до 700. Правда, до 700 дело доходит только при больших выставленных размерах. Вы это можете видеть по кривым на иллюстрации. Фактически, увеличение начального размера пятна делается так
 
  Im = Imo + (700 - Imo)*Vtimer

где Vtimer величина обратная скорости движения пятна. Эта величина показывается на графике для выставленных значений 5,8 и 9 голубыми, зелёными и тёмно-зелёными точками. Чёрные и оранжевые точки получены при выставленном значении 1.
  Малиновая кривая демонстрирует опцию вдвое более быстрого расширения следа (при выставленном начальном значении размера кисти равного единице).  Быстрое расширение устанавливается опцией «2m» на кнопке «модификатор кисти», а для обычного расширения нужно на этой кнопке поставить «1m».

     ДИНАМИКА ИЗМЕНЕНИЯ ЦВЕТА

  Динамическое изменение цвета может быть организовано как само по себе, так и в комбинации с изменением размера пятна. Включается динамика цвета постановкой заглавной буквы «С» на место прописного «с» на кнопке буквенных опций. Отрабатывается динамика цвета путём добавления к красящему «активному цвету» А-доли того цвета, который установлен как «цвет фона».
  Правый график иллюстрации показывает, как меняется доля добавляемого цвета в зависимости от скорости движения стилуса (кривая 17). Остальные кривые, полученные увеличением масштаба по оси абцисс, демонстрируют возможность регулировки динамики кисти с помощью кнопки «плавность».
  Значения, задаваемые этой кнопкой, могут быть от 0 до 17.
  При цифре 17 динамика цвета наиболее не торопится со своим появлением, она проявляется только на скоростях сто пикселей в секунду и выше. При цифре 1 цвет меняется почти сразу, даже при очень медленном движении стилуса со своей стартовой точки.

  При продуманной регулировке динамическая кисть хорошо работает. Автоматическое расширение следа в тот момент, когда художнику это надо, позволяет избежать частых настроек. Изменение цвета кисти может быть использовано, например, при рисовании облаков, или морских волн, тоже без лишних для этого действий. Можно, например, медленно покрасить гребень волны, и сразу же вслед за этим быстро нанести мазок на её середину другим цветом, а потом опять вернуться к гребню. И всё это без каких-либо перестроек кисти.

__________
26.06.2023

ПРИЛОЖЕНИЕ

Вот фрагмент программы, который, используя накопленные и усреднённые значения переменной Vtimer, добавляет к активному цвету Ca некоторую долю цвета cBack, меняя тем самым цвет следа кисти в зависимости от скорости движения стилуса -

      Z = 2 * Vtimer / (18 - Х)
      A = 1 / (Z + 1)
      If A > 1 Then A = 1
      If Z < 3 Then
        A = 1 - 0.03333 * Z
        Else
        Y = 2.5 - 1.5 * Cos(A * 15.7):
        A = A * Y:
      End If
      C = ccRGB(cBack, Ca, A):

Влияние скорости на А регулируется величиной Х, выставленной на кнопке «плавность». Множитель Y корректирует форму кривой.


Рецензии
Очень познавательно.
Поддержу для читателей.

Виктор Левашов   26.06.2023 21:26     Заявить о нарушении
Спасибо. В этом деле мне понравилось, что график как бы сам рисуется. Я даже подумал, что иметь такую небольшую опцию очень хорошо - в интернете конечно есть программы, строящие графики, но там линии тонкие и не всегда график имеет тот вид, какой хочешь.


Дмитрий Маштаков   27.06.2023 07:37   Заявить о нарушении