De Pythagoras boom


In dit artikel beschrijf ik het programmeren van een z.g. Pythagoras boom.
Hier staat een resultaat:



Het programma werkt recursief.
De programmeertaal is Delphi.
Deze tekening is gemaakt met één procedure die nog geen 30 regels lang is.

Bekijk nu het plaatje hieronder:



Uitgangspunt is de lijn AB.
procedure makeTree(...) wordt aangeroepen met de coördinaten van punten A en B.
Deze procedure berekent de coördinaten van de punten C,D en E en tekent de lijnen
AC,BD,CE en DE.
Daarna roept de procedure zichzelf twee maal aan:
1. met de coördinaten van punten C en E.
2. met de coördinaten van de punten D en E.

Om niet eindeloos door te gaan moet een tellertje worden bijgehouden.
Dat is parameter depth die ook in de procedure aanroep staat.
makeTree verlaagt depth bij elke nieuwe aanroep,
en doet die aanroep alleen zolang depth groter is dan 1.

Dit is de procedure:
procedure makeTree(ax,ay,bx,by : smallInt; depth : byte);
//paint part of tree
var cx,cy,dx,dy,ex,ey : smallInt;
    x,y,zx,zy : smallInt;
begin
 x := bx-ax;
 y := ay-by;
 cx := ax-y;
 cy := ay-x;
 dx := bx-y;
 dy := by-x;
 zx := (cx + dx) div 2;
 zy := (cy + dy) div 2;
 ex := zx - (y div 2);
 ey := zy - (x div 2);
 with form1.PaintBox1.Canvas do
  begin
   pen.color := $000000;
   pen.width := 1;
   moveto(ax,ay);
   lineto(cx,cy);
   lineto(dx,dy);
   lineto(bx,by);
   moveto(cx,cy);
   lineto(ex,ey);
   lineto(dx,dy);
   if depth > 1 then
    begin
     maketree(cx,cy,ex,ey,depth-1);
     maketree(ex,ey,dx,dy,depth-1);
    end;
  end;
end;
Opmerkingen:
1. In een cumputerscherm loopt de positieve y richting omlaag.
2. De coördinaten van punt A heten in het programma (ax,ay) enzovoorts....
3. De coördinaten zijn variabelen van het type smallInt met range -32768..32767
4. ABCD is een vierkant.
5. LCED = 450, CE = DE.
6. Punt Z is een tussenstapje voor de berekening van punt E.
7. De eerste aanroep is makeTree(360,595,440,595,10).