/*	lsystem.c -- nach Beispiel aus Buch "C-Programmierung unter Linux		*/
/*	Programm zeichnet eine Pflanze als Fraktal mithilfe der Rekursion		*/

#include <graphics.h>
#include <math.h>

/* ------------------ Makros für die Symbole der Produktionsregeln -------------------- */
#define		F	f(t-1);							/* F */
#define		M	phi=phi-delta;						/* - */
#define		P	phi=phi+delta;						/* + */
#define		A_	altx=x; alty=y; altphi=phi;				/* [ */
#define		_Z	x=altx, y=alty, moveto((int)x, (int)y); phi=altphi;	/* ] */

/* --- Makros, die Zeichenregeln beschreiben; müssen für neue Bilder gesetzt werden --- */
#define		ANFWINKEL	100		/* Winkel zum Zeichnen der 1. Gerade	*/
#define		DREHWINKEL	24		/* Drehwinkel (Schrittweite)		*/
#define		LFAKTOR		0.5		/* Verkleinerungsfaktor der Länge	*/
#define		STARTX		(getmaxx()/2)	/* x-Koordinate zu Beginn		*/
#define		STARTY		getmaxy()-30	/* y-Koordinate zu Beginn		*/
#define		STARTLAENGE	getmaxy()/8	/* Ausgangslaenge			*/
#define		REKTIEFE	5		/* Rekursionstiefe			*/


double x, y, laenge, phi, delta;


void f(int t);

/* ----------------------------------- main() ----------------------------------------- */
int main(int argc, char* argv[]){
	const double	PI = 4*atan(1);
	int		t;

	delta = (DREHWINKEL*PI)/180;		/* Umrechnung Winkel -> Bogenmass	*/
	initgraph(640, 480);
	laenge=STARTLAENGE;

	for(t=1; t<=REKTIEFE; ++t){
		cleardevice(LIGHTBLUE);
		phi=(ANFWINKEL*PI)/180;		/* Umrechnung Winkel -> Bogenmass	*/
		x=STARTX; y=STARTY;
		moveto((int)x, (int)y);
		f(t);
		laenge*=LFAKTOR;
		getch();
	}

	closegraph();
	return 0;
}

/* ---------------------------------------- f() --------------------------------------- */
void f(int t){
	double altx, alty, altphi;
	if(t>0) {
		//F  A_ F P F M M F _Z  A_ M F P F _Z
		F F M  A_ M F P F P F _Z  P  A_ P F M F M F _Z
	}
	else {
		x += laenge*cos(-phi);
		y += laenge*sin(-phi);
		lineto((int)x, (int)y);
	}
}

