Поздравляю Хабр и Хаброжителей с Новым 2021 годом и дарю всем нам вот такую незатейливую и приятную Функциональную Ёлку (fЁлка). В этой статье я рассказываю как сделать ёлочку на мониторе за 10 минут. Свою вторую статью я посвящу тому, как "слепить" снеговика, положить подарки под ёлку и всё это припорошить сверху снегом.
Базовая идея
Весь рисунок - это набор математических функций от двух аргументов, x и y. Все они так или иначе базируются на SDF. Для рисования графиков использовался desmos.com.
![](https://habrastorage.org/getpro/habr/upload_files/903/f2e/5ed/903f2e5ed85cfe028ee3793a574c3e30.png)
Базовые функции
Ограничение нуля
![](https://habrastorage.org/getpro/habr/upload_files/c6e/c38/84d/c6ec3884df1d151a3db12a99e84f90cd.png)
Эллипс
![](https://habrastorage.org/getpro/habr/upload_files/f71/62d/024/f7162d0242427ba48a56cdac0ff25834.png)
Ёлка
Опишем основу ёлки
![](https://habrastorage.org/getpro/habr/upload_files/ead/115/33c/ead11533cffe6c2a60a51bbfa6eef577.png)
Добавим ветви
![](https://habrastorage.org/getpro/habr/upload_files/2ea/61a/4e0/2ea61a4e0bc3dcfec090e6adc873c273.png)
Пригнём кончики ветвей к земле
![](https://habrastorage.org/getpro/habr/upload_files/943/cca/583/943cca58326d84e247f24cef6e6c7891.png)
Ограничим ель сверху
![](https://habrastorage.org/getpro/habr/upload_files/08a/059/05f/08a05905f75ad3b949bf9f30e1eaabb5.png)
Ель съехала вниз, это исправится позднее
Параллельный ход: ограничение снизу
Ограничитель
![](https://habrastorage.org/getpro/habr/upload_files/1fd/09a/df4/1fd09adf4bd5cc8f480857d507832b36.png)
Итог данного этапа
![](https://habrastorage.org/getpro/habr/upload_files/255/e3f/f1e/255e3ff1e5648898a001c872de6d102c.png)
Комбинируем
![](https://habrastorage.org/getpro/habr/upload_files/c9b/b46/a5c/c9bb46a5c60b58f49068b3d978b824ef.png)
Финальный штрих
![](https://habrastorage.org/getpro/habr/upload_files/593/65a/acf/59365aacfdbdf01d44f00037e3273553.png)
Займёмся стволом
Эллипс с более острыми углами
![](https://habrastorage.org/getpro/habr/upload_files/66f/f0e/7ed/66ff0e7edefcb35441abb85651842667.png)
Объединение объектов
Объединение, пересечение и вырезание базируются на простейшей операции min(a, b). В зависимости от знаков перед a и b получаются различные булевы операции.
Листва - a(xy), ствол - b(xy)
![](https://habrastorage.org/getpro/habr/upload_files/485/edd/47a/485edd47af9bf7ba44d10e930bc0301c.png)
Финал
![](https://habrastorage.org/getpro/habr/upload_files/c1f/293/d0c/c1f293d0c07d1c3b6fa6961fa3ec1cac.png)
Все формулы для вставки в 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
Продолжение следует...