Информационный сервер для программистов: Исходники со всего света. Паскальные исходники со всего света
  Powered by Поисковый сервер Яndex: Найдется ВСЁ!
На Главную Исходники Форум Информер Страны мира
   Графика    >>    mandel
   
 
 Множество Мандельброта  Константин Поддубный 11.07.1994

Программа рисования множества Мандельброта и сохранения картинок в файл.



162k 
 

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