PROCEDURE faltkarte;

CONST 
	pageWidth=210;
	pageHeight=297;
	pageFoldY=148.5;
	rand=20;

VAR
	k1breite:INTEGER;
	k1hohe:REAL;
	k1tiefe:REAL;
	k2breite:INTEGER;
	k2hohe:REAL;
	k2tiefe:REAL;
	breiteapprox:INTEGER;
	k1richtung:BOOLEAN;
	k2richtung:BOOLEAN;

	i:INTEGER;
	k1stbreite:REAL;
	k2stbreite:REAL;
	k1nstreifen:INTEGER;
	k2nstreifen:INTEGER;
	k1stufenwerte:DYNARRAY[] OF REAL;
	k2stufenwerte:DYNARRAY[] OF REAL;

PROCEDURE berechneDiagonal(richtung:BOOLEAN; hohe:REAL; anzahl:INTEGER; VAR yWerte:DYNARRAY[] OF REAL);
VAR
	i:INTEGER;

BEGIN
	FOR i:=0 TO anzahl-1 DO BEGIN
		IF richtung=TRUE THEN
			yWerte[i]:=hohe/(anzahl)*(i+1)
		ELSE
			yWerte[i]:=hohe-hohe/(anzahl)*(i)
	END;	
END;

PROCEDURE berechneSpitz(richtung:BOOLEAN; hohe:REAL; anzahl:INTEGER; VAR yWerte:DYNARRAY[] OF REAL);
VAR
	i:INTEGER;
	spitz:INTEGER;
	dh:REAL;
BEGIN
	spitz:=anzahl DIV 2 + 1;
	dh:=hohe/spitz;
	FOR i:=0 TO anzahl-1 DO BEGIN
		IF richtung=TRUE THEN
			IF i < spitz THEN
				yWerte[i]:=dh*(i+1)
			ELSE
				yWerte[i]:=hohe-dh*(i-spitz+1)
		ELSE
			IF i < spitz THEN
				yWerte[i]:=hohe-dh*(i)
			ELSE
				yWerte[i]:=dh*(i-spitz+2)
	END;	
END;

PROCEDURE berechneKreis(richtung:BOOLEAN; hohe:REAL; anzahl:INTEGER; VAR yWerte:DYNARRAY[] OF REAL);
VAR
	i:INTEGER;
	d:REAL;
BEGIN
	d:=2/(anzahl+1);
	FOR i:=0 TO anzahl-1 DO BEGIN
		IF richtung=TRUE THEN BEGIN
			yWerte[i]:=sqrt(1-sqr(-1+(i+1)*d))*hohe;
		END
		ELSE BEGIN
			yWerte[i]:=hohe-sqrt(1-sqr(-1+(i+1)*d))*hohe;
		END;
	END;
	d:=yWerte[0]/2;
	IF richtung=TRUE THEN BEGIN
		d:=yWerte[0]/2;
	END
	ELSE BEGIN
		d:=-(hohe-yWerte[0])/2;
	END;
	FOR i:=0 TO anzahl-1 DO BEGIN
			yWerte[i]:=yWerte[i]-d;
	END;
END;

