/* Mandelbrot Set Generator in C by Robert John Morton The first program below generates and displays the Mandelbrot Set. It also stores the image data in a file called mandel.dat. It could have been made to run faster. However, it's only for amusement! TO GENERATE THE MANDELBROT SET */ #include #include #include #define XBIAS 395 #define YBIAS 240 main() { int c, e = 0, i; float cx, cy, x, y, z; FILE *h; _setvideomode(_VRES16COLOR); h = fopen("mandel.dat","w"); for(cy = -2; cy < 2 && e == 0; cy += .01) { for(cx = -2.5; cx < 1.5 && e == 0; cx += .01) { for(x = .01, y = .01, c = 0, i = 0; i < 128; i++) { if(kbhit()) {e = 1; break;} z = x * y; x = x * x - y * y + cx; y = z + z + cy; if(x < -2.5 || x > 1.5 || y < -2 || y > 2) { if(i < 2) c = 1; // dark blue else if(i < 3) c = 2; // dark green else if(i < 4) c = 3; // dark cyan else if(i < 5) c = 4; // dark red else if(i < 6) c = 5; // dark magenta else if(i < 7) c = 6; // dark yellow else if(i < 8) c = 7; // dark yellow else if(i < 9) c = 9; // light blue else if(i < 10) c = 10; // light green else if(i < 11) c = 11; // light cyan else if(i < 12) c = 12; // light red else if(i < 13) c = 13; // light yellow else if(i < 14) c = 14; // light yellow else c = 15; // white _setcolor(c); _setpixel( XBIAS + (int)(cx * 100), YBIAS - (int)(cy * 100) ); break; // break the i-loop } } if(h != NULL) putc(c, h); // save pixel colour } } fclose(h); _settextposition(1, 1); printf("THE MANDELBROT SET"); c = getchar(); _setvideomode(_DEFAULTMODE); } /* To download a compiled version to run on a PC, right-click on "mandel1.exe" and save it to your local disk. The second program here simply re-displays the Mandelbrot Set from the data previously stored in mandel.dat by the first program. TO RE-DISPLAY THE MANDELBROT SET [Compiled as Mandel2.exe] */ #include #include #include #define XBIAS 370 #define YBIAS 240 main() { int c, e = 0, x, y; FILE *h; _setvideomode(_VRES16COLOR); _settextposition( 1,32); printf("THE MANDELBROT SET"); _settextposition(30,31); printf("Hit C/R key to quit."); _setcolor(7); yscale( -260 ); yscale( 160 ); xscale( -210 ); xscale( 210 ); if(h = fopen("mandel.dat","r")) { for(y = -200; y < 201 && e == 0; y++) for(x = -250; x < 151; x++) { if(kbhit()) {e = 1; break;} _setcolor( getc(h) ); _setpixel(XBIAS + x, YBIAS - y); } fclose(h); } else printf("Could not open data file."); c = getchar(); _setvideomode(_DEFAULTMODE); } yscale(int a) { //a = -260 or +160 int y; _moveto (XBIAS + a, YBIAS - 200); _lineto (XBIAS + a, YBIAS + 200); for(y = -200; y < 201; y += 50) { _moveto (XBIAS + a - 5, YBIAS + y); _lineto (XBIAS + a + 5, YBIAS + y); } } xscale(int b) { //b = -210 or +210 int x; _moveto (XBIAS - 250, YBIAS + b); _lineto (XBIAS + 150, YBIAS + b); for(x = -250; x < 151; x += 50) { _moveto (XBIAS + x, YBIAS + b - 5); _lineto (XBIAS + x, YBIAS + b + 5); } } /* The compiled version of this program is mandel.exe, which you can download by right-clicking on its name and saving it to your local disk. ODD FUNCTIONS Below are a couple of functions I wrote during my session with chaos as part of a larger idea that had to be put on indefinite hold at the time because of other work. 1. Square a Complex Number */ (x + iy)**2 = (x + iy)(x + iy) = x**2 + i**2y**2 + i2xy = x**2 - y**2 + i2xy SquareComplex(struct complex c) { double x = c -> r, y = c -> i, z; c -> r = x * x - y * y; //Real part of square: x**2 - y**2 z = r * i; c -> i = z + z; //Imaginary part: 2xy } /* 2. Display a complex quantity as a pixel on the complex plane. */ #define REALSCALE 128 //Screen pixel scaling factor #define IMAGINERYSCALE 128 //Screen pixel scaling factor DisplayComplex(struct complex c) { static int initialised = NO; if(initialised == NO) { _setvideomode(_VRES16COLOR); //Set to VGA 640 by 480 pixels _setlogorg(320,240); //Set origin to screen centre _setcolor(15); //Set pixel colour bright white initialised = YES; //Set the initialisation flag } _setpixel( //display the pixel (int)((c -> r) *= REALSCALE), (int)((c -> i) *= IMAGINERYSCALE) ); } /* Author: Robert John Morton */