Продолжим тему бильярдных фракталов.
![](https://webcf.waybackmachine.org/web/20220529061415im_/https://habrastorage.org/r/w1560/webt/jb/ki/nd/jbkindqzsklr0ly3xblx8lkrgfc.png)
В статье присутствуют Gif (трафик!) и контрастные картинки. У эпилептиков может случиться эпилептический припадок.
Предыдущие части: 0, 1, 2.
Для начала вспомним, что за «бильярдные фракталы».
Есть у нас некоторая прямоугольная область («бильярд»), в которой движется бильярдный шар (или луч света).
![](https://webcf.waybackmachine.org/web/20220529061415im_/https://habrastorage.org/r/w1560/webt/jv/jf/wh/jvjfwhbyinonpkoh0orhozxc-_k.png)
Шар упруго отражается от стенок по законам оптики (угол отражения равен углу падения). При этом шар бесконечно мал (абстрактная «материальная точка» из физики) и при движении и отражении скорости не меняет (скорость нас вообще не интересует).
Когда шар касается одной из выбранных стенок (не важно, какую стенку выбирать, но для примера выберем верхнюю) — фиксируем, в какую сторону движется шар — в левую или в правую:
![](https://webcf.waybackmachine.org/web/20220529061415im_/https://habrastorage.org/r/w1560/webt/7f/5u/fo/7f5ufotnextd8w4gxo-8gsflmfc.png)
![](https://webcf.waybackmachine.org/web/20220529061415im_/https://habrastorage.org/r/w1560/webt/gs/mr/3l/gsmr3ld3pj8ids2poajw8xlewi8.png)
Для бильряда, соотношение сторон которого — иррациональное число, последовательность отражений — фрактальная (насколько этот термин применим к двоичным последовательностям). Или фракталообразующая. Если визуализировать такую последовательность с помощью черепашьей графики, мы получим фрактал.
В качестве примера можем использовать последовательность для бильярда, соотношение сторон которого равно
.
Строить такие последовательность очень легко:
Берем поочередно каждое целое число
, умножаем на
, отбрасываем дробную часть и отмечаем четные целые части единицами, а нечетные — нулями.
Первые 100 элементов этой последовательности:
0100110110010011001001101100110110010011011001101100100110010011011001001100100110110011011001001100
Визуализация этой последовательности с помощью черепашьей графики дает нам следующую фигуру:
![](https://webcf.waybackmachine.org/web/20220529061415im_/https://habrastorage.org/r/w1560/webt/ka/n-/l4/kan-l4lbqdwkd0eqibmgcfcvydu.png)
Более подробно о том, откуда взялась эта формула и о визуализации последовательностей с помощью черепашьей графики, можно почитать во второй части — Фракталы в иррациональных числах
В реальном мире, такие последовательности встречаются гораздо чаще, чем может показаться на первый взгляд. Два примера.
Пример 1. Есть у нас два человека. Один побольше, второй — поменьше:
![](https://webcf.waybackmachine.org/web/20220529061415im_/https://habrastorage.org/r/w780q1/webt/sf/j7/cn/sfj7cnpwsfr4qih-kucjbgk5g88.jpeg)
Эти два человека идут по улице. У высокого шире шаг, чем у низкого. Чтобы успевать за высоким, низкому приходится быстрее ногами двигать и больше шагов делать. В каждый момент времени, когда низкий ставит правую ногу на асфальт, фиксируем какая нога высокого находится в воздухе — левая или правая. Если частоты шагов низкого и высокого несинхронизированные — получим фрактальную последовательность.
Пример 2. Вокруг некоторой планеты вращается спутник:
![](https://webcf.waybackmachine.org/web/20220529061415im_/https://habrastorage.org/r/w780q1/webt/br/ss/tk/brsstkwrsvqssdohsfvrgfmymwm.jpeg)
Выбираем временной интервал
произвольной длинны. Фиксируем в каком полушарии находится спутник в момент времени
— в южном или северном. Последовательность этих положений будет фрактальной, если соотношение длинны выбранного интервала с длинной интервала, за который спутник совершает полный оборот вокруг оси — иррациональное число.
Для наглядности, посмотрим на геометрическую интерпретацию бильярдных последовательностей.
![](https://webcf.waybackmachine.org/web/20220529061415im_/https://habrastorage.org/r/w1560/webt/p6/js/qt/p6jsqtpd_jtmuwkbum24g5gm7i8.png)
Для бильярда, соотношение сторон которого равно
, строим график функции
. Целые числа, отмеченные на оси
, делят плоскость на чередующиеся полосы (поочередно помечаем полосы единицами и нулями). Целыми числами на оси
отмечаем, через какую полосу проходит график функции — через полосу помеченную единицей или нулем.
Фактически, все что мы сделали, чтобы получить фрактальную последовательность — дискретизировали линейную функцию с иррациональным коэффициентом
. Если фрактальную последовательность можно получить дискретизацией линейной функции, первым делом напрашивается вопрос — а какую последовательность можно получить дискретизацией нелинейной функции?
Но прежде, чем переходить к нелинейным функциям, хотелось бы упомянуть об одном интересном наблюдении, сделанном в процессе написания статьи.
Вернемся к дискретизации нелинейных функций.
Например
, где
— действительное число. Самый простой пример — парабола (
).
![](https://webcf.waybackmachine.org/web/20220529061415im_/https://habrastorage.org/r/w1560/webt/m0/34/td/m034tdqelex3xu8ha4hznxr8m1k.png)
Строим последовательность:
Для целых аргументов
, записываем четность целой части (отбросив дробную) значения функции.
Первые 100 элементов этой последовательности:
0110010100111110000011000100010100000001010011010110001100101001010011111000000000100110111111111000
Визуализация этой последовательности с помощью черепашьей графики дает такую кривую:
![](https://webcf.waybackmachine.org/web/20220529061415im_/https://habrastorage.org/r/w1560/webt/vj/jd/al/vjjdalrj7iml-e3nxtcqdxsu-qo.png)
Эта последовательность выглядит немного более хаотичной, чем последовательность, полученная дискретизацией линейной функции. Но это не так. Если где-то не видим закономерность — значит плохо смотрим. Можем сделать очень простую визуализацию. Запишем первые 1000 элементов последовательности в блокнот, включим перенос строк.
![](https://webcf.waybackmachine.org/web/20220529061415im_/https://habrastorage.org/r/w1560/webt/vn/x4/az/vnx4azmmgyxnb1strxlvb9tweju.png)
Можно разглядеть паттерн.
Для того, чтобы лучше разглядеть, единички заменяем на █, нолики — на ░:
![](https://webcf.waybackmachine.org/web/20220529061415im_/https://habrastorage.org/r/w1560/webt/g9/dr/gn/g9drgn2ablachxbtmylt8tkvkrg.png)
Построим двухмерный график этой последовательности. На каждой следующей строчке
последовательность сдвигается на
(где
— целое число, константа) позиций влево. Перепишем
как
.
Для некоторых
:
35:
![](https://webcf.waybackmachine.org/web/20220529061415im_/https://habrastorage.org/r/w1560/webt/vt/_y/_h/vt_y_hrv8xldcv-hm__e0uwo2cu.png)
661:
![](https://webcf.waybackmachine.org/web/20220529061415im_/https://habrastorage.org/r/w1560/webt/p4/m_/vv/p4m_vvpzn6dwyu3m6pjugss984s.png)
Для
можем раскрыть скобки, получим
. Получили уравнение поверхности.
Для дальнейших экспериментов запишем уравнение в более общем виде:
Точно так же, как мы дискретизировали линейную функцию, мы можем дискретизировать поверхности второго порядка. Для этого считаем
для каждого
и
, после чего умножаем
на иррациональное число, отбрасываем дробную часть, проверяем четность целой части — ![$\lfloor z\sqrt {2} \rfloor \; (\textrm{mod} \; 2)$](https://webcf.waybackmachine.org/web/20220529061415im_/https://habrastorage.org/getpro/habr/formulas/18c/b02/58e/18cb0258e77dafd078f5db6fc0ba71e8.svg)
Для
наше уравнение принимает вид:
Это уравнение элиптического параболоида. Коэффициент
определяет, насколько параболоид вытянут по оси
. Для
:
![](https://webcf.waybackmachine.org/web/20220529061415im_/https://habrastorage.org/r/w1560/webt/jo/ks/vt/joksvtycb32dkqjrtnbyk2tklwq.png)
Для
получаем такой паттерн:
![](https://webcf.waybackmachine.org/web/20220529061415im_/https://habrastorage.org/r/w1560/webt/jm/i0/pa/jmi0padbl06lf5ahitbepkcfxqa.png)
Можем этот же паттерн нарисовать недискретным. Вместо
считаем
. Значение функции масштабируем (прибавляем 1, умножаем на 128) и используем в качестве яркости пикселя:
![](https://webcf.waybackmachine.org/web/20220529061415im_/https://habrastorage.org/r/w1560/webt/hz/ir/jk/hzirjkt-geoqk3urwrnq2gyknfo.png)
Для
, дискретный и недискретный варианты:
![](https://webcf.waybackmachine.org/web/20220529061415im_/https://habrastorage.org/r/w1560/webt/i5/-f/cl/i5-fclddtotjsdm-udsaadhgos8.png)
![](https://webcf.waybackmachine.org/web/20220529061415im_/https://habrastorage.org/r/w1560/webt/rl/vu/xy/rlvuxyp6iiexnmcwqui2wdv3eow.png)
Коэффициент
сжимает или растягивает паттерн по оси
. Для
и
:
![](https://webcf.waybackmachine.org/web/20220529061415im_/https://habrastorage.org/r/w1560/webt/kj/z0/go/kjz0goeeo-kizinm5enjy98usi0.png)
![](https://webcf.waybackmachine.org/web/20220529061415im_/https://habrastorage.org/r/w1560/webt/ma/f2/kw/maf2kwt3dayiojxqds6xxbo60jw.png)
Коэффициент
сжимает или растягивает паттерн по диагонали. Для
и
:
![](https://webcf.waybackmachine.org/web/20220529061415im_/https://habrastorage.org/r/w1560/webt/ht/k9/2k/htk92k5t1bcmbvtzkbnwcb0lh7y.png)
![](https://webcf.waybackmachine.org/web/20220529061415im_/https://habrastorage.org/r/w1560/webt/jj/9j/tx/jj9jtxuyevzvx6ftla7bd7csb-m.png)
Дальше. Для
наше уравнение принимает вид:
Это гиперболический параболоид — поверхность с отрицательной гауссовой кривизной:
![](https://webcf.waybackmachine.org/web/20220529061415im_/https://habrastorage.org/r/w1560/webt/lc/1w/af/lc1wafq1kvkiqf9ogmouu43xjc4.png)
Для
:
![](https://webcf.waybackmachine.org/web/20220529061415im_/https://habrastorage.org/r/w1560/webt/a6/dw/4y/a6dw4yxhwytim-mhlglkqfx7h1k.png)
Для
:
![](https://webcf.waybackmachine.org/web/20220529061415im_/https://habrastorage.org/r/w1560/webt/yv/6s/33/yv6s33hromo-s9sofaactuupbv8.png)
Попробуем поменять степень
. Для
наше уравнение принимает вид:
![](https://webcf.waybackmachine.org/web/20220529061415im_/https://habrastorage.org/r/w1560/webt/y6/be/wz/y6bewzb8iupq0hodpeaio3ujjau.png)
Для
:
![](https://webcf.waybackmachine.org/web/20220529061415im_/https://habrastorage.org/r/w1560/webt/_e/g3/bu/_eg3buq3ymow1tgku4aujaekfzq.png)
Для
:
![](https://webcf.waybackmachine.org/web/20220529061415im_/https://habrastorage.org/r/w1560/webt/li/ja/rz/lijarzcrszc9e1ygx9abchv-1yu.png)
Для
наше уравнение принимает вид:
![](https://webcf.waybackmachine.org/web/20220529061415im_/https://habrastorage.org/r/w1560/webt/1y/zc/by/1yzcbyyhtvgimwvl-5kn7zmuz8a.png)
Для
:
![](https://webcf.waybackmachine.org/web/20220529061415im_/https://habrastorage.org/r/w1560/webt/xo/uu/fw/xouufw4x1mjnf0_n5b1uxu0y1-y.png)
Для
:
![](https://webcf.waybackmachine.org/web/20220529061415im_/https://habrastorage.org/r/w1560/webt/vv/gk/p4/vvgkp4alriamy8tmpuc3faukgou.png)
Для
:
![](https://webcf.waybackmachine.org/web/20220529061415im_/https://habrastorage.org/r/w1560/webt/p6/u9/pg/p6u9pglwjf586jgxs0ziihumkd8.png)
Самые интересные паттерны получаются, если взять такое
, которое незначительно отличается от 1. Например для
:
Для
паттерн похож на тот, что мы видели для элиптического параболоида:
![](https://webcf.waybackmachine.org/web/20220529061415im_/https://habrastorage.org/r/w1560/webt/ix/pa/rj/ixparjbm2b0cqpcfyqom75e7oda.png)
Для
:
![](https://webcf.waybackmachine.org/web/20220529061415im_/https://habrastorage.org/r/w1560/webt/ti/_u/oi/ti_uoiibivfre1omif4zcsh-g4g.png)
Еще несколько примеров:
:
![](https://webcf.waybackmachine.org/web/20220529061415im_/https://habrastorage.org/r/w1560/webt/2a/fa/g_/2afag_bjjhcsxjkap6s9-57mgok.png)
:
![](https://webcf.waybackmachine.org/web/20220529061415im_/https://habrastorage.org/r/w1560/webt/eb/ms/my/ebmsmy5rkoqaokgpf1w2fpmocjq.png)
:
![](https://webcf.waybackmachine.org/web/20220529061415im_/https://habrastorage.org/r/w1560/webt/bw/r3/mr/bwr3mrla3kdd3erpqbum9bmcini.png)
:
![](https://webcf.waybackmachine.org/web/20220529061415im_/https://habrastorage.org/r/w1560/webt/ye/fg/cx/yefgcxsih7k7zmh-wlcnpaquzpu.png)
:
![](https://webcf.waybackmachine.org/web/20220529061415im_/https://habrastorage.org/r/w1560/webt/qk/es/ux/qkesux00vnzezdjpjboqeleqk2g.png)
:
![](https://webcf.waybackmachine.org/web/20220529061415im_/https://habrastorage.org/r/w1560/webt/77/dh/su/77dhsuipghdtajyqjyyfthhqhfe.png)
Мы попробовали дискретизировать линейную функцию и получили фрактал. Если сделать срез трехмерной плоской волны поверхностью с ненулевой кривизной — получим голографический паттерн. Интересно, что мы получим, если сделаем срез четырехмерной плоской волны пространством с ненулевой кривизной? Об этом поговорим в другой раз.
![](https://webcf.waybackmachine.org/web/20220529061415/https://habrastorage.org/webt/jb/ki/nd/jbkindqzsklr0ly3xblx8lkrgfc.png)
В статье присутствуют Gif (трафик!) и контрастные картинки. У эпилептиков может случиться эпилептический припадок.
Предыдущие части: 0, 1, 2.
Для начала вспомним, что за «бильярдные фракталы».
Бильярдные фракталы.
Есть у нас некоторая прямоугольная область («бильярд»), в которой движется бильярдный шар (или луч света).
![](https://webcf.waybackmachine.org/web/20220529061415/https://habrastorage.org/webt/jv/jf/wh/jvjfwhbyinonpkoh0orhozxc-_k.png)
Шар упруго отражается от стенок по законам оптики (угол отражения равен углу падения). При этом шар бесконечно мал (абстрактная «материальная точка» из физики) и при движении и отражении скорости не меняет (скорость нас вообще не интересует).
Когда шар касается одной из выбранных стенок (не важно, какую стенку выбирать, но для примера выберем верхнюю) — фиксируем, в какую сторону движется шар — в левую или в правую:
![](https://webcf.waybackmachine.org/web/20220529061415/https://habrastorage.org/webt/7f/5u/fo/7f5ufotnextd8w4gxo-8gsflmfc.png)
![](https://webcf.waybackmachine.org/web/20220529061415/https://habrastorage.org/webt/gs/mr/3l/gsmr3ld3pj8ids2poajw8xlewi8.png)
Для бильряда, соотношение сторон которого — иррациональное число, последовательность отражений — фрактальная (насколько этот термин применим к двоичным последовательностям). Или фракталообразующая. Если визуализировать такую последовательность с помощью черепашьей графики, мы получим фрактал.
В качестве примера можем использовать последовательность для бильярда, соотношение сторон которого равно
Строить такие последовательность очень легко:
Берем поочередно каждое целое число
JavaScript
let a=[];
for(let x=0;x<100;x++) a[x]=Math.floor(x*Math.sqrt(2))%2;
console.log(a.join(''));
Первые 100 элементов этой последовательности:
0100110110010011001001101100110110010011011001101100100110010011011001001100100110110011011001001100
Визуализация этой последовательности с помощью черепашьей графики дает нам следующую фигуру:
![](https://webcf.waybackmachine.org/web/20220529061415/https://habrastorage.org/webt/ka/n-/l4/kan-l4lbqdwkd0eqibmgcfcvydu.png)
Более подробно о том, откуда взялась эта формула и о визуализации последовательностей с помощью черепашьей графики, можно почитать во второй части — Фракталы в иррациональных числах
В реальном мире.
В реальном мире, такие последовательности встречаются гораздо чаще, чем может показаться на первый взгляд. Два примера.
Пример 1. Есть у нас два человека. Один побольше, второй — поменьше:
![](https://webcf.waybackmachine.org/web/20220529061415/https://habrastorage.org/webt/sf/j7/cn/sfj7cnpwsfr4qih-kucjbgk5g88.jpeg)
Эти два человека идут по улице. У высокого шире шаг, чем у низкого. Чтобы успевать за высоким, низкому приходится быстрее ногами двигать и больше шагов делать. В каждый момент времени, когда низкий ставит правую ногу на асфальт, фиксируем какая нога высокого находится в воздухе — левая или правая. Если частоты шагов низкого и высокого несинхронизированные — получим фрактальную последовательность.
Пример 2. Вокруг некоторой планеты вращается спутник:
![](https://webcf.waybackmachine.org/web/20220529061415/https://habrastorage.org/webt/br/ss/tk/brsstkwrsvqssdohsfvrgfmymwm.jpeg)
Выбираем временной интервал
Для наглядности, посмотрим на геометрическую интерпретацию бильярдных последовательностей.
Дискретизация линейной функции.
![](https://webcf.waybackmachine.org/web/20220529061415/https://habrastorage.org/webt/p6/js/qt/p6jsqtpd_jtmuwkbum24g5gm7i8.png)
Для бильярда, соотношение сторон которого равно
Фактически, все что мы сделали, чтобы получить фрактальную последовательность — дискретизировали линейную функцию с иррациональным коэффициентом
Но прежде, чем переходить к нелинейным функциям, хотелось бы упомянуть об одном интересном наблюдении, сделанном в процессе написания статьи.
Об одном интересном наблюдении.
Дабы не нарушать структуру статьи...
Черепашья графика — не единственный способ визуализации двоичных последовательностей. Существует еще один способ, которому посвящена отдельная статья Фракталы в иррациональных числах. Часть 2. Вспомним этот способ.
Возьмем нашу последовательность:
И построим из нее другую последовательность:
Первый элемент последовательности — произвольное число. Каждый следующий элемент — увеличиваем предыдущий элемент на 1, если соответствующий элемент первой последовательности (
) равен 1, или уменьшаем на 1 — если соответствующий элемент равен 0.
После чего можем построить фрактальную кривую, отметив на графике точки с координатами
:
![](https://webcf.waybackmachine.org/web/20220529061415im_/https://habrastorage.org/r/w1560/webt/yw/ca/3f/ywca3fptp_twj3mnj8licu06rma.png)
Из этой же кривой можем получить фрактальную поверхность. Для каждой точки
считаем
.
Дальше можем сделать срез плоскости по оси
:
![](https://webcf.waybackmachine.org/web/20220529061415im_/https://habrastorage.org/r/w1560/webt/hk/lg/tf/hklgtfrha_g6f32flh3hrz8jqhi.gif)
Или отметить такие точки, для которых
или ![$z(\textrm{mod} \; 4)=1;$](https://webcf.waybackmachine.org/web/20220529061415im_/https://habrastorage.org/getpro/habr/formulas/274/76e/5c7/27476e5c7ed118ac74214a6294276f8e.svg)
![](https://webcf.waybackmachine.org/web/20220529061415im_/https://habrastorage.org/r/w1560/webt/oh/ii/4h/ohii4hsutvssloqblbvswdqjxly.png)
Следующая картинка — чем больше
, тем ярче пиксель:
![](https://webcf.waybackmachine.org/web/20220529061415im_/https://habrastorage.org/r/w1560/webt/jj/c1/fa/jjc1farjzke02ooyxkyjv2x4ros.png)
Можем немного изменить последовательность:
Раскрыв скобки, получим:
Здесь
— дробная часть, которую мы ранее отбрасывали.
Как это выглядит в бильярдной модели? Мы увеличиваем предыдущий элемент последовательности на расстояние (по оси
) между правой границей и точкой касания шара верхней границы, если шар двигался влево. Или же уменьшаем на расстояние между левой границей и точкой касания шара верхней границы, если шар двигался вправо:
![](https://webcf.waybackmachine.org/web/20220529061415im_/https://habrastorage.org/r/w1560/webt/xf/ei/ka/xfeikada1ssvsqkeu9ksi_twnts.png)
![](https://webcf.waybackmachine.org/web/20220529061415im_/https://habrastorage.org/r/w1560/webt/l1/p6/cd/l1p6cdzksajczyviclzq6zkxg1e.png)
Делаем визуализацию тем же способом, который использовали выше. Для каждой точки
считаем
. Получили поверхность. Раскрашиваем. Чем больше
, тем ярче пиксель:
![](https://webcf.waybackmachine.org/web/20220529061415im_/https://habrastorage.org/r/w1560/webt/i0/a-/hb/i0a-hbahpsxy0lcjnlhcasolkes.png)
До того, как мы изменили последовательность, все
были целыми числами. Теперь — иррациональные. Сделать
не получится. Но можем найти некоторую плоскость, которая находится на одинаковом расстоянии от максимальной и миниальной
и посмотреть на точки, которые лежат ниже и выше этой плоскости:
![](https://webcf.waybackmachine.org/web/20220529061415im_/https://habrastorage.org/r/w1560/webt/ew/6i/1x/ew6i1xsfz6itokwbbn264ma3bnk.png)
Самое интересное получится, если мы отметим пиксели, для которых
. Другими словами, отмасштабируем
, умножив на некоторое число
, после чего отбросим дробную часть и проверим четность целой части. Для некоторых
:
478:
![](https://webcf.waybackmachine.org/web/20220529061415im_/https://habrastorage.org/r/w1560/webt/ls/wj/zx/lswjzxuhbgr8irovy6urvj236tm.png)
338:
![](https://webcf.waybackmachine.org/web/20220529061415im_/https://habrastorage.org/r/w1560/webt/sl/va/h7/slvah7ejjitbr9xllgh2qin7jxw.png)
Получаем замечательные круги. Примечательно, что круги получаем для
равных числителю или знаменателю дроби, дающей приближенное значение ![$\sqrt{2}$](https://webcf.waybackmachine.org/web/20220529061415im_/https://habrastorage.org/getpro/habr/formulas/8c8/ef9/b91/8c8ef9b91944faf27a53c2958c13bbe2.svg)
![$\frac{478}{338}\approx\sqrt{2}$](https://webcf.waybackmachine.org/web/20220529061415im_/https://habrastorage.org/getpro/habr/formulas/dfe/083/692/dfe08369294633e1ff7fec43253e3a94.svg)
Для других
:
144:
![](https://webcf.waybackmachine.org/web/20220529061415im_/https://habrastorage.org/r/w1560/webt/ja/di/je/jadijema4eklj9igfetdmcnxzvs.png)
354:
![](https://webcf.waybackmachine.org/web/20220529061415im_/https://habrastorage.org/r/w1560/webt/t-/yj/df/t-yjdf908qlosm8n2ogauj696sa.png)
Замечательные круги не получаем.
Здесь можно посмотреть в динамике, поводив мышкой по экрану.
Возьмем нашу последовательность:
И построим из нее другую последовательность:
Первый элемент последовательности — произвольное число. Каждый следующий элемент — увеличиваем предыдущий элемент на 1, если соответствующий элемент первой последовательности (
JavaScript
let a=[50];
for(let x=1;x<size;x++){
if(Math.floor(x*Math.sqrt(2))%2==1)
a[x]=a[x-1]+1;
else
a[x]=a[x-1]-1;
}
После чего можем построить фрактальную кривую, отметив на графике точки с координатами
JavaScript
for(let x=0;x<size;x++){
context.fillRect(x, a[x], 1, 1);
}
![](https://webcf.waybackmachine.org/web/20220529061415/https://habrastorage.org/webt/yw/ca/3f/ywca3fptp_twj3mnj8licu06rma.png)
Из этой же кривой можем получить фрактальную поверхность. Для каждой точки
Дальше можем сделать срез плоскости по оси
![](https://webcf.waybackmachine.org/web/20220529061415/https://habrastorage.org/webt/hk/lg/tf/hklgtfrha_g6f32flh3hrz8jqhi.gif)
Или отметить такие точки, для которых
![](https://webcf.waybackmachine.org/web/20220529061415/https://habrastorage.org/webt/oh/ii/4h/ohii4hsutvssloqblbvswdqjxly.png)
Следующая картинка — чем больше
![](https://webcf.waybackmachine.org/web/20220529061415/https://habrastorage.org/webt/jj/c1/fa/jjc1farjzke02ooyxkyjv2x4ros.png)
Можем немного изменить последовательность:
Раскрыв скобки, получим:
Здесь
Как это выглядит в бильярдной модели? Мы увеличиваем предыдущий элемент последовательности на расстояние (по оси
![](https://webcf.waybackmachine.org/web/20220529061415/https://habrastorage.org/webt/xf/ei/ka/xfeikada1ssvsqkeu9ksi_twnts.png)
![](https://webcf.waybackmachine.org/web/20220529061415/https://habrastorage.org/webt/l1/p6/cd/l1p6cdzksajczyviclzq6zkxg1e.png)
JavaScript
После раскрытия скобок:
let c, arr=[0];
for(let i=1;i<size;i++){
c=i*Math.sqrt(2);
if(Math.floor(c)%2){
arr[i]=arr[i-1]+(c-Math.floor(c));
}else{
arr[i]=arr[i-1]-(1-(c-Math.floor(c)));
}
}
После раскрытия скобок:
let c, arr=[0];
for(let i=1;i<size;i++){
c=i*Math.sqrt(2);
arr[i]=arr[i-1]+(c-Math.floor(c));
if(Math.floor(c)%2!=1){
arr[i]--;
}
}
На самом деле...
Достаточно:
В этом случае поверхность получится гладкой, а не фрактальной.
let c, arr=[0];
for(let i=1;i<size;i++){
c=i*Math.sqrt(2);
arr[i]=arr[i-1]+(c-Math.floor(c));
}
В этом случае поверхность получится гладкой, а не фрактальной.
Делаем визуализацию тем же способом, который использовали выше. Для каждой точки
![](https://webcf.waybackmachine.org/web/20220529061415/https://habrastorage.org/webt/i0/a-/hb/i0a-hbahpsxy0lcjnlhcasolkes.png)
До того, как мы изменили последовательность, все
![](https://webcf.waybackmachine.org/web/20220529061415/https://habrastorage.org/webt/ew/6i/1x/ew6i1xsfz6itokwbbn264ma3bnk.png)
Самое интересное получится, если мы отметим пиксели, для которых
478:
![](https://webcf.waybackmachine.org/web/20220529061415/https://habrastorage.org/webt/ls/wj/zx/lswjzxuhbgr8irovy6urvj236tm.png)
338:
![](https://webcf.waybackmachine.org/web/20220529061415/https://habrastorage.org/webt/sl/va/h7/slvah7ejjitbr9xllgh2qin7jxw.png)
Получаем замечательные круги. Примечательно, что круги получаем для
Для других
144:
![](https://webcf.waybackmachine.org/web/20220529061415/https://habrastorage.org/webt/ja/di/je/jadijema4eklj9igfetdmcnxzvs.png)
354:
![](https://webcf.waybackmachine.org/web/20220529061415/https://habrastorage.org/webt/t-/yj/df/t-yjdf908qlosm8n2ogauj696sa.png)
Замечательные круги не получаем.
Здесь можно посмотреть в динамике, поводив мышкой по экрану.
Вернемся к дискретизации нелинейных функций.
Дискретизация нелинейной функции.
Например
![](https://webcf.waybackmachine.org/web/20220529061415/https://habrastorage.org/webt/m0/34/td/m034tdqelex3xu8ha4hznxr8m1k.png)
Строим последовательность:
JavaScript
let a=[];
for(let x=0;x<100;x++) a[x]=Math.floor(x*x*Math.sqrt(2))%2;
console.log(a.join(''));
Для целых аргументов
Первые 100 элементов этой последовательности:
0110010100111110000011000100010100000001010011010110001100101001010011111000000000100110111111111000
Визуализация этой последовательности с помощью черепашьей графики дает такую кривую:
![](https://webcf.waybackmachine.org/web/20220529061415/https://habrastorage.org/webt/vj/jd/al/vjjdalrj7iml-e3nxtcqdxsu-qo.png)
Эта последовательность выглядит немного более хаотичной, чем последовательность, полученная дискретизацией линейной функции. Но это не так. Если где-то не видим закономерность — значит плохо смотрим. Можем сделать очень простую визуализацию. Запишем первые 1000 элементов последовательности в блокнот, включим перенос строк.
![](https://webcf.waybackmachine.org/web/20220529061415/https://habrastorage.org/webt/vn/x4/az/vnx4azmmgyxnb1strxlvb9tweju.png)
Можно разглядеть паттерн.
Для того, чтобы лучше разглядеть, единички заменяем на █, нолики — на ░:
![](https://webcf.waybackmachine.org/web/20220529061415/https://habrastorage.org/webt/g9/dr/gn/g9drgn2ablachxbtmylt8tkvkrg.png)
Построим двухмерный график этой последовательности. На каждой следующей строчке
Для некоторых
35:
![](https://webcf.waybackmachine.org/web/20220529061415/https://habrastorage.org/webt/vt/_y/_h/vt_y_hrv8xldcv-hm__e0uwo2cu.png)
661:
![](https://webcf.waybackmachine.org/web/20220529061415/https://habrastorage.org/webt/p4/m_/vv/p4m_vvpzn6dwyu3m6pjugss984s.png)
Больше примеров
Для
Дискретизация поверхностей с ненулевой кривизной.
Для дальнейших экспериментов запишем уравнение в более общем виде:
Точно так же, как мы дискретизировали линейную функцию, мы можем дискретизировать поверхности второго порядка. Для этого считаем
Для
Это уравнение элиптического параболоида. Коэффициент
![](https://webcf.waybackmachine.org/web/20220529061415/https://habrastorage.org/webt/jo/ks/vt/joksvtycb32dkqjrtnbyk2tklwq.png)
JavaScript
for(var x=0;x<canvas.width;x++){
xx=x-canvas.width/2;
for(var y=0;y<canvas.height;y++){
yy=y-canvas.height/2;
z=a*(xx**2+b*xx*yy+c*(yy**2))**(d);
if(Math.floor(z*Math.sqrt(2))%2) context.fillRect(x, y, 1, 1);
}
}
Для
![](https://webcf.waybackmachine.org/web/20220529061415/https://habrastorage.org/webt/jm/i0/pa/jmi0padbl06lf5ahitbepkcfxqa.png)
Можем этот же паттерн нарисовать недискретным. Вместо
![](https://webcf.waybackmachine.org/web/20220529061415/https://habrastorage.org/webt/hz/ir/jk/hzirjkt-geoqk3urwrnq2gyknfo.png)
Для
![](https://webcf.waybackmachine.org/web/20220529061415/https://habrastorage.org/webt/i5/-f/cl/i5-fclddtotjsdm-udsaadhgos8.png)
![](https://webcf.waybackmachine.org/web/20220529061415/https://habrastorage.org/webt/rl/vu/xy/rlvuxyp6iiexnmcwqui2wdv3eow.png)
При чем тут голография?
Паттерн, который мы получили — самая простая голограмма. Такой же паттерн мы получим, если сделаем срез сферической волны плоскостью. Или же срез плоской волны сферической поверхностью.
![](https://webcf.waybackmachine.org/web/20220529061415im_/https://habrastorage.org/r/w1560/webt/1x/io/43/1xio43ptkrwdgggnmpgrwyrf_fs.gif)
![](https://webcf.waybackmachine.org/web/20220529061415/https://habrastorage.org/webt/1x/io/43/1xio43ptkrwdgggnmpgrwyrf_fs.gif)
Коэффициент
![](https://webcf.waybackmachine.org/web/20220529061415/https://habrastorage.org/webt/kj/z0/go/kjz0goeeo-kizinm5enjy98usi0.png)
![](https://webcf.waybackmachine.org/web/20220529061415/https://habrastorage.org/webt/ma/f2/kw/maf2kwt3dayiojxqds6xxbo60jw.png)
Коэффициент
![](https://webcf.waybackmachine.org/web/20220529061415/https://habrastorage.org/webt/ht/k9/2k/htk92k5t1bcmbvtzkbnwcb0lh7y.png)
![](https://webcf.waybackmachine.org/web/20220529061415/https://habrastorage.org/webt/jj/9j/tx/jj9jtxuyevzvx6ftla7bd7csb-m.png)
Дальше. Для
Это гиперболический параболоид — поверхность с отрицательной гауссовой кривизной:
![](https://webcf.waybackmachine.org/web/20220529061415/https://habrastorage.org/webt/lc/1w/af/lc1wafq1kvkiqf9ogmouu43xjc4.png)
Для
![](https://webcf.waybackmachine.org/web/20220529061415/https://habrastorage.org/webt/a6/dw/4y/a6dw4yxhwytim-mhlglkqfx7h1k.png)
Для
![](https://webcf.waybackmachine.org/web/20220529061415/https://habrastorage.org/webt/yv/6s/33/yv6s33hromo-s9sofaactuupbv8.png)
Попробуем поменять степень
![](https://webcf.waybackmachine.org/web/20220529061415/https://habrastorage.org/webt/y6/be/wz/y6bewzb8iupq0hodpeaio3ujjau.png)
Для
![](https://webcf.waybackmachine.org/web/20220529061415/https://habrastorage.org/webt/_e/g3/bu/_eg3buq3ymow1tgku4aujaekfzq.png)
Для
![](https://webcf.waybackmachine.org/web/20220529061415/https://habrastorage.org/webt/li/ja/rz/lijarzcrszc9e1ygx9abchv-1yu.png)
Для
![](https://webcf.waybackmachine.org/web/20220529061415/https://habrastorage.org/webt/1y/zc/by/1yzcbyyhtvgimwvl-5kn7zmuz8a.png)
Для
![](https://webcf.waybackmachine.org/web/20220529061415/https://habrastorage.org/webt/xo/uu/fw/xouufw4x1mjnf0_n5b1uxu0y1-y.png)
Для
![](https://webcf.waybackmachine.org/web/20220529061415/https://habrastorage.org/webt/vv/gk/p4/vvgkp4alriamy8tmpuc3faukgou.png)
Для
![](https://webcf.waybackmachine.org/web/20220529061415/https://habrastorage.org/webt/p6/u9/pg/p6u9pglwjf586jgxs0ziihumkd8.png)
Самые интересные паттерны получаются, если взять такое
Для
![](https://webcf.waybackmachine.org/web/20220529061415/https://habrastorage.org/webt/ix/pa/rj/ixparjbm2b0cqpcfyqom75e7oda.png)
Для
![](https://webcf.waybackmachine.org/web/20220529061415/https://habrastorage.org/webt/ti/_u/oi/ti_uoiibivfre1omif4zcsh-g4g.png)
Еще несколько примеров:
![](https://webcf.waybackmachine.org/web/20220529061415/https://habrastorage.org/webt/2a/fa/g_/2afag_bjjhcsxjkap6s9-57mgok.png)
![](https://webcf.waybackmachine.org/web/20220529061415/https://habrastorage.org/webt/eb/ms/my/ebmsmy5rkoqaokgpf1w2fpmocjq.png)
![](https://webcf.waybackmachine.org/web/20220529061415/https://habrastorage.org/webt/bw/r3/mr/bwr3mrla3kdd3erpqbum9bmcini.png)
![](https://webcf.waybackmachine.org/web/20220529061415/https://habrastorage.org/webt/ye/fg/cx/yefgcxsih7k7zmh-wlcnpaquzpu.png)
![](https://webcf.waybackmachine.org/web/20220529061415/https://habrastorage.org/webt/qk/es/ux/qkesux00vnzezdjpjboqeleqk2g.png)
![](https://webcf.waybackmachine.org/web/20220529061415/https://habrastorage.org/webt/77/dh/su/77dhsuipghdtajyqjyyfthhqhfe.png)
Поиграться
В динамике — дискретные паттерны. Двигаем мышкой по экрану. Параметры
вводим вручную. Параметр
вычисляется из координат мышки.
В статике — можем посмотреть дискретный и недискретный паттерны.
В статике — можем посмотреть дискретный и недискретный паттерны.
Подводя итоги...
Мы попробовали дискретизировать линейную функцию и получили фрактал. Если сделать срез трехмерной плоской волны поверхностью с ненулевой кривизной — получим голографический паттерн. Интересно, что мы получим, если сделаем срез четырехмерной плоской волны пространством с ненулевой кривизной? Об этом поговорим в другой раз.