// mandelbrot.cpp

#include <iostream>
#include <fstream>

using namespace std;

fstream picture;

long steps(long maxi, double c1, double c2) {
	double z1=0;
	double z2=0;
	double a;
	double b;
	int stop=0;
	long i=0;
	do {
		i+=1;
		a=z1*z1;
		b=z2*z2;
		z2=c2+2*z1*z2;
		z1=c1+a-b;
		if ((a+b)>9) stop=1;
	}
	while ((!stop) && (i<maxi));
	return i;
}

int bmpx(int i) {
	int ret=i;
	while (ret%4) ret++;
	return ret;
}

void pb(int b) {
	char cb=(char) b;
	picture.write((char*) &cb,sizeof(char));
}

void hilo(int m, int b[4]) {
	int l=m;
	int i;
	for (i=0; i<4; i++) {
		b[i]=l;
		l=(l>>8);
	}
	b[2]-=(b[3]<<8);
	b[1]-=(b[2]<<8)+(b[3]<<16);
	b[0]-=(b[1]<<8)+(b[2]<<16)+(b[3]<<24);
}

void header(int x, int y) {
	int i;
	int j;
	int res;
	int size;
	int b[4];
	res=bmpx(x)*y;
	size=1078+res;
	pb(66);
	pb(77);
	hilo(size,b);
	for (i=0; i<4; i++) pb(b[i]);
	for (i=0; i<4; i++) pb(0);
	pb(54);
	pb(4);
	for (i=0; i<2; i++) pb(0);
	pb(40);
	for (i=0; i<3; i++) pb(0);
	hilo(x,b);
	for (i=0; i<4; i++) pb(b[i]);
	hilo(y,b);
	for (i=0; i<4; i++) pb(b[i]);
	pb(1);
	pb(0);
	pb(8);
	for (i=0; i<5; i++) pb(0);
	hilo(res,b);
	for (i=0; i<4; i++) pb(b[i]);
	hilo(3780,b);
	for (j=0; j<2; j++)
		for (i=0; i<4; i++)
			pb(b[i]);
	pb(0);
	pb(1);
	for (i=0; i<6; i++) pb(0);
}

void palette() {
	int i;
	double R;
	double G;
	double B;
	for (i=0; i<256; i++) {
		R=0;
		G=0;
		B=0;
		if ((i>90) && (i<130)) R=(i-90)/40.0;
		if (i>=130) R=1.0;
		if ((i>43) && (i<85)) G=(i-43)/47.786;
		if ((i>=85) && (i<130)) G=0.879+(i-85)/371.9;
		if ((i>=130) && (i<175)) G=(175-i)/45.0;
		if (i>215) G=(i-215)/40.0;
		if (i<45) B=i/46.0;
		if ((i>=45) && (i<85)) B=(85-i)/40.9;
		if ((i>=175) && (i<220)) B=(i-175)/45.0;
		if (i>=220) B=1.0;
		pb((int) (0.1+255.8*B));
		pb((int) (0.1+255.8*G));
		pb((int) (0.1+255.8*R));
		pb(0);
	}
}

int main() {
	int i;
	int j;
	int x;
	int y;
	int ki;
	int kj;
	int x_bmpx;
	long f;
	long maxi;
	double c1;
	double c2;
	double prz=0;
	double m=0.000003657;
	double re=-0.743650449;
	double im=0.1318204775;
	cout << "\nresolution x (e.g., 1200) : ";
	cin >> x;
	cout << "maximum number of steps (e.g., 20000) : ";
	cin >> maxi;
	y=(3*x)/4;
	cout << "creating " << x << "x" << y << " mandelbrot.bmp\n";
	picture.open("mandelbrot.bmp", ios::out|ios::binary);
	header(x,y);
	cout << "writing palette\n";
	palette();
	cout << "calculating picture\n";
	cout.precision(1);
	cout.setf(ios::fixed);
	x_bmpx=bmpx(x);
	for (j=y-1; j>=0; j--) {
		for (i=0; i<x; i++) {
			f=0;
			for (kj=0; kj<4; kj++) {
				for (ki=0; ki<4; ki++) {
					c1=re+(m*((i<<2)+ki))/x;
					c2=im+(m*((j<<2)+kj))/x;
					f+=steps(maxi,c1,c2);
				}
			}
			if (f==(maxi<<4)) f=0;
			f=f>>6;
			if (f>255) f=255;
			pb((int) f);
		}
		for (i=x; i<x_bmpx; i++) pb(0);
		prz+=(100.0/y);
		cout << "\r[" << prz << "%]";
	}
	picture.close();
	cout << "\nready. (mhebel)\n";
	return 0;
}

   zurück