Построить фрактал множество Мандельброта. Сам алгоритм Мандельброта достаточно прост и заключается в следующем: Проходя по всем точкам экрана, проверяем принадлежат ли они множеству 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, Мандельброт, фрактал
|
|||||||