BEGIN
	k1breite:=pk1breite;
	k1hohe:=pk1hohe;
	k1tiefe:=pk1tiefe;
	k2breite:=pk2breite;
	k2hohe:=pk2hohe;
	k2tiefe:=pk2tiefe;
	breiteapprox:=pbreiteapprox;	
	k1richtung:=pk1richtung;
	k2richtung:=pk2richtung;

	IF k1hohe < k2hohe THEN BEGIN
		message('falsch!');
	END;

	{*breiten berechnen*}
	k1nstreifen:=k1breite DIV breiteapprox;
	k2nstreifen:=k2breite DIV breiteapprox;
	IF k1nstreifen MOD 2 = 0 THEN
		k1nstreifen:=k1nstreifen+1;
	IF k2nstreifen MOD 2 = 0 THEN
		k2nstreifen:=k2nstreifen+1;
	k1stbreite:=k1breite / k1nstreifen;
	k2stbreite:=k2breite / k2nstreifen;

	{*dina a4 blatt zeichnen*}
	penFore(0,0,65535);
	moveto(0,0);
	lineto(pageWidth,0);
	lineto(pageWidth,pageHeight);
	lineto(0,pageHeight);
	lineto(0,0);

	{*falt zeichnen*}
	penFore(65535,0,0);
	moveto(0,pageFoldY);
	lineto(rand, pageFoldY);
	moveto(pageWidth-rand,pageFoldY);
	lineto(pageWidth, pageFoldY);

	{*körper 1 zeichnen*}
	ALLOCATE k1stufenwerte[0..k1nstreifen-1];
	
	IF pfunktion='Diagonale' THEN
		berechneDiagonal(k1richtung, (k1hohe-k2hohe),k1nstreifen, k1stufenwerte)
	ELSE IF pfunktion='Spitz' THEN
		berechneSpitz(k1richtung, (k1hohe-k2hohe),k1nstreifen, k1stufenwerte)
	ELSE
		berechneKreis(k1richtung, (k1hohe-k2hohe),k1nstreifen, k1stufenwerte);
	penFore(0,65535,0);

	FOR i:=0 TO k1nstreifen-1 DO BEGIN
		Rect(pageWidth-rand-k1breite+k1stbreite*i,pageFoldY-k1tiefe+k2hohe+k1stufenwerte[i], pageWidth-rand-k1breite+k1stbreite*(i+1),pageFoldY-k1tiefe+k2hohe+k1stufenwerte[i]+k1tiefe);
		{*moveto(pageWidth-rand-k1breite+k1stbreite*i,pageFoldY-k1tiefe+k2hohe+k1stufenwerte[i]+(k1hohe-k2hohe)*0.1);
		lineto(pageWidth-rand-k1breite+k1stbreite*(i+1),pageFoldY-k1tiefe+k2hohe+k1stufenwerte[i]+(k1hohe-k2hohe)*0.1);*}
	END;

	{*moveto(pageWidth-rand-k1breite, pageFoldY+k1hohe);
	lineto(pageWidth-rand, pageFoldY+k1hohe);
	moveto(pageWidth-rand-k1breite, pageFoldY+k1hohe-k1tiefe);
	lineto(pageWidth-rand, pageFoldY+k1hohe-k1tiefe);*}
	moveto(rand+k2breite, pageFoldY-k1tiefe);
	lineto(pageWidth-rand, pageFoldY-k1tiefe);

	moveto(pageWidth-rand-k1breite, pageFoldY-k1tiefe+k2hohe+k1stufenwerte[0]);
	lineto(pageWidth-rand-k1breite, pageFoldY+k2hohe);
	moveto(pageWidth-rand, pageFoldY-k1tiefe+k2hohe+k1stufenwerte[k1nstreifen-1]);
	lineto(pageWidth-rand, pageFoldY-k1tiefe);

	{*körper 2 zeichnen*}
	penFore(65535,65535,0);

	ALLOCATE k2stufenwerte[0..k2nstreifen-1];
	
	IF pfunktion='Diagonale' THEN
		berechneDiagonal(k2richtung, (k2tiefe-k1tiefe),k2nstreifen, k2stufenwerte)
	ELSE IF pfunktion='Spitz' THEN
		berechneSpitz(k2richtung, (k2tiefe-k1tiefe),k2nstreifen, k2stufenwerte)
	ELSE
		berechneKreis(k2richtung, (k2tiefe-k1tiefe),k2nstreifen, k2stufenwerte);

	FOR i:=0 TO k2nstreifen-1 DO BEGIN
		Rect(rand+k2stbreite*i,pageFoldY+k2hohe-k1tiefe-k2stufenwerte[i],rand+k2stbreite*(i+1),pageFoldY+k2hohe-k1tiefe-k2stufenwerte[i]-k2hohe);
		{*Rect(pageWidth-rand-k1breite+k1stbreite*i,pageFoldY-k1tiefe+k2hohe+k1stufenwerte[i], pageWidth-rand-k1breite+k1stbreite*(i+1),pageFoldY-k1tiefe+k2hohe+k1stufenwerte[i]+k1tiefe);*}
	END;

	moveto(rand, pageFoldY+k2hohe);
	lineto(pageWidth-rand-k1breite, pageFoldY+k2hohe);
	moveto(pageWidth-rand-k1breite,pageFoldY+k2hohe-k1tiefe);
	lineto(rand+k2breite,pageFoldY+k2hohe-k1tiefe);
	{*moveto(rand, pageFoldY+k2hohe-k2tiefe);
	lineto(rand+k2breite, pageFoldY+k2hohe-k2tiefe);
	moveto(rand, pageFoldY-k2tiefe);
	lineto(rand+k2breite, pageFoldY-k2tiefe);*}
	
	moveto(rand, pageFoldY+k2hohe);
	lineto(rand, pageFoldY+k2hohe-k1tiefe-k2stufenwerte[0]);
	moveto(pageWidth-rand-k1breite, pageFoldY+k2hohe);
	lineto(pageWidth-rand-k1breite,pageFoldY+k2hohe-k1tiefe);
	moveto(rand+k2breite,pageFoldY+k2hohe-k1tiefe);
	lineto(rand+k2breite, pageFoldY+k2hohe-k1tiefe-k2stufenwerte[k2nstreifen-1]);

	moveto(10,10);
	TextFont(10);
	TextSize(18);
	CreateText('TeamMC');
	
END;
RUN(faltkarte);