Как нарисовать звезду (и не только) в полярных координатах
Вопрос о формуле для многоугольника в полярных координатах регулярно возникает на тематических ресурсах — и так же регулярно остаётся без внятного ответа. В лучшем случае попадается решение через функцию остатка от деления — что не является «чистым» с математической точки зрения, поскольку не позволяет производить над функцией аналитические преобразования. Видимо, настоящие математики слишком заняты решением проблем тысячелетия и поисками простого доказательства теоремы Ферма, чтобы обращать внимание на подобные банальные задачи. К счастью, в этом вопросе воображение важнее знания, и для решения этой задачи не нужно быть профессором топологических наук — достаточно знания школьного уровня.
Формула для равностороннего многоугольника в полярных координатах выглядит очень просто
и имеет следующие параметры:
— угол;
— количество выпуклых вершин;
— определяет, через какое количество вершин стороны будут лежать на одной прямой. Для него допустимы и отрицательные значения — от знака будет зависеть, в какую сторону будет выгибаться звезда;
— жёсткость — при мы получим окружность вне зависимости от прочих параметров, при — многоугольник с прямыми линиями, при промежуточных значениях от до — промежуточные фигуры между окружностью и многоугольником.
С этой формулой можно нарисовать звезду двумя путями:
1)
2) . В этом случае требуется сделать два оборота вместо одного:
Параметр влияет на многоугольник следующим образом (здесь он изменяется от -1 до 5):
Параметр в анимации:
Комплексная форма и модификации
Можно переписать исходную формулу в комплексном виде, и, несмотря на наличие в ней мнимых единиц, значение радиуса по-прежнему будет оставаться действительным:
На первый взгляд это может показаться бессмысленным, поскольку формула стала чуть более громоздкой —, но не стоит спешить с выводами. Во-первых, в ней отсутствует арксинус, что полностью меняет математический смысл формулы и позволяет по-другому посмотреть на построение звёздчатого многоугольника. Во-вторых, из неё также можно получить компактные формулы для частных случаев, например . В-третьих (и самое интересное), её можно творчески модифицировать и получать другие, неожиданные формы. Для того, чтобы появление возможной мнимой компоненты в радиусе не вызывало неоднозначности при вычислении, можно её сразу привести к декартовым координатам умножением на . Вот примеры некоторых модификаций:
Как вы наверняка заметили, вращение вектора перестало быть равномерным — и именно из-за появления мнимой составляющей в радиусе.
Квадрокруги и прочее
У нашей формулы есть замечательный частный случай — квадрат, формулу для которого можно выписать как
или
(выбирайте, какая больше нравится).
В чуть более развёрнутом случае можно определить промежуточные фигуры между кругом и квадратом через точку на плоскости
Можно также добавить вариативности этим фигурам с сохранением условия прохождения их через точку — модулируя непосредственно сам параметр в зависимости от угла таким образом, чтобы при прохождении через диагонали его множитель был равен единице. Например, подставив вместо функцию , мы получим дополнительный параметр , которым можно регулировать дополнительные изгибы. В частности, для получится следующее:
В ещё более развёрнутом случае можно определить не просто квадрат —, а прямоугольник, и по прежнему в полярных координатах:
И даже посчитать его площадь (через эллиптические интегралы):
Это позволит делать профили с переходом из окружности в прямоугольник с контролируемой площадью сечения. Здесь площадь константна:
А здесь площадь расширяется по экспоненциальному закону:
Переход к декартовым координатам
Любую формулу в полярных координатах можно выразить через уравнение в декартовых координатах, причём как минимум двумя способами — в зависимости от чего будет изменяться вид градиента на границе фигуры. Для этого достаточно посчитать угол через арктангенс от координат и привести формулу к константе через радиус-вектор вычитанием
или делением
Второй вариант предпочтительнее, поскольку даёт прямые градиенты вдоль сторон многоугольника.
Выражение также можно упростить до , коэффициенты числителя которого при разложении образуют знакочередующий вариант последовательности A034839.
Значение формулы из правой части уравнения (во 2-м случае) будет меняться от до если точка попадает внутрь фигуры, и от до бесконечности — если нет. Выбирая различные функции для преобразования её в яркость, можно получать различные варианты растеризации. Для экспоненты ( для первого и для второго варианта) получим
или, если с насыщением
Можно использовать классический фильтр нижних частот , в котором — порядок фильтра, определяющий степень затухания.
Для первого варианта:
И для второго:
Можно использовать и кусочно-непрерывную функцию, явно задавая границы интерполяции.
Помимо растеризации как таковой, можно задавать и деформации — например, сжать шахматную доску в круг:
Или даже натянуть её на сферу:
Appendix: как была получена формула
Классический стиль повествования в математических текстах состоит из чередования лемм/теорем и их доказательств — как если бы доказуемые утверждения появлялись у авторов в голове откровением свыше. И хотя в этом и бывает доля истины, чаще появлению формул предшествует некоторая исследовательская работа, описание которой может дать большее понимание их смысла, чем формальное доказательство;, а верность утверждений, в свою очередь, можно проследить через верность шагов, к ним приведших.
Так и здесь — если бы статья началась с формулы в комплексной форме, то её появление было бы неочевидным и контр-интуитивным, а заявленные свойства требовали бы дополнительных доказательств. Но в тригонометрической форме записи историю её появления вполне возможно проследить.
1) начинаем с самого простого случая — задаче начертить прямую в полярных координатах. Для этого нужно решить уравнение , решение которого очевидно .
2) далее аргумент секанса нужно «зациклить», чтобы обеспечить изломы в прямой. Именно на этом этапе другие решения используют «грязный хак» в виде остатка от деления. Здесь же используется последовательное взятие прямой и обратной функции синуса —
Такой подход позволяет производить стандартные математические операции над получившейся формулой,
Благодаря этой же записи можно упростить функцию квадрата в полярных координатах до более эстетического вида, используя представление тригонометрический функций в комплексном виде. В Wolfram Mathematica это можно сделать с помощью функций TrigToExp и ExpToTrig:
Sec[1/2 ArcSin[k Sin[2 \[Phi]]]]^2//TrigToExp//ExpToTrig//Sqrt[#]&//FullSimplify
↓
Благодаря этой же записи можно получить гладкие промежуточные фигуры между кругом и квадратом с помощью дополнительного множителя , благодаря которому аргумент арксинуса не дотягивает до единицы — :
А для того, чтобы функция пересекала заданную точку, нужно просто составить уравнение и пересчитать :
Solve[(Sqrt[2/(1+Sqrt[1-k Sin[2 \[Phi]]^2])] /. \[Phi]->Pi/4)==x, k] /. x->k
↓
3) параметры и были просто добавлены творческим способом и их влияние исследовалось экспериментально, по факту.
4) Прямоугольник легко получить перейдя к параметрическому виду и «растягиванием» осей
Но после этого уже не будет значить угол, теперь — это просто параметр, который описывает вектор через его проекции на координатные оси. Чтобы перейти обратно к полярным координатам нужно найти длину вектора (через корень суммы квадратов), угол (через арктангенс отношения), выразить этот угол через и подставить получившееся выражение вместо .
With[{r = Sqrt[2/(1 + Sqrt[
1 - Sin[2 t]^2])]}, {Sqrt[(a r Cos[t])^2 + (b r Sin[t])^2],
ArcTan[(b r Sin[t])/(a r Cos[t])]}] // Simplify
↓
Solve[ArcTan[(b Tan[t])/a]==\[Phi], t]
↓
Sqrt[2] Sqrt[(a^2 Cos[t]^2 + b^2 Sin[t]^2)/(1 + Sqrt[Cos[2 t]^2])]
/. t -> ArcTan[(a Tan[\[Phi]])/b] // Simplify
↓
Упростить такую формулу уже посложнее, и для этого потребуется несколько этапов:
1) перейти к декартовым координатам заменой ;
2) перейти к экспоненциальному виду;
3) упростить;
4) сделать обратную замену и ;
5) опять перейти к экспоненциальному виду;
6) упростить.
В результате получим такую формулу:
Sqrt[2] Sqrt[(a^2 b^2 Sec[\[Phi]]^2) /
((1 + Sqrt[Cos[2 ArcTan[(a Tan[\[Phi]])/b]]^2])
(b^2 + a^2 Tan[\[Phi]]^2))] /. \[Phi] -> ArcTan[x, y]
// TrigToExp // Simplify
// # /. {x -> Cos[\[Phi]], y -> Sin[\[Phi]]} &
// TrigToExp // Simplify // FullSimplify
↓
Заключение
Как видите, даже в такой простой и банальной вещи как многоугольник, можно найти и придумать что-то новое. И на этом история не заканчивается — осталась неизвестной формула площади для общего случая, осталась неизвестной формула для произвольного, а не только правильного многоугольника, остались без рассмотрения разложения в степенные и тригонометрические ряды. Также, вероятно, подобного рода формула существует и для 3-мерного случая.
Поэтому если вам говорят, что в математике уже всё придумано и остались лишь задачи недоступные пониманию обычного человека — не верьте. Есть много сугубо практических задач, о существовании которых настоящие математики не подозревают, или их решение им не интересно из-за отсутствия достаточного хайпа вокруг них, или потому что у них есть примерное представление путей достижения для их решения. Не бойтесь браться за задачи, решение которых отсутствует в википедии, не бойтесь публиковать их решения и не бойтесь читать комментарии под статьями о бесполезности всего сущего.