К основному контенту

Математическая звезда ко Дню защитника Отечества

Здесь я расскажу, как при помощи математических формул нарисовать красивую звездочку к 23 февраля. В конце записи вы найдете математическую открытку к 8 Марта.


Сразу оговорюсь, что звезду можно нарисовать, соединив вершины правильного пятиугольника через одну (статья на Википедии), но мне хотелось бы получить простую аналитическую формулу, которую можно записать в одну строчку.


Будем использовать полярные координаты : — длина радиус-вектора, — ориентированный угол между осью Ox и радиус-вектором.


Сначала нарисуем вот такую звездочку, а потом повернем ее на 90° против часовой стрелки.


Нам понадобится полярное уравнение прямой. Чтобы получить это уравнение, сначала запишем нормальное уравнение прямой:

Здесь — угол между вектором нормали к прямой и осью Ox, — отклонение начала координат от прямой, которое равно плюс или минус расстоянию от начала координат до прямой в зависимости от направления вектора нормали к прямой.
Подставляя в нормальное уравнение выражение декартовых координат через полярные , получаем полярное уравнение прямой:


Для того чтобы задать звезду в полярных координатах, разделим множество полярных углов (или, если хотите, единичную окружность) на 10 равных частей и на каждом промежутке зададим прямую со своими параметрами и . Заметим, что в силу симметрии звезды параметр будет один и тот же для всех прямых (для всех ).

Посмотрите на картинку в самом начале записи. Последняя формула — это итоговое уравнение звезды, связывающее полярные координаты и . Это уравнение получается из уравнения преобразованием поворота звезды на угол против часовой стрелки. — это кусочно-постоянная функция, определяющая угол наклона прямой на каждом промежутке полярных углов.



Найдем параметры и на промежутке (участок А на рисунке).
На рисунке — половина угла луча звезды, — вектор нормали к прямой.
Для данного промежутка , параметр находим из полярного уравнения прямой для : . Здесь — расстояние от начала координат до вершины звезды.
Как было сказано выше, для всех участков параметр один и тот же, мы его уже нашли. Для участка Б параметр будет противоположный: .

Теперь нам остается найти значения параметра для остальных лучей звезды. Пронумеруем их: для рассмотренного луча звезды при порядковый номер . Порядковому номеру соответствует промежуток .

Очевидно, что при переходе от луча звезды к следующему к параметру прибавляется . Следовательно, для луча с номером имеем (*).

Для заданного номер луча можно найти из неравенства . Получим .

Каждый луч звезды состоит из двух отрезков: на промежутке в формуле (*) для нужно взять знак «минус», а для промежутка — знак «плюс».
Знак можно записать следующим образом: .

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

Параметр (половина угла луча звезды) можно варьировать. Приведенная в начале звезда соответствует значению . При получаем звездочку, похожую на морскую звезду:

При получаем остроконечную звезду:


Чтобы нарисовать звезду в Wolfram Mathematica, можно использовать следующий код:

gamma = Pi/10;
rho = 1;
p = rho*Sin[gamma];
k[phi_] := Floor[(phi + 0.2*Pi)/(0.4*Pi)];
s[phi_] := Sign[phi - 0.4*k[phi]*Pi];
alpha[phi_] := s[phi]*(Pi/2 - gamma) + 0.4*k[phi]*Pi;
PolarPlot[p/Cos[phi - Pi/2 - alpha[phi - Pi/2]],
{phi, 0, 2*Pi}, PlotStyle -> Directive[Red, Thickness[0.01]]]


В заключение приведу математическую открытку к 8 Марта.
Эта кривая — не что иное, как перевернутая лемниската Бернулли.



Дополнение от Владимира Духно, 29.06.2014:

При получаем правильный пятиугольник:

Можно обобщить формулу звезды на случай произвольного числа вершин.
Исходный код:

n = 11;
rho = 1;
gamma = Pi/20;
p = rho*Sin[gamma];
beta = 2*Pi/n;
v[phi_] := phi + 3*Pi/2;
k[phi_] := 2*FractionalPart[1/2*IntegerPart[2*v[phi]/beta]];
u[phi_] := v[phi] - beta*IntegerPart[v[phi]/beta];
s[phi_] := Sign[u[phi] - beta/2];
r[phi_] := p/Cos[Pi/2 - gamma - beta*k[phi] + s[phi]*u[phi]];
PolarPlot[r[phi], {phi, 0, 2*Pi},
 PlotStyle -> Directive[Orange, Thickness[0.01]]]



Комментарии