Чудеса компьютерного рисования

Маштаков
    Кисть №6  заливка и шпатель

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

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

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

    Выберем цвет. Это будет тот цвет, которым мы предполагаем  окрашивать рисунок, создавая след мастихина. Затем тыкнем стилусом-мастихином в то место, с которого мы хотим начать свой след.
     И тут, внимание, - тыкая в это место мы не только выбираем начало следа, но и указываем на цвет фона, над котором мастихин будет подзаряжаться краской.

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

    Im = R20(R)
    For I = 1 To Im
   X = RXY(I, 1) + Xm: Y = RXY(I, 2) + Ym: C = Form1.Picture1.Point(X, Y)
      If C = C2 Then RXY(I, 3) = K
      If RXY(I, 3) > 0 Then
          Form1.Picture1.PSet (X, Y), C1: RXY(I, 3) = RXY(I, 3) - 1
      End If
    Next I
 '==========
В первой строке определяется номер последнего пикселя, входящего в круг заданного радиуса,
далее, в цикле, определяются координаты пикселя и его фоновый цвет С,  и если цвет фона совпадает с цветом С2, взятым с фона в момент первого касания рисунка стилусом, то пиксель заряжается краской активного цвета С1 - в него вкладывается К зарядов.

    Если число К равно 1, то заряд тут же расходуется - если С2 не равно С1, то фон перекрашивается в новый цвет, а если С2=С1, то фон красится в этот же цвет вторично. Такой режим работы соответствует функции "Заливка" - известная всем леечка с краской, которой осуществляется заливка во всех редакторах, только более удобная - не нужно наклонять леечку над каждым малым пятнышком, а водишь стилусом с широким пятном по заливаемым местам, а краска сама ложится туда, куда надо.
    Пример заливки показан на иллюстрации справа сверху.

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

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

    Вот такие чудеса компьютерного рисования. Честно скажу, такого и я не ожидал, когда конструировал свою кисть. А на алгоритм посмотрите - не алгоритм, а какая-то фитюлечка. А чудеса делает.

_________
21.08.2019