Как сделать ёлку, если ты математик #2

Моя цель - предложение широкого ассортимента товаров и услуг на постоянно высоком качестве обслуживания по самым выгодным ценам.

Продолжение вчерашней статьи, посвящённой fЁлке, ниже.

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

Трапеция

y=\left|x-4\right|+\left|x+2\right|-5.5

Здесь дважды применяется модуль числа, меняя константы под модулем и вычитаемое мы можем регулировать длину отрезка с константным значением y и само значение y на данном отрезке. Данная функция позже пригодится для сугробов и ведра.

Альтернативный эллипс

\sqrt{\left(x-1\right)^{2}+1.9\left(y-2\right)^{2}}-1.3=0

Альтернативная запись эллипса. Константы внутри скобок отвечают за координаты центра эллипса, константы перед скобками - за степень сжатия по осям, число за корнем - радиус.

Эллипс по двум точкам

\sqrt{\left(x-1\right)^{2}+\left(y-2\right)^{2}}+\sqrt{\left(x-0.1\right)^{2}+\left(y+1\right)^{2}}-3.3=0

Согласно определению, эллипс - это замкнутая кривая, сумма расстояний каждой точки которой до двух точек (A и B на изображении) равна постоянной величине. Данный тип эллипса пригодится для рисования рук снеговику.

Прямоугольник

Это такая фигура, максимальное расстояние от точек которой до осей координат не превышает константного значения.

\max\left(\left|x\right|-1,\left|y\right|-1\right)\le0

Если размер прямоугольника одинаков - его можно вынести за знак сравнения:

\max\left(\left|x\right|,\left|y\right|\right)\le1

Снеговик

Тело - три эллипса

s_{1}=\sqrt{\left(x-10\right)^{2}+1.1\left(y-3.85\right)^{2}}-0.55s_{2}=\sqrt{\left(x-10\right)^{2}+1.1\left(y-2.7\right)^{2}}-0.85s_{3}=\sqrt{\left(x-10\right)^{2}+1.2\left(y-1.05\right)^{2}}-1.15s_1>=0, s_2>=0, s_3>=0

Объединение снеговика - операция min ко всем эллипсам.

\min\left(s_{1},\ s_{2},s_{3}\right)\le0

Ведро на голову!

Шаг первый - трапеция

-\left|x-1\right|-\left|x+1\right|-y\ge0

Шаг второй - доработаем форму, поднимем ведро

2-1.9\left|x-0.3\right|-1.9\left|x+0.3\right|-y\ge0

Для того, чтобы поднять ведро - добавляем 2 в начало, чтобы стенки ведра стали более крутыми - поставим множители перед модулями.

Шаг третий - ограничение снизу

Применим схожую методику, как делали это с ёлкой.

Черный график:

x=\frac{\left(\left|y\right|+y\right)}{2}

Красный график

x=\frac{100\left(\left|y\right|-y\right)}{2}

Суммируем, получаем ограничитель для ведра

x=\left(\frac{\left(\left|y\right|+y\right)}{2}+\frac{100\left(\left|y\right|-y\right)}{2}\right)

Применяем - ведро готово

2-1.9\left|x-0.3\right|-1.9\left|x+0.3\right|-\left(\frac{\left(\left|y\right|+y\right)}{2}+\frac{100\left(\left|y\right|-y\right)}{2}\right)\ge0

Шаг пятый - наденем ведро на голову

Переместим

2-1.9\left|x-9.7\right|-1.9\left|x-10.3\right|-\left(\frac{\left(\left|y-4\right|+y-4\right)}{2}+\frac{100\left(\left|y-4\right|-y+4\right)}{2}\right)\ge0

Объединим со снеговиком

s_{4}=2-1.9\left|x-9.7\right|-1.9\left|x-10.3\right|-\left(\frac{\left(\left|y-4\right|+y-4\right)}{2}+\frac{100\left(\left|y-4\right|-y+4\right)}{2}\right)\min\left(s_{1},\ s_{2},s_{3},-s_{4}\right)\le0

Здесь минус перед s4 по той причине, что для получения ведра использовалось сравнение >0, вместо <0, когда велась работа с эллипсами.

Руки - эллипсы

Ось симметрии снеговика - это x = 10, поэтому можно создать две руки, а позже глаза и рот, одной функцией.

