Как сделать ёлку, если ты математик #2
Продолжение вчерашней статьи, посвящённой fЁлке, ниже.
Базовые функции
Трапеция
Здесь дважды применяется модуль числа, меняя константы под модулем и вычитаемое мы можем регулировать длину отрезка с константным значением y и само значение y на данном отрезке. Данная функция позже пригодится для сугробов и ведра.
Альтернативный эллипс
Альтернативная запись эллипса. Константы внутри скобок отвечают за координаты центра эллипса, константы перед скобками – за степень сжатия по осям, число за корнем – радиус.
Эллипс по двум точкам
Согласно определению, эллипс – это замкнутая кривая, сумма расстояний каждой точки которой до двух точек (A и B на изображении) равна постоянной величине. Данный тип эллипса пригодится для рисования рук снеговику.
Прямоугольник
Это такая фигура, максимальное расстояние от точек которой до осей координат не превышает константного значения.
Если размер прямоугольника одинаков – его можно вынести за знак сравнения:
Снеговик
Тело – три эллипса
Объединение снеговика – операция min ко всем эллипсам.
Ведро на голову!
Шаг первый – трапеция
Шаг второй – доработаем форму, поднимем ведро
Для того, чтобы поднять ведро – добавляем 2 в начало, чтобы стенки ведра стали более крутыми – поставим множители перед модулями.
Шаг третий – ограничение снизу
Применим схожую методику, как делали это с ёлкой.
Черный график:
Красный график
Суммируем, получаем ограничитель для ведра
Применяем – ведро готово
Шаг пятый – наденем ведро на голову
Переместим
Объединим со снеговиком
Здесь минус перед s4 по той причине, что для получения ведра использовалось сравнение >0, вместо <0, когда велась работа с эллипсами.
Руки – эллипсы
Ось симметрии снеговика – это x = 10, поэтому можно создать две руки, а позже глаза и рот, одной функцией.
Пальцы аналогично, но симметрия не только по х = 10, но и у = 2.55
Тело снеговика по элементам
Результат тела снеговика
Лицо
Глаза – 2 круга
Рот – два эллипса
Все функции снеговика для вставки в desmos
s_{1}=sqrt{left(x-10right)^{2}+1.1left(y-2.7right)^{2}}-0.85
s_{2}=sqrt{left(x-10right)^{2}+1.2left(y-1.05right)^{2}}-1.15
s_{3}=sqrt{left(x-10right)^{2}+1.1left(y-3.85right)^{2}}-0.55
s_{4}=2-1.9left|x-9.7right|-1.9left|x-10.3right|-left(frac{left(left|y-4right|+y-4right)}{2}+frac{100left(left|y-4right|-y+4right)}{2}right)
h_{1}=sqrt{left(left|x-10right| – 0.8right)^{2}+left(y-2.7right)^{2}}+sqrt{left(left|x-10right| – 2.8right)^{2}+left(y-2.5right)^{2}}-2.015
h_{2}=sqrt{left(left|x-10right| – 1.9right)^{2}+left(y-2.55right)^{2}}+sqrt{left(left|x-10right| – 2.3right)^{2}+left(left|y-2.55right|-0.3right)^{2}}-0.51
minleft(s_{1}, s_{2},s_{3},-s_{4},h_{1},h_{2}right)le0
100left(left|x-10right|-0.2right)^{2}+100left(y-3.95right)^{2}le1
left(300left(left|x-10right|-0.03-0.-left(y-3.6right)right)^{2}+3000left(y-3.6right)^{2}right)le1
Сугробы
Сугробы – функция модуля синуса с константной частотой и изменяемой амплитудой. Амплитуду будем регулировать с помощью трапеций.
Суммируем
Результат
Все функции сугробов
d_{1}=-left|x+7right|-left|x-14right|+22
d_{2}=left|x+2.7right|+left|x-2.7right|-6.35
d_{3}=left|x-9right|+left|x-11right|-2.8
d=d_{1}+left|d_{1}right|+d_{2}-left|d_{2}right|+d_{3}-left|d_{3}right|
0.3dleft|sinleft(13xright)right|
Снежинки
Всё предельно просто. Снежинка – это “окружность наоборот”, вместо второй степени используется корень, а для того, чтобы он вычислялся используются модули x и у.
Много снежинок
Используем mod, остаток от деления
Результат
Корректировка снежинок
Снежинки закрывают ёлку и снеговика, исправим это с помощью эллипсов.
Комбинируем
Все формулы снежинок
f_{1}=sqrt{left|operatorname{mod}left(x,2right)-1right|}+sqrt{left|operatorname{mod}left(y,2right)-1right|}-0.45
f_{2}=2xx+left(y-6right)^{2}-40
f_{3}=2left(x-10right)^{2}+left(y-2.5right)^{2}-10
minleft(-f_{1},f_{2},f_{3}right)ge0
Подарки под ёлку
Подарок – это квадрат. Подарков будет два, поэтому используя |x| будем рисовать сразу два подарка и сразу два бантика к ним.
Формула
maxleft(left|left|xright|-2.1right|,left|y-0.5right|right)le0.5
Бантики к подаркам
Модуль
Гипербола
Круг
Эллипс
Внезапный ход: множим эллипс на модуль
Комбинируем все элементы
Все формулы для бантиков
j_{1}=left|0.9left|left|xright|-2.1right|right|-left(y-1right)-0.2
j_{2}=left|left|xright|-2.1right|^{2}-left(y-1right)^{2}-0.05
j_{3}=0.2left|left|xright|-2.1right|^{2}+0.2left(y-1right)^{2}-0.1
j_{4}=left(0.5left|left|xright|-2.1right|right)^{2}+left(y-1right)^{2}-0.02
maxleft(j_{1}j_{4}, -j_{2}, j_{3}right)le0
Цифры
Для начала зададим локальную систему координат, это будет полезно, когда мы будем двигать надпись.
2021 в римской системе счисления будет MMXXI, это несколько упрощает задачу
Две буквы “М”
Определим для начала функцию t2, которая будет ограничивать каждую букву М
Теперь “окошки”, чтобы у букв появились вертикальные элементы
Теперь V-образные элементы
Скомбинируем в одну формулу
Две буквы “Х”
Применяем знакомые ограничители
Крестообразные элементы
Объединим
Сдвинем на 4.1 вправо, теперь ХХ займут своё место
Одна буква “I”
Тривиально, сразу же поставим “I” на её место
Все формулы для букв
t_{2}=maxleft(left|left|x_{1}right|-1right|,left|y_{1}-0.89right|right)-0.95
maxleft(minleft(-t_{2},maxleft(left|1.2left|x_{1}right|-1.2right|,left|y_{1}-0.9right|right)-1right),minleft(left|2left|x_{1}right|-2right|-y_{1},-left|2left|x_{1}right|-2right|+y_{1}+0.2,-t_{2}right)right)ge0
maxleft(-minleft(left|left|x_{1}-4.1right|-1.05right|-left|y_{1}-0.9right|, -left|left|x_{1}-4.1right|-1.05right|+left|y_{1}-0.9right|+0.15right),maxleft(left|left|x_{1}-4.1right|-1.05right|,left|y_{1}-0.9right|right)-1right)le0
Сдвинем локальную систему координат
Краткие замечания по работе
Первое, на что хочется обратить внимание – то, что для рисунка применялись функции, неограниченные искусственно, как например sin(x), x∈(-5, 5). Все ограничения создаются естественным путём на базе арифметических операций с функциями.
Минимум и максимум также можно выразить с помощью простейших операций:
Поэтому использование функций min и max в формулах фигур легально в данной задаче.