Поздравляю Хабр и Хаброжителей с Новым 2021 годом и дарю всем нам вот такую незатейливую и приятную Функциональную Ёлку (fЁлка). В этой статье я рассказываю как сделать ёлочку на мониторе за 10 минут. Свою вторую статью я посвящу тому, как "слепить" снеговика, положить подарки под ёлку и всё это припорошить сверху снегом.

Базовая идея

Весь рисунок - это набор математических функций от двух аргументов, x и y. Все они так или иначе базируются на SDF. Для рисования графиков использовался desmos.com.

Базовые функции

Ограничение нуля

x+\left|x\right|

Эллипс

\frac{\left(x-2\right)^{2}}{3}+\frac{\left(y-3\right)^{2}}{1}=1

Ёлка

Опишем основу ёлки

-\left(y-13\right)-2\left|x\right|=0

Добавим ветви

-0.2\cos\left(6.8y\right)\left(y-13\right)-2\left|x\right|=0

Пригнём кончики ветвей к земле

-0.2\cos\left(6.8y+0.7\left|x\right|\right)\left(y-13\right)-2\left|x\right|=0

Ограничим ель сверху

-0.2\cos\left(6.8y+0.7\left|x\right|\right)\left(y-13\right)-2\left|x\right|-0.51\left(y+\left|y\right|\right)=0

Ель съехала вниз, это исправится позднее

Параллельный ход: ограничение снизу

Ограничитель

2x=5\left(y-\left|y-2\right|\right)

Итог данного этапа

-0.2\cos\left(6.8y+0.7\left|x\right|\right)-2\left|x\right|+5\left(y-\left|y-2\right|\right)=0

Комбинируем

-0.2\cos\left(6.8y+0.7\left|x\right|\right)\left(y-13\right)-2\left|x\right|-0.51\left(y+\left|y\right|\right)+5\left(y-\left|y-2\right|\right)=0

Финальный штрих

2-0.2\cos\left(6.8y+0.7\left|x\right|\right)\left(y-13\right)-2\left|x\right|-0.51\left(y+\left|y\right|\right)+5\left(y-\left|y-2\right|\right)=0

Займёмся стволом

Эллипс с более острыми углами

\ 0.1x^{10}+30\left(y-1\right)^{10}-1=0

Объединение объектов

Объединение, пересечение и вырезание базируются на простейшей операции min(a, b). В зависимости от знаков перед a и b получаются различные булевы операции.

Листва - a(xy), ствол - b(xy)

-a\le0, b\le0

Финал

\min\left(-a,b\right)\le0

Все формулы для вставки в desmos.com

a=2-0.2\cos\left(6.8y+0.7\left|x\right|\right)\left(y-13\right)-2\left|x\right|-0.51\left(y+\left|y\right|\right)+5\left(y-\left|y-2\right|\right)

b\ =\ 0.1x^{10}+30\left(y-1\right)^{10}-1

\min\left(-a,\ b\right)\le0

Продолжение следует...