h_{1}=\sqrt{\left(\left|x-10\right|\ -\ 0.8\right)^{2}+\left(y-2.7\right)^{2}}+\sqrt{\left(\left|x-10\right|\ -\ 2.8\right)^{2}+\left(y-2.5\right)^{2}}-2.015\\h_1\le0

Пальцы аналогично, но симметрия не только по х = 10, но и у = 2.55

h_{2}=\sqrt{\left(\left|x-10\right|\ -\ 1.9\right)^{2}+\left(y-2.55\right)^{2}}+\sqrt{\left(\left|x-10\right|\ -\ 2.3\right)^{2}+\left(\left|y-2.55\right|-0.3\right)^{2}}-0.51\\h_2\le0

Тело снеговика по элементам

Результат тела снеговика

\min\left(s_{1},\ s_{2},s_{3},-s_{4},h_{1},h_{2}\right)\le0

Лицо

Глаза - 2 круга

100\left(\left|x-10\right|-0.2\right)^{2}+100\left(y-3.95\right)^{2}\le1

Рот - два эллипса

\left(300\left(\left|x-10\right|-0.03-0.-\left(y-3.6\right)\right)^{2}+3000\left(y-3.6\right)^{2}\right)\le1

Все функции снеговика для вставки в desmos

s_{1}=\sqrt{\left(x-10\right)^{2}+1.1\left(y-2.7\right)^{2}}-0.85

s_{2}=\sqrt{\left(x-10\right)^{2}+1.2\left(y-1.05\right)^{2}}-1.15

s_{3}=\sqrt{\left(x-10\right)^{2}+1.1\left(y-3.85\right)^{2}}-0.55

s_{4}=2-1.9\left|x-9.7\right|-1.9\left|x-10.3\right|-\left(\frac{\left(\left|y-4\right|+y-4\right)}{2}+\frac{100\left(\left|y-4\right|-y+4\right)}{2}\right)

h_{1}=\sqrt{\left(\left|x-10\right|\ -\ 0.8\right)^{2}+\left(y-2.7\right)^{2}}+\sqrt{\left(\left|x-10\right|\ -\ 2.8\right)^{2}+\left(y-2.5\right)^{2}}-2.015

h_{2}=\sqrt{\left(\left|x-10\right|\ -\ 1.9\right)^{2}+\left(y-2.55\right)^{2}}+\sqrt{\left(\left|x-10\right|\ -\ 2.3\right)^{2}+\left(\left|y-2.55\right|-0.3\right)^{2}}-0.51

\min\left(s_{1},\ s_{2},s_{3},-s_{4},h_{1},h_{2}\right)\le0

100\left(\left|x-10\right|-0.2\right)^{2}+100\left(y-3.95\right)^{2}\le1

\left(300\left(\left|x-10\right|-0.03-0.-\left(y-3.6\right)\right)^{2}+3000\left(y-3.6\right)^{2}\right)\le1

Сугробы

Сугробы - функция модуля синуса с константной частотой и изменяемой амплитудой. Амплитуду будем регулировать с помощью трапеций.

d_{1}=-\left|x+7\right|-\left|x-14\right|+22\\d_{2}=\left|x+2.7\right|+\left|x-2.7\right|-6.35\\d_{3}=\left|x-9\right|+\left|x-11\right|-2.8

Суммируем

d=d_{1}+\left|d_{1}\right|+d_{2}-\left|d_{2}\right|+d_{3}-\left|d_{3}\right|

Результат

0.3d\left|\sin\left(13x\right)\right|

Все функции сугробов

d_{1}=-\left|x+7\right|-\left|x-14\right|+22

d_{2}=\left|x+2.7\right|+\left|x-2.7\right|-6.35

d_{3}=\left|x-9\right|+\left|x-11\right|-2.8

d=d_{1}+\left|d_{1}\right|+d_{2}-\left|d_{2}\right|+d_{3}-\left|d_{3}\right|

0.3d\left|\sin\left(13x\right)\right|

Снежинки

Всё предельно просто. Снежинка - это "окружность наоборот", вместо второй степени используется корень, а для того, чтобы он вычислялся используются модули x и у.

\sqrt{\left|x\right|}+\sqrt{\left|y\right|}-0.45\le0

Много снежинок

Используем mod, остаток от деления

