From: "Constantin Poddubny" <const@const.krasnoyarsk.su>
Organization: The Sosnovoborsk Municipal Venture for Housing and
Communications
Написано это еще на заре моего
освоения Паскаля, так что не обессудьте за корявость и плохую
комментированность.
Множество Мандельбротта. Занялся я этой задачей еще в 1985 году,
когда в журнале "В мире науки" ("Sientific American") на русском языке я
прочитал статью, где о нем и говорилось. Сначала я писал эту программу на
Фортране на Электронике-60, затем на Сях на первых IBM PC 286, и, наконец,
на Паскале. Год назад, я узнал, что метод расчета, используемый мною, туп
до безобразия, т.к. существуют гораздо более быстрые и эффективные алгоритмы,
но что возмешь с зеленого (тогда еще) программера? :-)
Нарисованные картинки можно сохранять. У меня этих картинок более 5 Мб.
Есть так себе, а есть ну просто завораживающие.
Успехов,
--
+-----------------------------------+------------------------------------+
| Константин Поддубный, программист | E-mail: const@const.krasnoyarsk.su |
| Сосновоборское ГМП ЖКХ | Voice/Fax: (391-2) 32-06-30 |
+-----------------------------------+------------------------------------+
{> Cut here. FileName= READ.ME }
Программа mandel.exe предназначена для генерации так называемого
множества Мандельбротта. Это множество, названное в честь своего
открывателя, находится на комплексной плоскости и рассчитывается по
формуле:
Z(i+1) = Z(i)^2 + C,
где C - комплексная константа, Z - комплексная переменная, причем
Z(1) = 0. Считается, что некая точка C = x + yi (i - мнимая единица:
i^2 = -1) на комплексной плоскости принадлежит множеству Мандельбротта,
если при достаточно большом числе итераций модуль числа Z не превышает
2.
Множество Мандельбротта является фрактальным и по недоказанной
теореме связным, т. е. из любой точки множества можно попасть в другую
не пересекая границы множества.
Практический интерес же представляет не само множество, а граничные
с ним области. Оказалось, что если присваивать некоей точке цвет в
соответствии с числом итераций, требующихся для достижения ей модуля 2,
то получаются весьма замысловатые и очень красивые узоры. Особенно
интересно наблюдать за какой нибудь областью множества при все
увеличивающемся разрешении.
Для отрисовки множества Мандельбротта и приграничных с ним областей
в программе используются следующие алгоритм и формулы:
пусть C = a + bi, Z = x + yi, тогда:
Z^2 = ( x + yi )^2 = x^2 + 2xyi - y^2
Модуль числа Z: |Z| = Sqrt( x^2 + y^2 )
const
MaxIter = 1000;
var
I: integer;
x, y, temp: real;
a, b: real;
...........................
I := 0;
x := 0;
y := 0;
repeat
temp := Sqr(x) - Sqr(y) + a;
y := 2 * x * y + b;
x := temp;
Inc( I )
until ( 4.0 <= Sqr(x) + Sqr(y)) or ( I >= MaxIter );
PutPixel( ??, ??, I div ( MaxIter div 256 )) { отрисовать точку }
...........................
Для начала рекомендуется использовать предел числа итераций не
более 1000. Большее число итераций приводит к большему времени
вычисления точек, принадлежащих множеству и находящихся вблизи границы.
Можно также пробовать задавать количество цветов большее чем 256,
например 32 тыс. или даже 16 млн. Но очень хорошие результаты получаются
и при 256 цветах.
Для того чтобы не использовать палитру VGA по умолчанию
программа перенастраивает ее на свои цвета.
Работа с программой.
Запуск: mandel - отрисовывает все множество (в границах от -2.0 до
2.0);
mandel имя.pcx - показывает ранее сохраненную область
множества.
После отрисовки множества или его части в центре экрана появляется
белый квадрат, который можно перемещать по картинке (клавиши Up, Down,
Right, Left), увеличивать или уменьшать его размер (клавиши PageDown и
PageUp). Клавиша Enter позволяет перерисовать часть множества,
заключенную в белый квадрат.
Клавиша от 1 до 6 меняют текущую палитру VGA. Для разных областей
множества могут подходить различные палитры.
Клавиши r и w соответственно читают или записывают из/в файл
область множества в формате pcx, причем в файл также записываются
границы области, текущее разрешение и число итераций, так что в любой
день можно продолжить свои похождения по множеству, начиная не с нуля.
Клавиша Esc заканчивает работу с программой.
*************************************************************
Поддубный Константин
Красноярский край, г. Сосновоборск
тел./факс (391-2) 32-06-30 E-mail: const@const.krasnoyarsk.su
|