Комплексные числа и геометрические узоры
▍ Окружность
Когда нам нужно начертить окружность в реальной жизни — мы берём циркуль и, уперев его одним (острым) концом, а другим (с грифелем) постепенно вращая, оставляем след на бумаге. В математике это делается аналогично — в роли циркуля выступает мнимая единица , а в роли вращения — возведение её в степень переменной , которую можно интерпретировать как момент времени (а в данном конкретном случае — как угол поворота). Здесь вектор описывает полный круг при изменении значения от до — что также удобно интерпретировать как четверти на координатной плоскости, когда при изменении целой части одна из проекций на координатную ось меняет свой знак.
Возможно, выражение кому-то может показаться несколько непривычным, поскольку оно не употребляется в традиционных учебниках математики. В таком случае можно использовать каноническую запись, перейдя к основанию : .
Также в качестве основания можно использовать минус единицу: , что часто используется в Wolfram Mathematica для описания единичных комплексных констант.
Разница между функциями , и состоит лишь в периоде для полного оборота вектора по окружности — , или . Запись с экспонентой является исторически первой, однако её сложно назвать наглядной — возведение в комплексную степень несколько контринтуитивно. В этой же статье вариант выбран по причине его большей компактности и наглядности.
▍ Эллипс
Эллипс можно начертить растягиванием окружности вдоль одной из осей. Но в таком случае это получится самый обычный параметрический график с участием тригонометрических функций, но без участия комплексных чисел. В комплексных же числах эллипс можно представить как сумму двух векторов разной длины и вращающихся с одной частотой, но в противоположные стороны:
Поскольку в комплексных числах результат суммы тоже не зависит от порядка слагаемых, эту же анимацию можно представить чуть по-другому:
Используя формулу в полярных координатах, можно начертить эллипс одним вектором, но с динамически изменяемой длиной:
Несмотря на то, что фигуры получаются одинаковыми, положение точки (и скорость) в каждый момент времени не совпадают, что хорошо видно на анимации. Поэтому производные этих эллипсов совпадать не будут:
Примечательно, что производная от эллипса, задаваемого суммой двух векторов, осталась тем же эллипсом с теми же пропорциями. Ну, а теперь — самое главное преимущество комплексных чисел: чтобы повернуть эллипс на произвольный угол, достаточно просто умножить его на единичный вектор с необходимым углом поворота (phi):
▍ Гипотрохоида и прочее
Усложнение получаемых фигур достигается усложнением их мат.модели. Достаточно изменить частоту второго вектора, и можно получить нечто более интересное, а именно — математическую модель спирографа:
Здесь необходимо обратить внимание на то, что для получения замкнутой кривой одного оборота по окружности оказалось недостаточно — их потребовалось уже 3 и 4 соответственно. Это явилось следствием того, что период второго вектора не укладывается нацело в период первого вектора.
Можно и дальше добавлять векторы и получать всё более и более сложные фигуры:
▍ Синусы и синусоидные ленты
Давайте немного отвлечёмся от окружностей и начертим синус. Традиционная запись синусоиды выглядит так:
В комплекcном виде формула для синусоды выглядит не намного сложнее
а график, естественно, выглядит аналогично:
Легко видеть, как была получена это формула — правую часть равенства мы умножили на мнимую единицу, знак равенства заменили на плюс, а и заменили на одну и ту же параметрическую переменную — . Принципиальная разница между этими формулами получилась в том, что теперь можно взять и повернуть синусоиду, просто умножив её на единичный вектор с нужным углом наклона (здесь 45°). Подобные трансформации синусодиды могут потребоваться для того, чтобы направлять её вдоль заданных кривых:
В параметрической форме записи можно модулировать координаты, получая таким образом различные деформации синусоиды, на первый взгляд не имеющих ничего общего с оригиналом:
Количество синусоид можно увеличивать, добиваясь эффекта заполнения пространства за счёт равномерного сдвига фаз между ними:
Здесь — количество синусоид, а — порядковый номер синусоиды.
Смещение можно задавать и просто смещением координат — как по одной координате, так и по двум:
▍ Розетты
Теперь можно попробовать и более сложные варианты — добавить фигурам заполнения. Есть два пути для этого:
1) взять центральную кривую, от которой в обе стороны осциллирует синусоида. Это творческий метод, поскольку внутренняя и внешняя огибающие будут зависеть от множества параметров и могут оказаться весьма неожиданными. Здесь также дополнительной сложностью будет вычисление нормали для синусоидной ленты. Несмотря на то, что её легко вычислить дифференцированием нашей кривой (и умножением на мнимую единицу) с последующей нормировкой функцией , более интересные варианты получаются заданием её явным образом, в простейшем случае — нормалью к окружности.
2) явно задать внутреннюю и внешние огибающие, а конкретную точку между ними находить интерполяцией всё той же синусоидой. Этот вариант чуть сложнее, зато более предсказуемый.
Начнём с простого:
Обратите внимание: здесь мы не использовали синусоидную ленту —, а обошлись лишь одной синусоидой, с некратным периодом 8/5. Для того, чтобы она замкнулась, потребовалось 5 полных оборотов (да, совпадение со знаменателем периода не случайно). Также обратите внимание, что направляющая для синусоиды не перпендикулярна центральной линии — потому что это условие в неё и не закладывалось. А если мы захотим его заложить — то потребуется продифференцировать кривую и повернуть её на 90° умножением на мнимую единицу:
Как видно, получился тоже эллипс, только с другим масштабом (и сдвигом фазы на 90° что в нашем случае значения не имеет). Используя эту функцию (с коррекцией масштаба) в качестве направляющей для синусоидной ленты получим следующую формулу:
Последний штрих — нормировать длину направляющей к единице, чтобы ширина заполняющей ленты была одинаковой (или явно заданной амплитуды). Сделать это можно функцией или, что то же самое, через деление на абсолютное значение (которое считается как квадратный корень суммы квадратов мнимой и действительной части).
Ну и напоследок — несколько примеров «творческих» орнаментов, полученных просто случайным подбором параметров:
▍ Розетты с интерполяцией
Для второго подхода, интерполяцией между двумя явно заданными огибающими, потребуется вспомогательная функция для изменения масштаба:
в которой при изменении в диапазоне от до результат функции изменяется соответственно в диапазоне от до . Во многих системах компьютерной алгебры существуют уже предопределённые функции для этого, и в частности в Wolfram Мathematica ею является функция . Далее мы будем пользоваться таким же синтаксисом — группируя входные и выходные границы в фигурные скобки, для наглядности.
Итак, если в качестве границ взять эллипс и круг, то получится что-то вроде этого:
Эту формулу можно записать явным образом без использования функции , подставив аргументы в её определение и упростив:
Однако в таком случае логика работы этой формулы становится намного менее очевидной, и вносить в неё изменения исходя из изначальной логики построения становится намного сложнее.
Поскольку огибающие нам точно известны, то такие фигуры можно комбинировать, использовав одну и ту же огибающую для соседних фигур:
Или чуть сложнее:
Огибающие, вообще говоря, не обязаны быть гладкими. Используя ранее выведенную формулу, в качестве огибающих можно использовать и многоугольники:
Огибающие можно сделать более выраженными, если синусоиду немного «оквадратить»:
Можно пойти ещё дальше по пути выпрямления и вместо заполнения синусоидой просто использовать прямые отрезки:
▍ Бордюры
Вместо того, чтобы строить синусоидные ленты очевидным способом, их тоже можно получать интерполяцией между двумя прямыми:
Если эту формулу символьно вычислить и упростить, то получим уже известную формулу синусоиды в параметрическом виде:
Запись через функцию позволяет более просто контролировать границы ленты для того, чтобы их можно было собирать как пазл. Например, сделав одну сторону короче другой, можно получить угол в 45° и собрать рамку:
В качестве границ интерполяции можно брать и любые другие кривые:
Можно добавить вариативности и заполнению, модулируя либо координаты границ интерполяции
либо частоту заполняющей синусоиды
▍ Заключение
Здесь были рассмотрены самые простые, базовые техники и фигуры. В качестве дальнейшего развития можно использовать и более сложные математические модели для описания огибающих, в том числе кусочно-непрерывные функции типа кривых Безье, и различные варианты их заполнения. Также комплексные числа можно использовать не только для графики как таковой, но и для описания траекторий различных механизмов типа механизма Чебышёва, что позволит аналитически находить оптимальные параметры и свойства таких механизмов. А если с комплексных чисел перейти на кватернионы — то можно рассматривать подобные построения и в 3Д-пространстве.
Разумеется, подобные задачи можно решать и без комплексных чисел — используя векторы и матричное исчисление, как собственно в основном все и делают. Однако комплексные числа представляются более подходящим инструментом для этого — как минимум более компактным, наглядным и с бОльшим простором для манипуляций, включая интегрирование/дифференцирование, разложение в ряд, преобразование Фурье и прочие инструменты функционального анализа. Впрочем, тема «комплексные числа vs. матрицы» выглядит довольно холиварной — поэтому и продолжить её предлагается уже в комментариях.