#include <stdio.h>

double motif[]={
	0.4, 0.2,
	0.2, -0.4,
	0.4, 0.2
};

#define MLEN 3

#define X 2048
#define Y 1024
#define SCALE 1920

#define THRESH 0.01

#define VERBOSE

/* no user-serviceable parts below this line */

#define XO (X-SCALE)/2
#define YO Y/2

unsigned char p[X*Y];
int max = 0;
int points = 0;

void meander (double x, double y, double dx, double dy) {
	int i;
	
	for (i=0; i<MLEN; i++) {
		double xx=motif[i*2];
		double yy=motif[i*2+1];
		
		double xn, yn;

		xn = dx*xx+dy*yy;
		yn = dy*xx-dx*yy;

		if (xn*xn+yn*yn<THRESH) {
			unsigned char *c=&p[(int)x+((int)y)*X];
			points++;
			if (++*c>max)
				max=*c;
		} else
			meander (x, y, xn, yn);

		x += xn;
		y += yn;
	}
}

int main(void) {
	memset(p, 0, sizeof(p));

	meander (XO, YO, SCALE, 0);

	printf ("P5\n%d %d %d\n", X, Y, max);
	if (!fwrite (p, X*Y, 1, stdout)) 
		perror("fwrite");

#ifdef VERBOSE
	fprintf(stderr, "%d points\n", points);
#endif
	return 0;
}
