Алгоритм описания множества Мандельброта

jpg.

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

Сам алгоритм Мандельброта достаточно прост и заключается в следующем:

Проходя по всем точкам экрана, проверяем принадлежат ли они множеству
Мандельброта.

for(k = 0; k < DEPTH; k++) {        
 
  tmp = zr*zr - zi*zi;
  zi = 2*zr*zi + ci;
  zr = tmp + cr;
  if (zr*zr + zi*zi > 1.0E16)        
    break;                           
}

, где DEPTH - количество итераций ("глубина" картинки).

Если |z| (zr*zr + zi*zi) уходит в бесконечность, то это внешняя точка и
окрашиваем её в соответствующий оттенок красного. Если же нет, то эта точка
из множества Мандельброта и окрашиваем её в чёрный цвет.

#include <stdlib.h>
#include <stdio.h>
#include <conio.h>
#include <math.h>
 
#define DEPTH 1000     //  чем выше этотпоказатель, тем "глубже" получается картинка
 
unsigned char far *screen = (unsigned char far *) 0xA0000000;
 
//вызываем прерывание 10h
void SetMode (unsigned short mode) {
  asm {
	 mov ax, [mode]
	 int 0x10
  }
}
 
//установка точки на экран
void putpixel (int x, int y, int color)
{
	screen[y * 320 + x] = color;
	return;
}
//функция установки цвета
void setpallette (unsigned char num,unsigned char r,
		  unsigned char g,unsigned char b)
{
   outp (0x3c6,0xff);
   outp (0x3c8,num);
   outp (0x3c9,r);
   outp (0x3c9,g);
   outp (0x3c9,b);
}
int main() {
 
  SetMode(0x13);
 
  float zi, zr, ci, cr, tmp;
  int i, j, k, m;
 
  for(i = -160; i < 160; i++) {                      //  проходим по всем пикселям оси х
 
	 ci = ((float)i) / 160.0;                    //  присваеваем мнимой части с - i/160
	 for(j = -190; j < 10; j++) {                 //  проходим по всем пикселям оси y6
 
		cr = ((float)j) / 120.0;             //  присваеваем вещественной части с - j/120
		zi = zr = 0.0;                       //  присваеваем вещественной и мнимой части z - 0
		for(k = 0; k < DEPTH; k++) {         //  вычисляем множество Мандельброта
 
		  tmp = zr*zr - zi*zi;
		  zi = 2*zr*zi + ci;
		  zr = tmp + cr;
		  if (zr*zr + zi*zi > 1.0E16)        //  если |z| слишком велико, то
		    break;                           //  выход из цикла
		}
		if (k < DEPTH) {                     //  |z| - велико
		  m = k%8 + 1;                       //  - это внешняя точка
		  setpallette(m, m*8 + 7, 0, 0);     //  выбираем оттенок
		  putpixel(i + 160, j + 190, m);     //	 красного
		}
		else
		  putpixel(i + 160, j + 190, 0);      // внутренняя точка и закрашиваем её в чёрный цвет
	 }
	 if(kbhit())                                  // пока не нажата клавиша
	   break;
  }
 
  getch();
  return 0;
}

Ключевые слова: 
Алгоритм, режим 13h, Мандельброт, фрактал
ВложениеРазмер
Исходный код и исполняемый файл11.53 кб