Красота фракталов - написание простой программы визуализации фракталов на языке C#

Многие программисты уже писали свои приложения визуализации фракталов, начиная с использования C64 и Amiga до современных компьютеров, используя различные языки (даже в калькуляторе TI в BASIC). Визуализация фракталов является хорошим способом научиться программировать, особенно если вы пишете движок рисования фракталов в C#. В таком случае целью будет сбор множества техник программирования, выученных за несколько лет работы, в одно приложение. В данном приложении можно найти множество различных тем, таких как:
  • Общее программирование в C#
  • MDI-приложения, выполненные в .NET
  • Использование классов интерфейса в C#
  • Использование указателей на функции (delegate)
  • Асинхронные вычисления
  • Использование нескольких ядер процессора
  • Произведение многопоточных математических вычислений
  • Билинейная фильтрация растровых изображений
  • Сложные численные классы в C#
  • Математические основы фракталов Mandelbrot, Julia и Newton
  • и многое другое ...

Основы

Фракталы привлекают многих с детства. Многие могут вспомнить движки рисования фракталов Mandelbrot на commodore 64. Многие могут оказаться под впечатлением таких простых алгоритмов, как:

Фрактал типа Newton
Фрактал типа Mandelbrot, рассмотренный с высоты
Фрактал типа Julia
Фрактал типа Mandelbrot без и с 'точной' обработкой
  

Точная обработка (визуализация) означает то, что число итераций представлено не типом int , а в виде double, и цвет, используемый для отображения результата интерполируется между предыдущим и следующим цветом в цветовой палитре. Использование точной обработки не требует большей производительности от процессора, но значительно улучшает результат.

Где-то в центре фрактала типа Mandelbrot
 

Код

Мы не будем представлять вам блоки кода в данной статье - просто откройте предлагаемые в начале статьи файлы и изучите его. Код простой и понятный, все должно быть ясно. Для новичков данный код окажется хорошим уроком - в файлах вы найдете множество вещей, которые иногда сложно найти в других источниках.

Есть один класс-интерфейс IFractal , от которого будет унаследован базовый класс фрактала. Из данного базового фрактала будут затем получены фракталы Mandelbrot, Julia и Newton.

У вас также есть MDI-контейнер и общий дочерний MDI , который может обрабатывать отображение, перетаскивание и увеличение фракталов. Вы можете перетащить прямоугольник с зажатой левой кнопкой мыши для увеличения фрактала. Вы можете передвигать его зажав правую кнопку мыши и передвигая курсор. Вы также можете изменить контрольную точку, используемую в случае с фракталом типа Julia , при помощи передвижения мыши с зажатой средней кнопкой.

Фракталы могут быть сохранены и загружены из XML-файлов. Обработанные фракталы могут быть сохранены в PNG-файлах.

Движок обрабатывает фракталы на достаточной скорости. Он определяет число доступных ядер процессора и создает один поток обработки для каждого из ядер. Время, необходимое на обработку фракталов, практически уменьшается вдвое при переходе от одноядерного процессора к двухъядерному. При использовании компьютера с двухъядерным процессором обработка фрактала Mandelbrot размером в 2000x2000 пикселей и при установке в 256 итераций на пиксель, занимает примерно 650 мс, что является допустимой скоростью.

Предлагаемая программа далека от завершения, но она уже в состоянии вырисовывать красивые обработки фракталов. Также она показывает, как просто можно выполнить это в C#. Если это выполнить на языке C++, это займет гораздо больше времени.

Идеи о следующих шагах

Есть различные способы улучшения данной программы (я надеюсь вам они покажутся интересными и вы попытаетесь их реализовать):

  • Экранная заставка, вырабатывающая различные фракталы.
  • Обработчик видео-фракталов.
  • Обработка динамических размеров палитры вплоть до неограниченного числа цветов. На данный момент, палитра зафиксирована на 256 цветах, хотя форма палитры может отображать различное число цветов.
Над данными улучшениями стоит поразмыслить.
 
Автор: Zimmermann Stephan