Часть 0: Фракталы в простых числах.
Часть 1: Фракталы в иррациональных числах.
![](https://habrastorage.org/r/w1560/webt/on/oh/68/onoh68svrcuwkca6o4vvqi29rfk.png)
В статье присутствуют Gif и контрастные картинки. У эпилептиков может случиться эпилептический припадок.
В предыдущей статье мы рассмотрели алгоритм визуализации двоичных последовательностей. Давайте вспомним.
Берем двоичную последовательность. В качестве примера несколько первых бит фрактальной последовательности, рассмотренной в предыдущей статье:
0100110110010011001001101100
Рисуем квадратное клеточное поле. Расставляем биты у верхней границы. Расстояние между битами — две клетки:
![](https://habrastorage.org/r/w1560/webt/3v/xt/ub/3vxtubpa5pomw81boqfeys7h-0s.png)
Для каждого бита рисуем по диагонали пунктирную траекторию (через клетку). Для нулей первый штрих рисуем вправо:
![](https://habrastorage.org/r/w1560/webt/8u/ak/3c/8uak3c2kcfvcipk4vez3rnqmkci.png)
Для единиц — влево:
![](https://habrastorage.org/r/w1560/webt/qy/bw/wn/qybwwns59duc_rhivpwajv1xr28.png)
Нарисовали траекторию для каждого бита. Получили «бильярдный» паттерн:
![](https://habrastorage.org/r/w1560/webt/ol/df/p-/oldfp-9y_uyfuxkpv1ufmk-o_ls.png)
Идентичный паттерн (без дефекта по диагонали — последовательность бесконечная, мы же ее визуализировали как конечную последовательность) можно получить другим способом. Инвертируем каждый четный бит в последовательности:
0001100011000110011100111001
Далее для каждого бита рисуем вертикальные пунктирные линии:
![](https://habrastorage.org/r/w1560/webt/xc/tn/pb/xctnpbo1piptywhkpj8mtiiq480.png)
Расставляем биты слева, рисуем горизонтальные линии:
![](https://habrastorage.org/r/w1560/webt/ze/kd/-j/zekd-jjhpkuwu8yugibhct7xepo.png)
Совмещаем:
![](https://habrastorage.org/r/w1560/webt/j_/k1/yu/j_k1yukqogpg9l6wiepor6-ivv4.png)
После написания первой статьи, оставались нерешенными два вопроса:
1. Можно ли нарисовать фрактальный паттерн для иррациональных чисел. Можно. Вопрос решили в предыдущей статье. На картинке выше — часть фрактального паттерна для
. Если выделить одну из кривых на этом паттерне:
![](https://habrastorage.org/r/w1560/webt/pg/yi/o3/pgyio36r05qaz3py1dro1ocs4og.png)
Получим известную фрактальную кривую — «Fibonacci word fractal».
2. Второй вопрос — можно ли написать алгоритм, закрашивающий паттерн:
![](https://habrastorage.org/r/w1560/webt/yc/bj/vb/ycbjvbgxtnhnfb_ycyhi4umqrek.png)
Решением второго вопроса займемся в этой статье. Раскрашивать паттерны будем с помощью ткацкого станка, работу которого сымитируем с помощью JavaScript.
![](https://habrastorage.org/r/w1560/webt/pk/lr/ym/pklrymtwgqpysiq03i1rqxbhvgi.png)
На схеме выше — самый простой станок. Он состоит из двух рамок, через которые протянуты нити. Рамки соединены с педалями. При нажатии на одну из педалей, одна из рамок поднимается. Нити, протянутые через эту рамку поднимаются и в получившийся зазор между нитями протягивается поперечная нить. Если четные и нечетные нити протянуть через разные рамки — получается переплетение в шахматном порядке:
![](https://habrastorage.org/r/w1560/webt/va/op/ld/vaopldjhktcok_wr00x9p1ilsqm.png)
В более сложных станках используется от четырех и больше рамок:
![](https://habrastorage.org/r/w780q1/webt/ru/ls/tv/rulstvjmhsxbtke5fvzdl3fhfxe.jpeg)
Ashford 4 Shaft Table Loom
Для того, чтобы не запутаться, какую педаль нажимать — составляют схему.
![](https://habrastorage.org/r/w1560/webt/b_/fj/sw/b_fjsw7z4hncysaxpfraihwc6t0.png)
В верхней правой части схемы отмечено, через какие рамки проходят нити (схема для ткацкого станка на 8 рамок).
В левом верхнем углу — какие педали зажимать одновременно (каждая педаль связана только со своей рамкой).
В левой нижней части — в каком порядке зажимать педали.
В правой нижней части — какое переплетение мы получим. Если протягивать белую нить через черные — получим монохромный узор.
Сходу «въехать» в принцип может показаться немного затруднительным. На картинке ниже показано, как формируется ткацкий узор:
![](https://habrastorage.org/r/w1560/webt/9a/de/8f/9ade8fkvfs8gr4khrnsvxnqsw1k.png)
Напишем скрипт. Протягивать нити через рамки будем с помощью одномерного массива array2. В одномерный массив array1 запишем очередность зажатия педалей. В array3 (бинарный массив 8х8) запишем, какие педали зажимать одновременно.
![](https://habrastorage.org/r/w1560/webt/q_/qr/ej/q_qrej_i1bqhy9rp-tzjrhkxsl0.png)
Скрипт (работает в Google Chrome).
С помощью нашего импровизированного ткацкого станка мы можем нарисовать самые разнообразные узоры:
![](https://habrastorage.org/r/w1560/webt/hi/-8/uk/hi-8ukwkgz9mkjr3msne7cvs1-8.png)
Но так исторически сложилось, что у среднестатистического человека не больше двух ног. Поэтому удобно одновременно зажимать не больше двух педалей. Один из самых популярных шаблонов для ткацкого станка выглядит следующим образом:
![](https://habrastorage.org/r/w1560/webt/zs/h0/fa/zsh0fa1qkdfxoc7wr0iptdw7jim.png)
Для 4-х рамок. И его модификация для 8-ми рамок:
![](https://habrastorage.org/r/w1560/webt/v2/im/me/v2immeiq-qmwznj9muhxt-skjzi.png)
Неожиданно, узоры (или фрагмент узоров) сделанные с помощью этого шаблона, похожи на наши «бильярдные» паттерны. Кроме того, эти узоры получаются закрашенными:
![](https://habrastorage.org/r/w1560/webt/op/n7/t2/opn7t2e-l_ya_3tjbij1vmqopba.png)
Можно научиться подбирать «бильярдные» паттерны для ткацкого станка. Пример:
![](https://habrastorage.org/r/w1560/webt/dl/iy/va/dliyva3ad-ovjxirqklonlwofq8.png)
В начале статьи мы уже видели фрагмент этого паттерна.
Закончим с ткацкими станками и напишем скрипт для визуализации двоичных последовательностей. От одного из массивов можем избавиться — паттерн симметричен по диагонали. Как заполнить оставшийся массив? Элементарно:
![](https://habrastorage.org/r/w1560/webt/tx/vs/va/txvsvavbel6numycjbyblelgxhe.png)
Берем последовательность для
. Создаем массив. В нулевой элемент массива записываем нулевой бит последовательности. Поочередно берем каждый бит последовательности. Если n-й бит = 1 — записываем в массив a[n]=a[n-1]+1. Если бит = 0 — записываем a[n]=a[n-1]-1
![](https://habrastorage.org/r/w1560/webt/tc/fd/yh/tcfdyh0bubujzir3a5azmiir6pg.png)
Проверяем:
![](https://habrastorage.org/r/w1560/webt/vm/ke/-s/vmke-s7o5kjgmamfjgbicohx7pu.png)
Фактически мы уже получили элементарный фрактал, но продолжим.
Далее разберемся с матрицей:
![](https://habrastorage.org/r/w1560/webt/2j/cy/nc/2jcynct9lxb-kmcukhiawaiy6wo.png)
Суммируем
и
. Делим по модулю на 4. Если получившийся результат = 0 или 1 — записываем в матрицу true. Для 2 и 3 записываем false. Можем обойтись без матрицы (заранее неизвестно, какие максимальные и минимальные значения принимает a[n]). Суммируем a[x] и a[y]. К получившейся сумме добавляем некоторое число
(чтобы избавиться от тех случаев, когда сумма — отрицательное число). Делим по модулю на 4. Для значений 0 и 1 закрашиваем пиксель с координатами
и
.
Окончательный алгоритм занимает всего несколько строк:
Визуализируем наши фрактальные последовательности.
![](https://habrastorage.org/r/w1560/webt/vl/hc/qf/vlhcqf75d2uvz-dzf_gq-ekjire.png)
Можно легко модифицировать скрипт для того, чтобы получить RGB-изображение:
![](https://habrastorage.org/r/w1560/webt/n5/xa/yh/n5xayhratfrrzopogtfpfv0ps8o.png)
Выше мы к сумме a[x]+a[y] прибавляли некоторое число
. Если не прибавлять это число — минимальное значение суммы = -8, максимальное = 8 (для
и
от 0 до 750). Если убрать
— в некоторых случаях сумма получается отрицательной и не кратной 4-м и для этих случаев пиксель не закрашивается (остается черным):
![](https://habrastorage.org/r/w1560/webt/qr/q2/aw/qrq2awxzsudevbd0ebegetlc14q.png)
Можно представить это так, будто часть фрактала находится ниже некоторой мнимой границы (ниже этой границы закрашиваются только отрицательные значения кратные 4-м: -4, -8, -12, ...).
Можем посмотреть, где находится эта граница:
![](https://habrastorage.org/r/w1560/webt/t3/g9/nk/t3g9nkjqukrgtev-mxxnoy0hcb4.png)
Вместо деления по модулю, можем сравнить сумму с некоторым определенным значением и тем самым закрасить только один «слой» фрактала. В качестве примера возьмем среднее между минимальным и максимальным значением:
![](https://habrastorage.org/r/w1560/webt/6d/lq/bh/6dlqbhtynhvmqms1qbs6x4wxlzk.png)
Изменяя значения от минимального до максимального, можем посмотреть как меняются «слои» в динамике:
![](https://habrastorage.org/webt/3k/oq/r9/3koqr9dr0zchs0nzp-5mk-gebic.gif)
Кроме того, мы можем «в лоб» сравнить a[x] с a[y] и тоже получить фрактальный паттерн:
![](https://habrastorage.org/r/w1560/webt/sh/pq/ux/shpquxpwl0od4hqt29mss5ionfc.png)
Следующая последовательность:
Фрактал:
![](https://habrastorage.org/r/w1560/webt/pi/9o/-9/pi9o-92eevg-2qdzi9v5-yzpu1e.png)
RGB:
![](https://habrastorage.org/r/w1560/webt/90/xe/jp/90xejpi_ilozo36ollvbuffahkq.png)
Средний слой:
![](https://habrastorage.org/r/w1560/webt/_g/pv/h3/_gpvh3lipfwaasma3ga0xs3-v3g.png)
В динамике:
![](https://habrastorage.org/webt/d3/d5/z8/d3d5z80a0o6e3zl0jnad3a5c_uk.gif)
Фрактал:
![](https://habrastorage.org/r/w1560/webt/mm/zk/_f/mmzk_frqkevqofu12zyidj7jhdo.png)
RGB:
![](https://habrastorage.org/r/w1560/webt/zh/jn/-f/zhjn-f2cynkm7roudinj4pmzsho.png)
Средний слой:
![](https://habrastorage.org/r/w1560/webt/az/rl/oi/azrloiumcpjfvfzayridhkkmrti.png)
В динамике:
![](https://habrastorage.org/webt/nl/8z/xw/nl8zxwcclmggf-g8zetw2kbfn_g.gif)
Фрактал:
![](https://habrastorage.org/r/w1560/webt/9d/po/ae/9dpoaefqvluq1ho55to_okwtffg.png)
RGB:
![](https://habrastorage.org/r/w1560/webt/p6/br/qt/p6brqte98ioj_wywqowvticifes.png)
Средний слой:
![](https://habrastorage.org/r/w1560/webt/ps/nm/7u/psnm7unaxs59initknhehiew_kk.png)
В динамике:
![](https://habrastorage.org/webt/tk/rb/mp/tkrbmpnq0zrs8d7snknoabrx_00.gif)
Фрактал:
![](https://habrastorage.org/r/w1560/webt/c9/h6/2h/c9h62ho7fl-ubfnuwr6dndjwwj4.png)
RGB:
![](https://habrastorage.org/r/w1560/webt/zp/yv/ux/zpyvuxtzzuxhoij46yljq5fdnko.png)
Средний слой:
![](https://habrastorage.org/r/w1560/webt/mt/qe/xf/mtqexfbg86g7zijebdctaxqclv4.png)
В динамике:
![](https://habrastorage.org/webt/nt/_s/u6/nt_su6tiim6grklbsgjrypvmhee.gif)
Ну и наш любимый фрактал (часть этого паттерна можно нарисовать с помощью бильярда, с размерами сторон равными числам Фибоначчи):
Фрактал:
![](https://habrastorage.org/r/w1560/webt/oc/ao/vl/ocaovlmgdleylvm8ctff0wbmgsk.png)
RGB:
![](https://habrastorage.org/r/w1560/webt/8n/_b/-x/8n_b-x71vncy_e6nqa6lzeaatmk.png)
Средний слой:
![](https://habrastorage.org/r/w1560/webt/2x/mn/xp/2xmnxpok5j-npsfrkrvfkrrhp0s.png)
В динамике:
![](https://habrastorage.org/webt/yg/4t/sg/yg4tsgl97nd6xz34xlgyw0cl8ck.gif)
Еще одна последовательность в завершение:
Паттерн:
![](https://habrastorage.org/r/w1560/webt/vp/rz/iz/vprziztepwojya_kx2hk6dzvywk.png)
RGB:
![](https://habrastorage.org/r/w1560/webt/mp/xm/pt/mpxmptnaygi8fbqzg2d9fq0_xgm.png)
Средний слой:
![](https://habrastorage.org/r/w1560/webt/zu/xu/gj/zuxugjchcpv0rdjkkp7asuyndhi.png)
В динамике:
![](https://habrastorage.org/webt/cn/m5/em/cnm5emimypr3_up5qgwrditsids.gif)
Другие квадратные корни можно вбить в скрипт. (Можно вбивать дробные значения).
Во втором скрипте можно вбить последовательность вручную.
Еще один скрипт для бильярдов. Координаты мышки — размеры бильярда. Паттерн в левой части формируется из последовательности, полученной с помощью остатков от деления (подробности в предыдущей статье). В правой части — четность
.
Часть 1: Фракталы в иррациональных числах.
![](https://habrastorage.org/webt/on/oh/68/onoh68svrcuwkca6o4vvqi29rfk.png)
В статье присутствуют Gif и контрастные картинки. У эпилептиков может случиться эпилептический припадок.
В предыдущей статье мы рассмотрели алгоритм визуализации двоичных последовательностей. Давайте вспомним.
Берем двоичную последовательность. В качестве примера несколько первых бит фрактальной последовательности, рассмотренной в предыдущей статье:
0100110110010011001001101100
Рисуем квадратное клеточное поле. Расставляем биты у верхней границы. Расстояние между битами — две клетки:
![](https://habrastorage.org/webt/3v/xt/ub/3vxtubpa5pomw81boqfeys7h-0s.png)
Для каждого бита рисуем по диагонали пунктирную траекторию (через клетку). Для нулей первый штрих рисуем вправо:
![](https://habrastorage.org/webt/8u/ak/3c/8uak3c2kcfvcipk4vez3rnqmkci.png)
Для единиц — влево:
![](https://habrastorage.org/webt/qy/bw/wn/qybwwns59duc_rhivpwajv1xr28.png)
Нарисовали траекторию для каждого бита. Получили «бильярдный» паттерн:
![](https://habrastorage.org/webt/ol/df/p-/oldfp-9y_uyfuxkpv1ufmk-o_ls.png)
Идентичный паттерн (без дефекта по диагонали — последовательность бесконечная, мы же ее визуализировали как конечную последовательность) можно получить другим способом. Инвертируем каждый четный бит в последовательности:
0001100011000110011100111001
Далее для каждого бита рисуем вертикальные пунктирные линии:
![](https://habrastorage.org/webt/xc/tn/pb/xctnpbo1piptywhkpj8mtiiq480.png)
Расставляем биты слева, рисуем горизонтальные линии:
![](https://habrastorage.org/webt/ze/kd/-j/zekd-jjhpkuwu8yugibhct7xepo.png)
Совмещаем:
![](https://habrastorage.org/webt/j_/k1/yu/j_k1yukqogpg9l6wiepor6-ivv4.png)
После написания первой статьи, оставались нерешенными два вопроса:
1. Можно ли нарисовать фрактальный паттерн для иррациональных чисел. Можно. Вопрос решили в предыдущей статье. На картинке выше — часть фрактального паттерна для
![](https://habrastorage.org/webt/pg/yi/o3/pgyio36r05qaz3py1dro1ocs4og.png)
Получим известную фрактальную кривую — «Fibonacci word fractal».
2. Второй вопрос — можно ли написать алгоритм, закрашивающий паттерн:
![](https://habrastorage.org/webt/yc/bj/vb/ycbjvbgxtnhnfb_ycyhi4umqrek.png)
Решением второго вопроса займемся в этой статье. Раскрашивать паттерны будем с помощью ткацкого станка, работу которого сымитируем с помощью JavaScript.
![](https://habrastorage.org/webt/pk/lr/ym/pklrymtwgqpysiq03i1rqxbhvgi.png)
На схеме выше — самый простой станок. Он состоит из двух рамок, через которые протянуты нити. Рамки соединены с педалями. При нажатии на одну из педалей, одна из рамок поднимается. Нити, протянутые через эту рамку поднимаются и в получившийся зазор между нитями протягивается поперечная нить. Если четные и нечетные нити протянуть через разные рамки — получается переплетение в шахматном порядке:
![](https://habrastorage.org/webt/va/op/ld/vaopldjhktcok_wr00x9p1ilsqm.png)
В более сложных станках используется от четырех и больше рамок:
![](https://habrastorage.org/webt/ru/ls/tv/rulstvjmhsxbtke5fvzdl3fhfxe.jpeg)
Ashford 4 Shaft Table Loom
Для того, чтобы не запутаться, какую педаль нажимать — составляют схему.
![](https://habrastorage.org/webt/b_/fj/sw/b_fjsw7z4hncysaxpfraihwc6t0.png)
В верхней правой части схемы отмечено, через какие рамки проходят нити (схема для ткацкого станка на 8 рамок).
В левом верхнем углу — какие педали зажимать одновременно (каждая педаль связана только со своей рамкой).
В левой нижней части — в каком порядке зажимать педали.
В правой нижней части — какое переплетение мы получим. Если протягивать белую нить через черные — получим монохромный узор.
Сходу «въехать» в принцип может показаться немного затруднительным. На картинке ниже показано, как формируется ткацкий узор:
![](https://habrastorage.org/webt/9a/de/8f/9ade8fkvfs8gr4khrnsvxnqsw1k.png)
Напишем скрипт. Протягивать нити через рамки будем с помощью одномерного массива array2. В одномерный массив array1 запишем очередность зажатия педалей. В array3 (бинарный массив 8х8) запишем, какие педали зажимать одновременно.
![](https://habrastorage.org/webt/q_/qr/ej/q_qrej_i1bqhy9rp-tzjrhkxsl0.png)
for(var i=0;i<length;i++){
for(var j=0;j<length;j++){
if(array3[array1[i]][array2[j]]){
context.fillRect(i, j, 1, 1);
}
}
}
Скрипт (работает в Google Chrome).
С помощью нашего импровизированного ткацкого станка мы можем нарисовать самые разнообразные узоры:
![](https://habrastorage.org/webt/hi/-8/uk/hi-8ukwkgz9mkjr3msne7cvs1-8.png)
Но так исторически сложилось, что у среднестатистического человека не больше двух ног. Поэтому удобно одновременно зажимать не больше двух педалей. Один из самых популярных шаблонов для ткацкого станка выглядит следующим образом:
![](https://habrastorage.org/webt/zs/h0/fa/zsh0fa1qkdfxoc7wr0iptdw7jim.png)
Для 4-х рамок. И его модификация для 8-ми рамок:
![](https://habrastorage.org/webt/v2/im/me/v2immeiq-qmwznj9muhxt-skjzi.png)
Неожиданно, узоры (или фрагмент узоров) сделанные с помощью этого шаблона, похожи на наши «бильярдные» паттерны. Кроме того, эти узоры получаются закрашенными:
![](https://habrastorage.org/webt/op/n7/t2/opn7t2e-l_ya_3tjbij1vmqopba.png)
Можно научиться подбирать «бильярдные» паттерны для ткацкого станка. Пример:
![](https://habrastorage.org/webt/dl/iy/va/dliyva3ad-ovjxirqklonlwofq8.png)
В начале статьи мы уже видели фрагмент этого паттерна.
Закончим с ткацкими станками и напишем скрипт для визуализации двоичных последовательностей. От одного из массивов можем избавиться — паттерн симметричен по диагонали. Как заполнить оставшийся массив? Элементарно:
![](https://habrastorage.org/webt/tx/vs/va/txvsvavbel6numycjbyblelgxhe.png)
Берем последовательность для
![](https://habrastorage.org/webt/tc/fd/yh/tcfdyh0bubujzir3a5azmiir6pg.png)
var a=[0];
for(var i=1;i<size;i++){
if(Math.floor(i*Math.sqrt(2))%2==1)
a[i]=a[i-1]+1;
else
a[i]=a[i-1]-1;
}
Проверяем:
for(var i=0;i<size;i++){
context.fillRect(i, a[i]+50, 1, 1);
}
![](https://habrastorage.org/webt/vm/ke/-s/vmke-s7o5kjgmamfjgbicohx7pu.png)
Фактически мы уже получили элементарный фрактал, но продолжим.
Далее разберемся с матрицей:
![](https://habrastorage.org/webt/2j/cy/nc/2jcynct9lxb-kmcukhiawaiy6wo.png)
Суммируем
Окончательный алгоритм занимает всего несколько строк:
var a=[0];
for(var i=1;i<size;i++){
if(Math.floor(i*Math.sqrt(2))%2==1)
a[i]=a[i-1]+1;
else
a[i]=a[i-1]-1;
}
for(var x=0;x<size;x++){
for(var y=0;y<size;y++){
q=(a[x]+a[y]+512)%4;
if(q==0 || q==1) context.fillRect(x, y, 1, 1);
}
}
Визуализируем наши фрактальные последовательности.
![](https://habrastorage.org/webt/vl/hc/qf/vlhcqf75d2uvz-dzf_gq-ekjire.png)
Можно легко модифицировать скрипт для того, чтобы получить RGB-изображение:
q=(a[x]+a[y]+512)%4;
/*if(q==0 || q==1) context.fillRect(x, y, 1, 1);*/
if(q==0) context.fillStyle = 'rgb(255,0,0)';
if(q==1) context.fillStyle = 'rgb(0,255,0)';
if(q==2) context.fillStyle = 'rgb(0,0,255)';
if(q==3) context.fillStyle = 'rgb(0,0,0)';
context.fillRect(x, y, 1, 1);
![](https://habrastorage.org/webt/n5/xa/yh/n5xayhratfrrzopogtfpfv0ps8o.png)
Выше мы к сумме a[x]+a[y] прибавляли некоторое число
q=(a[x]+a[y])%4;
if(q==0 || q==1) context.fillRect(x, y, 1, 1);
![](https://habrastorage.org/webt/qr/q2/aw/qrq2awxzsudevbd0ebegetlc14q.png)
Можно представить это так, будто часть фрактала находится ниже некоторой мнимой границы (ниже этой границы закрашиваются только отрицательные значения кратные 4-м: -4, -8, -12, ...).
Можем посмотреть, где находится эта граница:
if(a[x]+a[y]>=0) context.fillRect(x, y, 1, 1);
![](https://habrastorage.org/webt/t3/g9/nk/t3g9nkjqukrgtev-mxxnoy0hcb4.png)
Вместо деления по модулю, можем сравнить сумму с некоторым определенным значением и тем самым закрасить только один «слой» фрактала. В качестве примера возьмем среднее между минимальным и максимальным значением:
q=(a[x]+a[y]);
if(q==0) context.fillRect(x, y, 1, 1);
![](https://habrastorage.org/webt/6d/lq/bh/6dlqbhtynhvmqms1qbs6x4wxlzk.png)
Если не понятно![](https://habrastorage.org/r/w1560/webt/rn/jj/5x/rnjj5xr5zkuqgokn9jqjso-nf94.png)
![](https://habrastorage.org/webt/rn/jj/5x/rnjj5xr5zkuqgokn9jqjso-nf94.png)
Изменяя значения от минимального до максимального, можем посмотреть как меняются «слои» в динамике:
![](https://habrastorage.org/webt/3k/oq/r9/3koqr9dr0zchs0nzp-5mk-gebic.gif)
Если не понятно
Настоятельно не рекомендую открывать спойлер, если у вас эпилепсия![](https://habrastorage.org/webt/h0/l_/07/h0l_07baubuh8ooiqjeot4bawvu.gif)
![](https://habrastorage.org/webt/h0/l_/07/h0l_07baubuh8ooiqjeot4bawvu.gif)
Кроме того, мы можем «в лоб» сравнить a[x] с a[y] и тоже получить фрактальный паттерн:
if(a[x]==a[y]) context.fillRect(x, y, 1, 1);
![](https://habrastorage.org/webt/sh/pq/ux/shpquxpwl0od4hqt29mss5ionfc.png)
Следующая последовательность:
Фрактал:
![](https://habrastorage.org/webt/pi/9o/-9/pi9o-92eevg-2qdzi9v5-yzpu1e.png)
RGB:
![](https://habrastorage.org/webt/90/xe/jp/90xejpi_ilozo36ollvbuffahkq.png)
Средний слой:
![](https://habrastorage.org/webt/_g/pv/h3/_gpvh3lipfwaasma3ga0xs3-v3g.png)
В динамике:
![](https://habrastorage.org/webt/d3/d5/z8/d3d5z80a0o6e3zl0jnad3a5c_uk.gif)
Фрактал:
![](https://habrastorage.org/webt/mm/zk/_f/mmzk_frqkevqofu12zyidj7jhdo.png)
RGB:
![](https://habrastorage.org/webt/zh/jn/-f/zhjn-f2cynkm7roudinj4pmzsho.png)
Средний слой:
![](https://habrastorage.org/webt/az/rl/oi/azrloiumcpjfvfzayridhkkmrti.png)
В динамике:
![](https://habrastorage.org/webt/nl/8z/xw/nl8zxwcclmggf-g8zetw2kbfn_g.gif)
Фрактал:
![](https://habrastorage.org/webt/9d/po/ae/9dpoaefqvluq1ho55to_okwtffg.png)
RGB:
![](https://habrastorage.org/webt/p6/br/qt/p6brqte98ioj_wywqowvticifes.png)
Средний слой:
![](https://habrastorage.org/webt/ps/nm/7u/psnm7unaxs59initknhehiew_kk.png)
В динамике:
![](https://habrastorage.org/webt/tk/rb/mp/tkrbmpnq0zrs8d7snknoabrx_00.gif)
Фрактал:
![](https://habrastorage.org/webt/c9/h6/2h/c9h62ho7fl-ubfnuwr6dndjwwj4.png)
RGB:
![](https://habrastorage.org/webt/zp/yv/ux/zpyvuxtzzuxhoij46yljq5fdnko.png)
Средний слой:
![](https://habrastorage.org/webt/mt/qe/xf/mtqexfbg86g7zijebdctaxqclv4.png)
В динамике:
![](https://habrastorage.org/webt/nt/_s/u6/nt_su6tiim6grklbsgjrypvmhee.gif)
Ну и наш любимый фрактал (часть этого паттерна можно нарисовать с помощью бильярда, с размерами сторон равными числам Фибоначчи):
Фрактал:
![](https://habrastorage.org/webt/oc/ao/vl/ocaovlmgdleylvm8ctff0wbmgsk.png)
RGB:
![](https://habrastorage.org/webt/8n/_b/-x/8n_b-x71vncy_e6nqa6lzeaatmk.png)
Средний слой:
![](https://habrastorage.org/webt/2x/mn/xp/2xmnxpok5j-npsfrkrvfkrrhp0s.png)
В динамике:
![](https://habrastorage.org/webt/yg/4t/sg/yg4tsgl97nd6xz34xlgyw0cl8ck.gif)
Еще одна последовательность в завершение:
Паттерн:
![](https://habrastorage.org/webt/vp/rz/iz/vprziztepwojya_kx2hk6dzvywk.png)
RGB:
![](https://habrastorage.org/webt/mp/xm/pt/mpxmptnaygi8fbqzg2d9fq0_xgm.png)
Средний слой:
![](https://habrastorage.org/webt/zu/xu/gj/zuxugjchcpv0rdjkkp7asuyndhi.png)
В динамике:
![](https://habrastorage.org/webt/cn/m5/em/cnm5emimypr3_up5qgwrditsids.gif)
Другие квадратные корни можно вбить в скрипт. (Можно вбивать дробные значения).
Во втором скрипте можно вбить последовательность вручную.
Еще один скрипт для бильярдов. Координаты мышки — размеры бильярда. Паттерн в левой части формируется из последовательности, полученной с помощью остатков от деления (подробности в предыдущей статье). В правой части — четность