Слёзы и другие прозрачные предметы

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

  Рассуждал я так. Что такое капля дождя на оконном стекле? Она имеет выпуклую форму, которая выполаживается по краям в том случае, если капля стекло смачивает. Проходя через каплю, лучи света, идущие снаружи, преломляются, и мы видим в капле весь наружный мир, отражённый справа налево и перевёрнутый вверх ногами.
  Если капля сильно выпуклая, то наружный мир сосредотачивается в ней более, а если капля пологая, то пологим оказывается и мир, преломлённый в ней.

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

  А капля? А капля в точности повторяет своей формой профиль распределения краски в кисти с мягкими краями.
  Пусть так, а где в этой форме преломление лучей наибольшее?
  Не в центре и не на краю, а там, где форма сильней всего меняется. Поэтому я преобразовал массив чисел, выражающих эту форму – взял разность между соседними числами, умножил её на 100 и прибавил единицу. Массив небольшой, всего 20 элементов для пятна радиусом 20 пикселей, потому преобразование делается очень быстро.
  Дальше всё просто – мы идём по пиксельному кругу, считываем координаты X,Y каждого пикселя и соответствующий радиус – расстояние пикселя до центра круга, по радиусу узнаём число, на которое X и Y нужно умножить, по полученным значениям считываем цвет в окружающей каплю картинке, и записываем этот цвет по координатам X и Y, то есть внутрь капли.
  И хотя пиксельный круг это не 20 элементов, а 1400, но и это преобразование идёт достаточно быстро, компьютер не зависает.
  Вот в принципе всё и сделано – мы получили отражение окружающего нас мира в капле воды.

  Капли получаются достаточно реалистичные. Вы можете сравнить их с каплями нарисованными в Фотошопе. На иллюстрации на красном кленовом листе эти три капли находятся левее, а те две, что справа, сделаны средствами Фотошопа. Замечу, что на полностью прозрачную каплю, ту, что висит на краю листа, Фотошоп не способен.

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

   ОСОБЫЕ ОПЦИИ КНОПКИ «Темнить/Светлить» для кисти без номера.

  Самая первая кисть программы называется кистью без номера, или кистью №0. Чтобы не происходило путаницы с опциями, которые имеются у некоторых других кистей, я ввёл описанные опции только для этой кисти с мягкими краями.

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

  Но если мы покликаем по кнопке «Темн/Св», то последовательно будем получать на ней надписи «Темнить», «Светлить», «Оттенить» и «Рисовать».
  Это обычные режимы работы, связанные с этой кнопкой, и действительно, кликая по полю рисунка, мы будем точечно (в пределах выставленного размера пятна) темнить, светлить и оттенять активным цветом небольшую область нашего рисунка. А если поведём стилусом по рисунку, то в режиме «Рисовать» получим след кисти с мягкими краями.
  Внимание! Только кликайте, а не водите стилусом по рисунку, если делаете темнение, светление или оттенение, или заранее заблокируйте рисование, кликнув справа от большой кнопки, иначе при перемещении стилуса по планшету появится след обычного рисования и он может вам мешать.
  Следы обычных видов работы, связанной с кнопкой «Темн/Св» показаны на иллюстрации внизу.

ОСОБЫЕ ВИДЫ работы для этой кнопки вводятся, если кликнуть по маленькому жёлтому лайку (полю без специальной пояснительной надписи) левее кнопки.

  После первого клика лайк становится зелёным, показывая, что первая особая опция включена. При надписи «Темнить» клик по полю для рисования приводит к появлению на нём предмета, напоминающего прозрачную капельку воды, преломляющую в себе находящийся позади её окружающий мир.
  Поскольку ранее кнопка «Градация» (кнопка находится на верхней части окна) регулировала плотность краски в центре пятна, то и в особом режиме она выполняет аналогичную функцию – регулирует толщину капли. А поскольку с толщиной капли связана её преломляющая сила, то увеличивая цифру на кнопке «Градация» мы увеличиваем размер того мира, который помещается в капле. На воспроизведение мира оказывает влияние и переключатель <AG>, находящийся левее кнопки «Градация» - в положении Акварель этот мир сосредотачивается в капле в своём нормальном, а не в перевёрнутом виде. Хотите рисовать слёзы? Рисуйте их именно так.

  Опция «Светлить» в четыре раза усилит преломляющую силу капли, и она заблестит как бриллиант. Мнемоника запоминания проста – тёмная вода, светлый бриллиант.
  Следующая опция «Оттенить» капли не создаёт, она сосредотачивается на изображении внутри пятна, стягивая его к центру или отталкивая от центра в зависимости от состояния переключателя <AG>. Эта опция очень удобна для того, чтобы точечной обработкой изменять детали изображения не нарушая его целостности. Она хорошо сочетается с похожей процедурой копирования кругами, в которой целостность изображения тоже не нарушается.

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

  Опция «Рисовать» позволяет движением стилуса рисовать сливающиеся друг с другом капли, воспроизводя каждую так, как это делалось при опции «Темнить». Любопытно, что при таком рисовании, при переключении на акварель и режим аппликации, при малых значениях градации капля с очевидностью захватывает в себя не только окружающий мир, но и след только что сделанных капель. В результате возникает шлейф, который тащится за кистью. Таким образом можно, например, взлохматить у модели волосы (см. иллюстрацию).

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

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

  Вот я и закончил рассказ о последних нововведениях в свою программу. Этот текст получился именно рассказом, потому что, посмотрите, в нём нет ни одной математической формулы. Кроме того, я хотел показать, что процесс творчества, которым увлечён, всегда можно сделать темой интересного рассказа. Поэтому, не избегайте «производственных» тем. Рассказывайте о том, что Вас волнует, и о том, чем Вы заняты по жизни помимо чисто литературной деятельности. На мой взгляд, это интересно.
_________
1.12.2012