function arbreFractal
% rŽcupŽration des donnŽes
d=get(gcf,'Userdata');
niveau=d.niveau;
hauteurEcran=d.hauteurEcran;
largeurEcran=d.largeurEcran;

set(gca,'Units','Pixel')

depart=[largeurEcran/2 0];
arrivee=[largeurEcran/2 hauteurEcran];

fractal(depart,arrivee,niveau)
set(gcf,'color','k')
axis equal
axis off

function fractal(depart,arrivee,niveau)
d=get(gcf,'Userdata');
hauteurEcran=d.hauteurEcran;
h15=hauteurEcran/5;
pointEmbranch=d.pointEmbranch;
angleEmbranch=d.angleEmbranch;
tailleBranche=d.tailleBranche;
pointEmbranchd=d.pointEmbranchd;
angleEmbranchd=d.angleEmbranchd;
tailleBranched=d.tailleBranched;
nombreDeBoule=d.bdn;
% on calcule la longueur de la branche
longueur=round(sqrt((arrivee(2)-depart(2))^2+(arrivee(1)-depart(1))^2));
% on dessine la branche
h=line([depart(1) arrivee(1)],[depart(2) arrivee(2)]);
if longueur<3
    set(h,'color',d.fc)
elseif longueur<h15 
    set(h,'color',d.pbc)
else
    set(h,'color',d.gbc)
end
% on dessine une boule au 
if rand<nombreDeBoule;
    h=line((depart(1)+arrivee(1))/2,(depart(2)+arrivee(2))/2);
    set(h,'Marker','.','MarkerSize',round(rand*40+1),'color',rand(1,3))
end

while (niveau~=0)&(longueur>1)
    % for i=1:niveau
    % on prend la deuxi�me partie du segment
    departN=depart+(pointEmbranch+has(pointEmbranchd))*(arrivee-depart);
    arriveeN=arrivee;
    longueurN=round(sqrt((arriveeN(2)-departN(2))^2+(arriveeN(1)-departN(1))^2));
    if longueurN==longueur
        % si aucun changement on arrete
        break
    end
    departg=departN;    % branche gauche
    arriveeg=arrivee;
    departd=departN;    % branche droite
    arriveed=arrivee;
    % angles de rotation
    ag=pi*(360-angleEmbranch+has(angleEmbranchd))/180;
    ad=pi*(angleEmbranch+has(angleEmbranchd))/180;
    xg=arriveeg(1)-departg(1);
    yg=arriveeg(2)-departg(2);
    xd=arriveed(1)-departd(1);
    yd=arriveed(2)-departd(2);
    xi=xg*cos(ag)+yg*sin(ag);
    yi=-xg*sin(ag)+yg*cos(ag);
    xg=xi+departg(1);
    yg=yi+departg(2);
    xi=xd*cos(ad)+yd*sin(ad);
    yi=-xd*sin(ad)+yd*cos(ad);
    xd=xi+departd(1);
    yd=yi+departd(2);
    % mise ˆ l'Žchelle
    arriveeg=departg+(tailleBranche+has(tailleBranched))*([xg yg]-[departg(1) departg(2)]);
    arriveed=departd+(tailleBranche+has(tailleBranched))*([xd yd]-[departd(1) departd(2)]);
    depart=departN;
    arrivee=arriveeN;
    longueur=round(sqrt((arrivee(2)-depart(2))^2+(arrivee(1)-depart(1))^2));
    fractal(departg,arriveeg,niveau-1)
    fractal(departd,arriveed,niveau-1)
end

function m=has(n)
m=rand*n;