\left|\operatorname{mod}\left(x,2\right)-1\right|

Результат

f_{1}=\sqrt{\left|\operatorname{mod}\left(x,2\right)-1\right|}+\sqrt{\left|\operatorname{mod}\left(y,2\right)-1\right|}-0.45\\f_1\le0

Корректировка снежинок

Снежинки закрывают ёлку и снеговика, исправим это с помощью эллипсов.

f_{2}=2xx+\left(y-6\right)^{2}-40\\f_{3}=2\left(x-10\right)^{2}+\left(y-2.5\right)^{2}-10\\f_2\le0\\f_3\le0

Комбинируем

\min\left(-f_{1},f_{2},f_{3}\right)\ge0

Все формулы снежинок

f_{1}=\sqrt{\left|\operatorname{mod}\left(x,2\right)-1\right|}+\sqrt{\left|\operatorname{mod}\left(y,2\right)-1\right|}-0.45

f_{2}=2xx+\left(y-6\right)^{2}-40

f_{3}=2\left(x-10\right)^{2}+\left(y-2.5\right)^{2}-10

\min\left(-f_{1},f_{2},f_{3}\right)\ge0

Подарки под ёлку

Подарок - это квадрат. Подарков будет два, поэтому используя |x| будем рисовать сразу два подарка и сразу два бантика к ним.

\max\left(\left|\left|x\right|-2.1\right|,\left|y-0.5\right|\right)\le0.5

Формула

\max\left(\left|\left|x\right|-2.1\right|,\left|y-0.5\right|\right)\le0.5

Бантики к подаркам

Модуль

j_{1}=\left|0.9\left|\left|x\right|-2.1\right|\right|-\left(y-1\right)-0.2\\j_1\le0

Гипербола

j_{2}=\left|\left|x\right|-2.1\right|^{2}-\left(y-1\right)^{2}-0.05\\j_2\ge0

Круг

j_{3}=0.2\left|\left|x\right|-2.1\right|^{2}+0.2\left(y-1\right)^{2}-0.1\\j_3\le0

Эллипс

j_{4}=\left(0.5\left|\left|x\right|-2.1\right|\right)^{2}+\left(y-1\right)^{2}-0.02\\j_4\le0

Внезапный ход: множим эллипс на модуль

j_1j_4\le0

Комбинируем все элементы

\max\left(j_{1}j_{4},\ -j_{2},\ j_{3}\right)\le0

Все формулы для бантиков

j_{1}=\left|0.9\left|\left|x\right|-2.1\right|\right|-\left(y-1\right)-0.2

j_{2}=\left|\left|x\right|-2.1\right|^{2}-\left(y-1\right)^{2}-0.05

j_{3}=0.2\left|\left|x\right|-2.1\right|^{2}+0.2\left(y-1\right)^{2}-0.1

j_{4}=\left(0.5\left|\left|x\right|-2.1\right|\right)^{2}+\left(y-1\right)^{2}-0.02

\max\left(j_{1}j_{4},\ -j_{2},\ j_{3}\right)\le0

Цифры

Для начала зададим локальную систему координат, это будет полезно, когда мы будем двигать надпись.

x_{1}=x\\y_{1}=y

2021 в римской системе счисления будет MMXXI, это несколько упрощает задачу

Две буквы "М"

Определим для начала функцию t2, которая будет ограничивать каждую букву М

t_{2}=\max\left(\left|\left|x_{1}\right|-1\right|,\left|y_{1}-0.89\right|\right)-0.95\\t_{2}\le0

Теперь "окошки", чтобы у букв появились вертикальные элементы

\max\left(\left|1.2\left|x_{1}\right|-1.2\right|,\left|y_{1}-0.9\right|\right)-1\ge0

Теперь V-образные элементы

\min\left(\left|2\left|x_{1}\right|-2\right|-y_{1},-\left|2\left|x_{1}\right|-2\right|+y_{1}+0.2,-t_{2}\right)\ge0

Скомбинируем в одну формулу

\max\left(\min\left(-t_{2},\max\left(\left|1.2\left|x_{1}\right|-1.2\right|,\left|y_{1}-0.9\right|\right)-1\right),\min\left(\left|2\left|x_{1}\right|-2\right|-y_{1},-\left|2\left|x_{1}\right|-2\right|+y_{1}+0.2,-t_{2}\right)\right)\ge0

