------------------------------------------------------------------------------------------------ -- Nom : Power_List / fait partie du programme Power Fractal -- -- -- -- Auteurs : Gregory Burri & Adrien Crivelli -- ------------------------------------------------------------------------------------------------ -- But : Outils pour creer et gerer des liste de fractals -- ------------------------------------------------------------------------------------------------ with Power_Types; use Power_Types; with Ada.Unchecked_Deallocation; package body Power_List is ------------------------------------------------------------------------------------------------ -- Nom : Ajouter -- -- But : Ajouter une fractal a la suite de la liste -- -- Parametres ---------------------------------------------------------------------------------- -- In : * La liste de fractals -- -- * La Fractal A Ajouter -- ------------------------------------------------------------------------------------------------ procedure Ajouter (Liste_Fractals : in out T_Liste_Fractals; Fractal : Cara_Fractal) is --Pour pouvoir parcourir la liste Pointeur : T_Lien := Liste_Fractals.Tete; begin --Ajouter if Liste_Fractals.Tete = null then Liste_Fractals.Tete := new T_Fractal'(Fractal, null); else while Pointeur.Suiv /= null loop Pointeur := Pointeur.Suiv; end loop; Pointeur.Suiv := new T_Fractal'(Fractal, null); end if; Liste_Fractals.Nb_Fractals := Liste_Fractals.Nb_Fractals + 1; end Ajouter; ------------------------------------------------------------------------------------------------ -- Nom : Effacer -- -- But : Effacer une fractal de la liste -- -- Parametres ---------------------------------------------------------------------------------- -- In : * La liste de fractals -- -- * Le numeros de la fractal a effacer : Num -- ------------------------------------------------------------------------------------------------ procedure Effacer (Liste_Fractals : in out T_Liste_Fractals; Num : Natural) is --Pour pouvoir parcourir la liste Pointeur : T_Lien := Liste_Fractals.Tete; Pointeur_Avant : T_Lien := Liste_Fractals.Tete; procedure Liberer is new Ada.Unchecked_Deallocation ( T_Fractal , T_Lien); begin --Effacer --Si la liste ne comporte qu'un seul element alors propage une erreur if Liste_Fractals.Nb_Fractals = 1 then raise Liste_Une_Fractal; end if; --Si l'element a supprimer est le premier de la liste alors if Num = 1 then Liste_Fractals.Tete := Liste_Fractals.Tete.Suiv; --La tete pointe sur le deuxieme element Liberer(Pointeur); else --Pointeur pointe sur le deuxieme element de la liste Pointeur := Liste_Fractals.Tete.Suiv; --Cherche l'element numero 'num' for I in 3..Num loop --Decale les pointeurs Pointeur_Avant := Pointeur; Pointeur := Pointeur.Suiv; -- --Si pas trouve alors propage une erreur if Pointeur = null then raise Fractal_Inexistante; end if; end loop; Pointeur_Avant.Suiv := Pointeur.Suiv; --Refais le lien en sautant l'element a supprimer Liberer(Pointeur); --Efface de la memoire l'element a supprimer end if; --Un element a ete enleve : Liste_Fractals.Nb_Fractals := Liste_Fractals.Nb_Fractals - 1; end Effacer; ------------------------------------------------------------------------------------------------ -- Nom : Fractal_Num -- -- But : Retourner un pointeur sur la fractal correspondante a un numeros -- -- Parametres ---------------------------------------------------------------------------------- -- In : * La liste de fractals -- -- * Le numeros de la fractal a chercher : Num -- -- -- -- return : * Le pointeur sur La fractal correspondante au numero -- ------------------------------------------------------------------------------------------------ function Fractal_Num (Liste_Fractals : T_Liste_Fractals; Num : Natural) return T_Lien is Pointeur : T_Lien := Liste_Fractals.Tete; --Pour pouvoir parcourir la liste begin --Fractal_Num for I in 2..Num loop --Si pas trouve alors propage une erreur if Pointeur = null then raise Fractal_Inexistante; end if; Pointeur := Pointeur.Suiv; --Decale le pointeur end loop; return Pointeur; --Retourne la fractal trouvee end Fractal_Num; ------------------------------------------------------------------------------------------------ -- Nom : Vider_Liste -- -- But : vider completement la liste des fractals -- -- Parametres ---------------------------------------------------------------------------------- -- In-out : * La liste de fractals a vider -- ------------------------------------------------------------------------------------------------ procedure Vider_Liste(Liste_Fractals : in out T_Liste_Fractals) is Pointeur : T_Lien; --Pour pouvoir parcourir la liste procedure Liberer is new Ada.Unchecked_Deallocation ( T_Fractal , T_Lien); begin --Vider_Liste --Efface tout les elements de la liste while Liste_Fractals.Tete /= null loop Pointeur := Liste_Fractals.Tete; Liste_Fractals.Tete := Liste_Fractals.Tete.Suiv; Liberer (Pointeur); end loop; Liste_Fractals.Nb_Fractals := 0; end Vider_Liste; ------------------------------------------------------------------------------------------------ -- Nom : Liste_Defaut -- -- But : Mettre dans la liste en parametre des fractals d'exemple -- -- Parametres ---------------------------------------------------------------------------------- -- In-out : * La liste de fractals a remplir -- ------------------------------------------------------------------------------------------------ function Liste_Defaut return T_Liste_Fractals is Liste : T_Liste_Fractals; begin --Liste_Defaut --Les fractales par defaut Ajouter(Liste, Fractal_Initial_Mandel); Ajouter(Liste, Fractal_Initial_Julia); --D'autre fractal exemple Ajouter(Liste, (Mandelbrot, 4, 30, 4.0, 1.0/4.0, (-0.6, 0.0), 60.0, ( (2,203,253), (0,0,255), (255,255,0), (0,0,0) ), False, False)); Ajouter(Liste, (Julia, 4, 40, 4.0, 1.0/4.0, (0.0, 0.0), -40.0, ( (0,0,0), (247,91,43), (209,207,30), (255,12,0) ), False, False, -0.277, 0.968)); Ajouter(Liste, (Mandelbrot, 4, 70, 4.0, 1.0/4.0, (-0.6, 0.0), -90.0, ((180,200,255), (200,250,0), (0,0,255), (0,0,140) ), False, False)); Ajouter(Liste, (Julia, 4, 40, 4.0, 1.0/4.0, (0.0, 0.0), 0.0, ( (255,0,0), (0,255,0), (0,0,255), (255,255,0) ), False, False, 0.4, 0.02)); Ajouter(Liste, (Mandelbrot, 4, 33, 4.0, 87.0634, (0.4147, 0.1589), -46.0, ( (0,0,0), (0,255,0), (0,0,255), (0,0,0) ), False, False)); Ajouter(Liste, (Julia, 4, 30, 1.2, 1.0/4.0, (0.0, 0.0), 0.0, ( (237,89,173), (138,164,237), (0,0,255), (22,23,23) ), False, False, 0.44, 0.2)); Ajouter(Liste, (Mandelbrot, 4, 180, 3.2, 10.2903, (-1.761, -0.0), -26.0, ( (0,0,0), (0,255,0), (255,20,20), (0,0,0) ), False, False)); Ajouter(Liste, (Julia, 4, 80, 4.0, 1.0/4.0, (0.0, 0.0), 10.0, ( (255,0,0), (0,255,0), (0,0,255), (255,255,0) ), False, False, -0.757, -0.08)); Ajouter(Liste, (Mandelbrot, 4, 50, 2.3, 1.0/4.0, (-0.6, 0.0), 180.0, ( (0,100,0), (34,55,0), (0,0,255), (0,32,244) ), False, False)); Ajouter(Liste, (Julia, 4, 50, 4.0, 1.026, (-0.3471, 0.4628), 0.0, ( (255,0,0), (0,255,0), (0,0,255), (255,255,0) ), False, False, 0.44, -0.14)); return Liste; end Liste_Defaut; ------------------------------------------------------------------------------------------------ -- Nb_Fractals -- ------------------------------------------------------------------------------------------------ function Nb_Fractals (Liste_Fractals : in T_Liste_Fractals) return Natural is begin --Nb_Fractals return Liste_Fractals.Nb_Fractals; end Nb_Fractals; end Power_List;