
{J 'ai un programme bizarre qui dessine de droles de choses}
{si on joue un peu avec les i + 1 , i + 2 au milieu . Sais - tu en tirer quelque chose }

program supersierpinski;

	procedure tracer (u: point; d: integer);
		var
			r: Rect;
	begin
		SetRect(r, u.h - 1, u.v - 1, u.h + d, u.v + d);
		PaintRect(r)
	end; { de "tracer" }

	var
		q: array[0..3] of point;

	procedure initialiser;
(* Les carres sont numerotes*)
(*        0  1              *)
(*        3  2              *)
(* donc en decalage (x,y)   *)
(*       (0,0)   (1,0)      *)
(*       (0,1)   (1,1)      *)
	begin
		q[0].h := 0;
		q[0].v := 0;
		q[1].h := 1;
		q[1].v := 0;
		q[2].h := 1;
		q[2].v := 1;
		q[3].h := 0;
		q[3].v := 1
	end; { de "initialise" }

	function plus (a, b: point; dd: integer): point;
		var
			ab: point;
	begin
		ab.h := a.h + b.h * dd;
		ab.v := a.v + b.v * dd;
		plus := ab
	end;

	procedure S (t: point; i, d, n: integer);
(* t : point de depart du trac^N, en haut a gauche;*)
(* i : numero du trace, il y en a quatre: O, 1, 2 et 3*)
(* d : longueur du cote du carre*)
(* n : numero d'iteration*)
		var
			dd: integer;
			u: point;
	begin

		if n = 1 then
			begin
				tracer(t, d)
			end
		else
			begin
				dd := d div 2;
				S(plus(t, q[i], dd), (i) mod 4, dd, n - 1);
				S(plus(t, q[(i + 2) mod 4], dd), (1 + i) mod 4, dd, n - 1);    {essayer d'echanger i+1 et i+2 dans q[...}
				S(plus(t, q[(i + 1) mod 4], dd), (2 + i) mod 4, dd, n - 1);
			end
	end; { de "S" }

	procedure Sierpinski (n: integer);
		var
			u: point;
	begin
		u.h := 10;
		u.v := 10;
		S(u, 0, 256, n);
	end; { de "Sierpinski" }

begin
	showdrawing;
	initialiser;
	Sierpinski(9);
end.