Ir para o conteúdo

Árvore fractal

Eis uma curiosidade: como construir uma árvore fractal.

O princípio é simples: desenha-se uma linha, a partir do ponto final desenham-se outras duas que divergem segundo um determinado ângulo, nos pontos finais dessas duas faz-se o mesmo, e como manda a geometria fractal, isto segue até ao infinito sempre desta forma...

Ora, aqui vamos desenhar duas árvores: uma simétrica e outra assimétrica (fazendo divergir as linhas segundo ângulos diferentes).

O resultado é muito interessante. Com meia dúzia de linhas de Pascal tornamo-nos verdadeiros Picassas digitais. :-D

program fractaltree;
uses graph, math;

type TPoint = record
        x, y : smallint;
     end;

const ponto1 : TPoint = (x:250; y:530);
      ponto2 : TPoint = (x:750 ;y:530);

var driver, mode : smallint;
    i : integer;


procedure DesenharRamos(pi : TPoint; angulo : integer; passo : integer; const marcapasso : smallint ; const angulo_esq, angulo_dir : smallint);
var pf : TPoint;
begin
    if passo > 0 then begin
        pf.x := pi.x + trunc(cos(degtorad(angulo)) * passo);
        pf.y := pi.y + trunc(sin(degtorad(angulo)) * passo);

        Line(pi.x, pi.y, pf.x, pf.y);

        DesenharRamos(pf, angulo - angulo_esq, passo - marcapasso, marcapasso, angulo_esq, angulo_dir);
        DesenharRamos(pf, angulo + angulo_dir, passo - marcapasso, marcapasso, angulo_esq, angulo_dir);
    end;
end;


begin
    DetectGraph(driver, mode);
    InitGraph(driver, mode, '');

    // simétrica
    SetRGBPalette(50, 0, 82, 14);
    SetFillStyle(SolidFill, 50);
    Bar(50, 600, 950, 450);

    for i:=0 to (255-120) do begin
        SetRGBPalette(50, 45, 120+i, 255);
        SetFillStyle(SolidFill, 50);
        Bar(50, 450-(2*i-1), 950, 450-(2*i+1));
    end;

    SetLineStyle(SolidLn, 0, ThickWidth);
    SetColor(green);
    DesenharRamos(ponto1, -90, 50, 50 div 10, 20, 20);

    //assimétrica
    SetLineStyle(SolidLn, 0, NormWidth);
    SetColor(red);
    DesenharRamos(ponto2, -90, 50, 50 div 11, 25, 8);

    readln;
    CloseGraph;
end.