Пять лет назад, когда я учился на последнем курсе института, нашей группе задали курсовую работу по основам ООП. Тему я выбрал самую интересную (и простую) из предложенных: «Отрисовка фрактальных изображений в Java-апплете». Всего-то требовалось написать программу, которая рассчитывает статическое изображение фрактала Жюлиа и выводит его на экран.
Немного поэкспериментировав, я понял, что статические изображения фракталов не так уж и интересны, а вот если начать их анимировать, то над результатом легко можно залипнуть на полдня. Анимировать фрактал Жюлиа очень удобно. На его форму влияет единственный параметр — комплексное число. Можно менять его во времени по какой-нибудь формуле, а можно привязать его действительную и мнимую части к положению мыши, и тогда можно движением руки заставить фрактал принимать бесчисленное количество форм.
Расчёт фрактала требует большого объёма вычислений. Чтобы рассчитать один его пиксель, нужно произвести порядка сотни операций вычисления квадратичного полинома от комплексного числа. Даже у современных CPU не хватает мощности для генерации полноэкранного изображения 60 раз в секунду. Моя курсовая на Java рендерила фрактал в восемь потоков и в маленьком окошке иногда выдавала до 30 fps, чем я очень гордился.
Позже, изучая на работе WebGL, я вспомнил про фракталы и подумал, что эта технология подходит для их отрисовки куда лучше, чем Java-апплет. WebGL позволяет перенести расчёт картинки с процессора на видеокарту, а она намного лучше подходит для подобных задач. Я решил, что это из этого получится неплохая WebGL-демка.
Вот результат этого эксперимента: https://fractaloscope.gl/.
Как и ожидалось, WebGL показал себя отлично — большинство устройств без проблем справляются с рендерингом полноэкранного изображения, хоть и начинают шуметь кулерами на всю комнату. В демку добавлено несколько красивых цветовых схем и опциональное звуковое сопровождение в виде дроун-эмбиента. Получилось довольно залипательно.
Интереснее всего менять у фрактала тот самый комплексный параметр. При наличии мыши это делается драгом с зажатой правой кнопкой, а на тач-устройствах — драгом двумя пальцами. Работает также комбинация Ctrl + драг левой кнопкой мыши. Фрактал можно таскать и зумить. Увеличить изображение, к сожалению, можно не больше, чем в 65 000 раз, после чего можно увидеть, как заканчивается точность 32-битных чисел с плавающей точкой и картинка становится пикселизованной.