program fractale; {dessin du flocon de Koch}

	type
		segment = record
				x1: integer;
				y1: integer; {premier point}
				x2: integer;
				y2: integer {deuxieme point}
			end;

	var
		s: segment;

	procedure TransformeSegment (var s, t, u, v, w: segment);
{prend en parametre un segment s et fournit en sortie quatre segments}
{t, u,v,w correspondant a la transformation Koch de s}
		var
			vecteurx, vecteury: integer; {vecteur p1p2 ou p1 est le premier point de s et p2 le second}
			mx, my, px, py: integer;

	begin
		vecteurx := s.x2 - s.x1;
		vecteury := s.y2 - s.y1;

		t.x1 := s.x1;
		t.y1 := s.y1;
		t.x2 := round((s.x1 + (vecteurx / 3)));
		t.y2 := round((s.y1 + (vecteury / 3)));

		w.x2 := s.x2;
		w.y2 := s.y2;
		w.x1 := round((s.x2 - (vecteurx / 3)));
		w.y1 := round((s.y2 - (vecteury / 3)));

		mx := round((t.x2 + w.x1) / 2);
		my := round((t.y2 + w.y1) / 2);
		px := mx + round(vecteury / (2 * sqrt(3)));
		py := my - round(vecteurx / (2 * sqrt(3)));

		u.x1 := t.x2;
		u.y1 := t.y2;
		u.x2 := px;
		u.y2 := py;

		v.x1 := px;
		v.y1 := py;
		v.x2 := w.x1;
		v.y2 := w.y1;

	end;


	procedure dessin (s: segment);
{dessin du segment s}
	begin
		moveto(s.x1, s.y1);
		lineto(s.x2, s.y2);
	end;

	function taille (s: segment): integer;
	begin
		taille := abs(s.x2 - s.x1) + abs(s.y2 - s.y1);
	end;

	procedure recursif (var s: segment);
		var
			t, u, v, w: segment;
	begin
		if taille(s) < 5 then
			dessin(s)
		else
			begin
				TransformeSegment(s, t, u, v, w);
				recursif(t);
				recursif(u);
				recursif(v);
				recursif(w);
			end;
	end;


	procedure initialiser (var s: segment; x, y, z, t: integer);
	begin
		s.x1 := x;
		s.y1 := y;
		s.x2 := z;
		s.y2 := t;
	end;

begin
	ShowDrawing;
	initialiser(s, 400, 260, 100, 260);
	recursif(s);
	initialiser(s, 100, 260, 250, 0);
	recursif(s);
	initialiser(s, 250, 0, 400, 260);
	recursif(s);
end.



