/* Fractal program written in Borland C */ /* Quite fast, but no easy method of moving the image about / zooming */ /* From dpchan@kentroad.demon.co.uk Sat Feb 15 01:32:04 1997 Return-Path: From: David Chan To: r.hopkins@ic.ac.uk Subject: Tesseral Mandelbroting Hi Hoppy. Please include this program on your web page. If you think its crap, it is. So improve it and then put it on. Get rid of the shitty bits like the POWER2() function and generally the squashing of the screen array. */ #include #include #include #include int xres=639, yres=239; int maxiter=150; float xlo=-2.5, xhi=1.5; float ylo=0, yhi=1.5; unsigned char pixel[80][239]; void VCHOP (int xmin, int ymin, int xmax, int ymax); void HCHOP (int xmin, int ymin, int xmax, int ymax); void DOPOINT (int x, int y); void DRAWPOINT (int x, int y, int col); void STARTBOX (int xm, int xmax, int ymax); void SPIX(int x, int y, int col); unsigned char PIX(int x, int y); char SAMEPIX (int xmin, int ymin, int xmax, int ymax); int INSET (int x, int y); int power2 (int num); void main(void) { int x, y, xm, iter; time_t taken; int graphdrv = DETECT; int graphmode; initgraph( &graphdrv, &graphmode,"\\david\\bc\\bgi"); taken=time(NULL); /*---------------------------------------------*/ xm = xres/2; STARTBOX (xm,xres,yres); VCHOP (0,0,xm,yres); VCHOP (xm,0,xres,yres); /*---------------------------------------------*/ taken=time(NULL)-taken; printf("That took %d seconds",taken); /*printf("That was quick. \n");*/ getch(); closegraph(); } void HCHOP (int xmin, int ymin, int xmax, int ymax) { int x,ym; if (ymax-ymin < 2) return; ym = (ymin + ymax) / 2; for (x=xmin+1;x<=xmax-1;x++) DOPOINT (x,ym); if (!SAMEPIX (xmin,ym,xmax,ymax)) VCHOP (xmin,ym,xmax,ymax); if (!SAMEPIX (xmin,ymin,xmax,ym)) VCHOP (xmin,ymin,xmax,ym); } void VCHOP (int xmin, int ymin, int xmax, int ymax) { int xm,y; if (ymax-ymin < 2) return; xm = (xmin + xmax) / 2; for (y=ymin+1;y<=ymax-1;y++) DOPOINT (xm,y); if (!SAMEPIX (xmin,ymin,xm,ymax)) HCHOP (xmin,ymin,xm,ymax); if (!SAMEPIX (xm,ymin,xmax,ymax)) HCHOP (xm,ymin,xmax,ymax); } char SAMEPIX(int xmin, int ymin, int xmax, int ymax) { int x,y,col; col = PIX (xmin,ymin); for (x=xmin+1;x<=xmax-1;x++) { if (PIX(x,ymin) != col) return (0); if (PIX(x,ymax) != col) return (0); } for (y=ymin;y<=ymax;y++) { if (PIX(xmin,y) != col) return (0); if (PIX(xmax,y) != col) return (0); } col = INSET(xmax, (ymin + ymax)/2); for (x=xmin+1;x<=xmax-1;x++) { for (y=ymin+1;y<=ymax-1;y++) { DRAWPOINT(x,y,col); } } return (1); } void DOPOINT (int x, int y) { int col = INSET (x,y); SPIX (x,y,col); DRAWPOINT (x, y,col); } void DRAWPOINT (int x, int y,int col) { putpixel(x, 239 - y, col); putpixel(x, 240 + y, col); } unsigned char PIX (int x, int y) { int block; int gate; gate = power2(x % 8); block = pixel[x/8][y]; return ((block & gate) / gate); } void SPIX (int x, int y, int col) { int block; int gate; block = pixel[x/8][y]; gate = power2(x % 8) * (col % 2); pixel[x/8][y] = (block | gate); } int INSET(int x,int y) { int i; float cre, cim, zre, zim, re; cre = x * (xhi - xlo)/xres + xlo; cim = (y+1) * (yhi - ylo)/yres + ylo; zre = cre; zim = cim; for(i=1; i 4) return (i); zre = re; } return (1); } void STARTBOX (int xm, int xmax, int ymax) { int x, y; for (y=1; y<=ymax-1; y++) { DOPOINT (0,y); DOPOINT (xm,y); DOPOINT (xmax,y); } for (x = 0; x<=xmax; x++) { DOPOINT (x,0); DOPOINT (x,ymax); } } int power2 (int num) { switch (num) { case 0: return (1); case 1: return (2); case 2: return (4); case 3: return (8); case 4: return (16); case 5: return (32); case 6: return (64); case 7: return (128); } return (0); }