Две буквы "Х"

Применяем знакомые ограничители

\max\left(\left|\left|x_{1}\right|-1.05\right|,\left|y_{1}-0.9\right|\right)-1\le0

Крестообразные элементы

\min\left(\left|\left|x_{1}\right|-1.05\right|-\left|y_{1}-0.9\right|,\ -\left|\left|x_{1}\right|-1.05\right|+\left|y_{1}-0.9\right|+0.15\right)\ge0

Объединим

\max\left(-\min\left(\left|\left|x_{1}\right|-1.05\right|-\left|y_{1}-0.9\right|,\ -\left|\left|x_{1}\right|-1.05\right|+\left|y_{1}-0.9\right|+0.15\right),\max\left(\left|\left|x_{1}\right|-1.05\right|,\left|y_{1}-0.9\right|\right)-1\right)\le0

Сдвинем на 4.1 вправо, теперь ХХ займут своё место

\max\left(-\min\left(\left|\left|x_{1}-4.1\right|-1.05\right|-\left|y_{1}-0.9\right|,\ -\left|\left|x_{1}-4.1\right|-1.05\right|+\left|y_{1}-0.9\right|+0.15\right),\max\left(\left|\left|x_{1}-4.1\right|-1.05\right|,\left|y_{1}-0.9\right|\right)-1\right)\le0

Одна буква "I"

Тривиально, сразу же поставим "I" на её место

\max\left(\left|x_{1}-6.4\right|-0.06,\left|y_{1}-0.9\right|-01\right)\le0

Все формулы для букв

t_{2}=\max\left(\left|\left|x_{1}\right|-1\right|,\left|y_{1}-0.89\right|\right)-0.95

\max\left(\min\left(-t_{2},\max\left(\left|1.2\left|x_{1}\right|-1.2\right|,\left|y_{1}-0.9\right|\right)-1\right),\min\left(\left|2\left|x_{1}\right|-2\right|-y_{1},-\left|2\left|x_{1}\right|-2\right|+y_{1}+0.2,-t_{2}\right)\right)\ge0

\max\left(-\min\left(\left|\left|x_{1}-4.1\right|-1.05\right|-\left|y_{1}-0.9\right|,\ -\left|\left|x_{1}-4.1\right|-1.05\right|+\left|y_{1}-0.9\right|+0.15\right),\max\left(\left|\left|x_{1}-4.1\right|-1.05\right|,\left|y_{1}-0.9\right|\right)-1\right)\le0

Сдвинем локальную систему координат

x_{1}=\left(x\ -8\right)\cdot1.3\\y_{1}=\left(y-9.3\right)\cdot1.3

Краткие замечания по работе

Первое, на что хочется обратить внимание - то, что для рисунка применялись функции, неограниченные искусственно, как например sin(x), x∈(-5, 5). Все ограничения создаются естественным путём на базе арифметических операций с функциями.

Минимум и максимум также можно выразить с помощью простейших операций:

min=\frac{f+g}{2}-\left|\frac{f-g}{2}\right|\\max=\frac{f+g}{2}+\left|\frac{f-g}{2}\right|

Поэтому использование функций min и max в формулах фигур легально в данной задаче.

Источник: https://habr.com/ru/post/535882/

Интересные статьи

Интересные статьи

Роджер Пенроуз стал лауреатом Нобелевской премии по физике 2020 года «за открытие того, что образование черных дыр является надежным предсказанием общей теории относительности». ...
Один из ключевых сценариев работы в CRM это общение с клиентом в удобном для него канале. По почте, по телефону, по SMS или в мессенджере. Особенно выделяется WhatsApp — интеграцию с ...
Меня зовут Александра Царева. Я и мои коллеги работаем над проектами в сфере компьютерного зрения в Центре машинного обучения компании «Инфосистемы Джет». Мне хочется поделиться наш...
Как не убить критикой, но и не скатиться в поверхностное ревью? Жирный PR против кучи мержей — что где выгоднее в зависимости от типа и размера проекта? А вот оно вообще правда нужно?...
Приветствую вас (лично вас, а не всех кто это читает)! Сегодня мы: Создадим приложение (навык) Алисы с использованием нового (октябрь 2019) сервиса Yandex Cloud Functions. Настроим н...