/*************************************************************************************************************************************/ /* */ /* G E N E R A T I O N D ' U N O B J E T R E C U R S I F D E T Y P E " C H O U - F L E U R " : */ /* */ /* */ /* ...:..::..:. */ /* .:+-#:#:+# +#o */ /* .+o.#:::++...-o##*o:. */ /* ..*oo#o#***+*o++:o.#-o+. */ /* -#+o*o:::#:*-*::+:+*.++-:. */ /* *##*#*:::+:o:--:+*++:.o*.*o-. */ /* ..-# o++o-:**o*ooo#+#+o::-+*-+#o:*+. */ /* .o .*+:.---o++#-o.:::-o+**o*+#+o-*+:+o.::+*-+*o::. */ /* .+**oo:#:o:++:+---:+*#-#o +#+o*+#:o*o-+--: -++:**:.-#: */ /* -+o.#:.+o*-+##o**#+:o-**--*+:-.o+-+oo#-:-: -oo:*-o*.-: */ /* ..o#:#::o#--*:+-*+:#o*+#o:-o-++.+++-+**---:-..*.*:*o-:. */ /* .*::+-+o-#o:*-*-o:#-oo---+o-**++--.#+--#+#-+-o.:-.+#:*#:o:. */ /* :#.#:.*:#:#:*+. .-+-++-oo+++*--:o+o**o.-- .*:#+.*+-:. */ /* :o.++o-*- -* *+oo-o*#.- :...#:o-o+-. */ /* -+o--o++o:-* ::-.*::+-+o*o #:. +:+-*:-#+. */ /* .*o:+::+*#*- -. o-oo-*+.#-+ .*....+*:.. */ /* :.:+-++++# *. #-:+--o#-. o.. .o.+o. */ /* ..-+o*+*+:+# #-+*-*#.+o*. :*-. . +. */ /* .--#o+*.-#o *+ *:.+-o**+ -. .o. */ /* . :.o*-..:oo#. +* o:+o:*#.+-#.. .. */ /* o...-#+..:oo#o.:o . +:.+*#*-. */ /* .o##*#**:.:*-+-.o* .# .--+:.*-*--:*: */ /* -#.--o:#. .- -:..o*o:- */ /* -++:+:+ ++ -.:::#-++.:o. */ /* :#o:. :* . :-:::.--o . */ /* .. -.++.-o+.-* */ /* -.#. o-+:+: */ /* #o. :*. */ /* */ /* */ /* Author of '$xrf/recursif.11$K' : */ /* */ /* Jean-Francois COLONNA (LACTAMME, 1993??????????). */ /* */ /*************************************************************************************************************************************/ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* I N T E R F A C E ' listG ' : */ /* */ /* */ /* :Debut_listG: */ /* :Fin_listG: */ /* */ /*************************************************************************************************************************************/ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* D I R E C T I V E S S P E C I F I Q U E S D E C O M P I L A T I O N : */ /* */ /*************************************************************************************************************************************/ @define PRAGMA_CL_____MODULE_NON_OPTIMISABLE /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* F I C H I E R S D ' I N C L U D E S : */ /* */ /*************************************************************************************************************************************/ #include INCLUDES_BASE /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* D E F I N I T I O N S D E B A S E E T U N I V E R S E L L E S : */ /* */ /*************************************************************************************************************************************/ #include xrk/attractor.11.I" /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* 3 */ /* D E F I N I T I O N D E L ' E S P A C E P H Y S I Q U E D A N S R ( D E B U T ) : */ /* */ /* */ /* Nota : */ /* */ /* Les extrema des coordonnees {x,y,z} */ /* sont fixees un peu arbitrairement et sans */ /* parametrees. */ /* */ /* */ /*************************************************************************************************************************************/ #define hXmin_ESPACE \ PARE(-2.00) #define hYmin_ESPACE \ PARE(-2.00) #define hZmin_ESPACE \ PARE(-3.00) /* Definition du "coin" inferieur-gauche-arriere de l'espace physique. */ #define hXmax_ESPACE \ PARE(2.00) #define hYmax_ESPACE \ PARE(2.00) #define hZmax_ESPACE \ PARE(3.00) /* Definition du "coin" superieur-droite-avant de l'espace physique. La valeur particuliere */ /* de 'hZmax_ESPACE' est mise en place pour translater la source lumineuse d'eclairage de */ /* la scene via 'Z_DE_LA_SOURCE_LUMINEUSE'... */ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* 3 */ /* D E F I N I T I O N D E L ' E S P A C E P H Y S I Q U E D A N S R ( D E B U T ) : */ /* */ /*************************************************************************************************************************************/ #include xrk/attractor.12.I" #define dXmin_ESPACE \ PARE(-1.35) #define dYmin_ESPACE \ PARE(-1.35) #define dZmin_ESPACE \ PARE(0.0) /* Definition des minima des differentielles {dx,dy,dz}. */ #define dXmax_ESPACE \ PARE(1.35) #define dYmax_ESPACE \ PARE(1.35) #define dZmax_ESPACE \ PARE(5.05) /* Definition des maxima des differentielles {dx,dy,dz}. */ #include xrk/attractor.1D.I" /* Formules de renormalisation des differentielles dans [0,1] ; elles sont utilisees lorsque */ /* la production d'images en couleurs est demandee (voir 'visualiser_en_RVB'). */ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* D E F I N I T I O N D E S D I F F E R E N T S E S P A C E S E T D E L ' E F F E T D E B R U M E : */ /* */ /*************************************************************************************************************************************/ #include xrk/attractor.13.I" /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* G E N E R A T I O N D E S I M A G E S : */ /* */ /*************************************************************************************************************************************/ #define RENORMALISER_LES_NIVEAUX \ FAUX DEFV(Local,DEFV(Logical,INIT(renormaliser_les_niveaux,RENORMALISER_LES_NIVEAUX))); /* Indique si l'on doit renormaliser les niveaux des trois couleurs au moment de la */ /* generation de l'image ('VRAI') ou pas ('FAUX'). On notera que cette renormalisation */ /* est fonction non pas uniquement de l'image courante, mais en fait aussi de toutes celles */ /* qui ont deja ete generees (voir comment sont calcules les extrema des derivees...). */ #define NOMBRE_D_ITERATIONS \ SOIXANTE \ /* La procedure recursive qui va suivre contraint a un petit nombre apparent d'iterations, */ \ /* puisqu'en effet, ce nombre va etre eleve a une puissance egale a la profondeur des appels */ \ /* recursifs de la fonction 'definition_recursive(...)'. */ #include xrv/champs_5.14.I" /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* D E F I N I T I O N S G E N E R A L E S R E L A T I V E S A L A V I S U A L I S A T I O N : */ /* */ /*************************************************************************************************************************************/ #include xrv/particule.41.I" #include xrk/attractor.14.I" /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* F O N C T I O N D E M E M O R I S A T I O N D U P O I N T C O U R A N T ( D E B U T ) : */ /* */ /*************************************************************************************************************************************/ #include xrk/attractor.16.I" #define RAYON_DE_VISUALISATION \ FRA4(FRA10(FU)) DEFV(Local,DEFV(Float,INIT(rayon_de_visualisation,RAYON_DE_VISUALISATION))); /* Rayon du disque materialisant une iteration. */ /*===================================================================================================================================*/ /* :Debut_listMN_STRUCTURES_VIVANTES_RECURSIVES_11: */ /*************************************************************************************************************************************/ /* */ /* D E F I N I T I O N D ' U N O B J E T R E C U R S I F D E T Y P E " C H O U - F L E U R " : */ /* */ /* */ /* Definition : */ /* */ /* Il est defini par le systeme d'equations */ /* suivant pour 'theta' variant incrementalement */ /* 'N' fois sur une certain segment : */ /* */ /* F (h,theta) = K .R(h).cos(T .theta) */ /* x x x */ /* */ /* F (h,theta) = K .R(h).sin(T .theta) */ /* y y y */ /* */ /* F (h,theta) = K .h.theta */ /* z z */ /* */ /* fmR - 1 */ /* R(h) = h.R .(----------.theta + 1) */ /* 0 N.dtheta */ /* */ /* (ou 'N' designe le nombre d'iterations 'nombre_d_iterations') */ /* */ /* avec en general : */ /* */ /* h < 1 */ /* */ /* */ /* En chaque point de coordonnees [F (h,theta),F (h,theta),F (h,theta)] */ /* x y z */ /* si 'h' est inferieur a un certain seuil ou si on l'on "plonge" */ /* suffisamment profond dans la recursivite, une sphere est */ /* visualisee, sinon, 'h' est reduit recursivement suivant : */ /* */ /* h <-- h.ffh */ /* */ /* avec : */ /* */ /* ffh < 1 */ /* */ /* et le procede d'iterations sur 'theta' est repris en ce point courant */ /* considere comme nouvelle origine... */ /* */ /* */ /*************************************************************************************************************************************/ /* :Fin_listMN_STRUCTURES_VIVANTES_RECURSIVES_11: */ #include xrk/attractor.17.I" dfTRANSFORMAT_31(liste_NOMBRE_D_ITERATIONS,fichier_NOMBRE_D_ITERATIONS,NOMBRE_D_ITERATIONS_IMPLICITE,NOMBRE_D_ITERATIONS) /* Definition du fichier des nombres d'iterations. */ #define sNOMBRE_D_ITERATIONS(numero_de_la_periode) \ INTE(sTRANSFORMAT_31(numero_de_la_periode,liste_NOMBRE_D_ITERATIONS)) /* Formule generale definissant les variations du nombre d'iterations. */ #define KX \ FU #define TX \ FU DEFV(Local,DEFV(Float,INIT(kx,FLOT__UNDEF))); DEFV(Local,DEFV(Float,INIT(d_kx,d_FCONSTANTES))); DEFV(Local,DEFV(Float,INIT(tx,FLOT__UNDEF))); DEFV(Local,DEFV(Float,INIT(d_tx,d_FCONSTANTES))); /* Definition des coefficients de la coordonnee 'X'. */ #define KY \ FU #define TY \ FU DEFV(Local,DEFV(Float,INIT(ky,FLOT__UNDEF))); DEFV(Local,DEFV(Float,INIT(d_ky,d_FCONSTANTES))); DEFV(Local,DEFV(Float,INIT(ty,FLOT__UNDEF))); DEFV(Local,DEFV(Float,INIT(d_ty,d_FCONSTANTES))); /* Definition des coefficients de la coordonnee 'Y'. */ #define KZ \ FRA4(FRA10(FU)) DEFV(Local,DEFV(Float,INIT(kz,FLOT__UNDEF))); DEFV(Local,DEFV(Float,INIT(d_kz,d_FCONSTANTES))); /* Definition des coefficients de la coordonnee 'Z'. */ #define CX0 \ FZERO #define CY0 \ FZERO #define CZ0 \ FZERO /* Definition des valeurs initiales des trois coordonnees. */ DEFV(Local,DEFV(Float,INIT(cx,FLOT__UNDEF))); DEFV(Local,DEFV(Float,INIT(dcx,FLOT__UNDEF))); /* Definition de 'x' et de sa derivee, */ DEFV(Local,DEFV(Float,INIT(cy,FLOT__UNDEF))); DEFV(Local,DEFV(Float,INIT(dcy,FLOT__UNDEF))); /* Definition de 'y' et de sa derivee, */ DEFV(Local,DEFV(Float,INIT(cz,FLOT__UNDEF))); DEFV(Local,DEFV(Float,INIT(dcz,FLOT__UNDEF))); /* Definition de 'z' et de sa derivee. */ #define RECURSIVITE_MAXIMALE \ DEUX DEFV(Local,DEFV(Int,INIT(recursivite_maximale,RECURSIVITE_MAXIMALE))); /* Definition de la recursivite maximale. */ DEFV(Local,DEFV(Int,INIT(recursivite_courante,ZERO))); /* Definition de la recursivite courante. Cette valeur est incrementee d'une unite a chaque */ /* entree dans la fonction 'definition_recursive(...)' et decrementee d'une unite a la */ /* sortie... */ #define FFH \ FRA1(FRA4(FU)) DEFV(Local,DEFV(Float,INIT(ffh,FLOT__UNDEF))); /* Definition du facteur du facteur d'homothetie 'ffh'. */ #define FH_MINIMAL \ FZERO DEFV(Local,DEFV(Float,INIT(fh_minimal,FLOT__UNDEF))); /* Definition du minimum du facteur d'homothetie 'fh'. */ DEFV(Local,DEFV(Float,INIT(fh,FU))); DEFV(Local,DEFV(Float,INIT(d_fh,d_FVARIABLES_DE_DERIVATION))); /* Definition du facteur d'homothetie initial. Cette valeur n'est jamais modifiee, c'est */ /* un argument d'appel de la fonction 'definition_recursive(...)' qui prend en compte sa */ /* modification via 'CHANGEMENT_DU_FACTEUR_D_HOMOTHETIE(...)'. */ #define FACTEUR_MINIMAL_RAYON \ GRO1(FRA10(COORDONNEE_BARYCENTRIQUE_MAXIMALE)) #define d_FACTEUR_MAXIMAL_RAYON \ FZERO #define FACTEUR_MAXIMAL_RAYON \ GRO1(FRA1(COORDONNEE_BARYCENTRIQUE_MAXIMALE)) DEFV(Local,DEFV(Float,INIT(facteur_minimal_rayon,FLOT__UNDEF))); DEFV(Local,DEFV(Float,INIT(d_facteur_minimal_rayon,d_FCONSTANTES))); #define R0 \ GRO13(FRA10(FU)) DEFV(Local,DEFV(Float,INIT(r0,FLOT__UNDEF))); DEFV(Local,DEFV(Float,INIT(d_r0,d_FCONSTANTES))); /* Definition du rayon 'R0' ainsi que du maximun et du minimum du facteur multiplicatif */ /* determine a partir de lui dans la fonction 'RAYON(...)'... */ #define THETA0 \ FZERO #define dTHETA \ SCAL(CERCLE_TRIGONOMETRIQUE,MILLE,CENT_VINGT_HUIT) DEFV(Local,DEFV(Float,INIT(theta0,FLOT__UNDEF))); DEFV(Local,DEFV(Float,INIT(theta,FLOT__UNDEF))); DEFV(Local,DEFV(Float,INIT(d_theta,d_FVARIABLES_DE_DERIVATION))); DEFV(Local,DEFV(Float,INIT(dtheta,FLOT__UNDEF))); DEFV(Local,DEFV(Float,INIT(d_dtheta,d_FCONSTANTES))); /* Definition du 'theta' initial, du 'theta' courant ainsi que de son increment... */ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* A I D E A U C A D R A G E D E S I M A G E S : */ /* */ /*************************************************************************************************************************************/ #include xrk/attractor.1C.I" DONNEES_DE_RECHERCHE_DES_EXTREMA_DES_COORDONNEES_ET_DES_DERIVEES /* Definition des extrema des coordonnees et des derivees. On notera bien l'absence de */ /* point-virgule apres 'DONNEES_DE_RECHERCHE_DES_EXTREMA_DES_COORDONNEES_ET_DES_DERIVEES'. */ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* F O N C T I O N D E M E M O R I S A T I O N D U P O I N T C O U R A N T ( D E B U T ) : */ /* */ /*************************************************************************************************************************************/ BFonctionI DEFV(Local,DEFV(FonctionI,memorisation_1_point_07(AXf,AYf,AZf,AdXf,AdYf,AdZf,numero_de_l_iteration_courante))) DEFV(Argument,DEFV(Float,AXf)); DEFV(Argument,DEFV(Float,AYf)); DEFV(Argument,DEFV(Float,AZf)); /* Definition de la position {x,y,z} de l'iteration courante. */ DEFV(Argument,DEFV(Float,AdXf)); DEFV(Argument,DEFV(Float,AdYf)); DEFV(Argument,DEFV(Float,AdZf)); /* Definition des differentielles {dx,dy,dz} de la position de l'iteration courante. */ DEFV(Argument,DEFV(Int,numero_de_l_iteration_courante)); /* Numero de l'iteration courante afin d'attenuer eventuellement la luminance des points */ /* materialisant chaque iteration en fonction de leur numero (les premieres iterations etant */ /* plus sombres, et les dernieres etant plus lumineuses). */ /*-----------------------------------------------------------------------------------------------------------------------------------*/ Bblock #include xrk/attractor.15.I" INIT_ERROR; /*..............................................................................................................................*/ MEMORISATION_DU_POINT_COURANT(X_DERIVEE_DANS_01(AdXf) ,Y_DERIVEE_DANS_01(AdYf) ,Z_DERIVEE_DANS_01(AdZf) ); /* Memorisation du point courant en Noir et Blanc ou en Couleurs, mais uniquement s'il est */ /* visible en fonction des conditions de visualisation... */ RETU_ERROR; Eblock EFonctionI /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* F O N C T I O N S D E V I S U A L I S A T I O N E T D ' I N T E R P O L A T I O N : */ /* */ /*************************************************************************************************************************************/ #include xrv/particule.31.I" dfTRANSFORMAT_31(liste_COEFFICIENT_Kx,fichier_COEFFICIENT_Kx,COEFFICIENT_Kx_IMPLICITE,KX) dfTRANSFORMAT_31(liste_COEFFICIENT_Ky,fichier_COEFFICIENT_Ky,COEFFICIENT_Ky_IMPLICITE,KY) dfTRANSFORMAT_31(liste_COEFFICIENT_Kz,fichier_COEFFICIENT_Kz,COEFFICIENT_Kz_IMPLICITE,KZ) /* Definition des fichiers des facteurs d'echelle des trois coordonnees. */ #define sCOEFFICIENT_Kx(numero_de_la_periode) \ FLOT(sTRANSFORMAT_31(numero_de_la_periode,liste_COEFFICIENT_Kx)) #define sCOEFFICIENT_Ky(numero_de_la_periode) \ FLOT(sTRANSFORMAT_31(numero_de_la_periode,liste_COEFFICIENT_Ky)) #define sCOEFFICIENT_Kz(numero_de_la_periode) \ FLOT(sTRANSFORMAT_31(numero_de_la_periode,liste_COEFFICIENT_Kz)) /* Formule generale definissant les variations des facteurs d'echelle des trois coordonnees. */ dfTRANSFORMAT_31(liste_COEFFICIENT_Tx,fichier_COEFFICIENT_Tx,COEFFICIENT_Tx_IMPLICITE,TX) dfTRANSFORMAT_31(liste_COEFFICIENT_Ty,fichier_COEFFICIENT_Ty,COEFFICIENT_Ty_IMPLICITE,TY) /* Definition des listes des facteurs d'echelle de l'angle 'theta'. */ #define sCOEFFICIENT_Tx(numero_de_la_periode) \ FLOT(sTRANSFORMAT_31(numero_de_la_periode,liste_COEFFICIENT_Tx)) #define sCOEFFICIENT_Ty(numero_de_la_periode) \ FLOT(sTRANSFORMAT_31(numero_de_la_periode,liste_COEFFICIENT_Ty)) /* Formule generale definissant les variations des facteurs d'echelle de l'angle 'theta'. */ dfTRANSFORMAT_31(liste_VARIABLE_cx0,fichier_VARIABLE_cx0,VARIABLE_cx0_IMPLICITE,CX0) dfTRANSFORMAT_31(liste_VARIABLE_cy0,fichier_VARIABLE_cy0,VARIABLE_cy0_IMPLICITE,CY0) dfTRANSFORMAT_31(liste_VARIABLE_cz0,fichier_VARIABLE_cz0,VARIABLE_cz0_IMPLICITE,CZ0) /* Definition des fichiers des valeurs initiales des trois coordonnees (cx,cy,cz). */ #define sVARIABLE_cx0(numero_de_la_periode) \ FLOT(sTRANSFORMAT_31(numero_de_la_periode,liste_VARIABLE_cx0)) #define sVARIABLE_cy0(numero_de_la_periode) \ FLOT(sTRANSFORMAT_31(numero_de_la_periode,liste_VARIABLE_cy0)) #define sVARIABLE_cz0(numero_de_la_periode) \ FLOT(sTRANSFORMAT_31(numero_de_la_periode,liste_VARIABLE_cz0)) /* Formule generale definissant les variations des valeurs initiales des trois variables. */ dfTRANSFORMAT_31(liste_RECURSIVITE_MAXIMALE,fichier_RECURSIVITE_MAXIMALE,RECURSIVITE_MAXIMALE_IMPLICITE,RECURSIVITE_MAXIMALE) /* Definition des fichiers de la valeur initiale de la recursivite maximale. */ #define sRECURSIVITE_MAXIMALE(numero_de_la_periode) \ INTE(sTRANSFORMAT_31(numero_de_la_periode,liste_RECURSIVITE_MAXIMALE)) \ /* Formule generale definissant les variations de la recursivite maximale. */ dfTRANSFORMAT_31(liste_PARAMETRE_FFH,fichier_PARAMETRE_FFH,PARAMETRE_FFH_IMPLICITE,FFH) /* Definition des fichiers de la valeur initiale du facteur du facteur d'homothetie. */ dfTRANSFORMAT_31(liste_PARAMETRE_FH_MINIMAL,fichier_PARAMETRE_FH_MINIMAL,PARAMETRE_FH_MINIMAL_IMPLICITE,FH_MINIMAL) /* Definition des fichiers de la valeur initiale du minimum du facteur d'homothetie. */ #define sPARAMETRE_FFH(numero_de_la_periode) \ FLOT(sTRANSFORMAT_31(numero_de_la_periode,liste_PARAMETRE_FFH)) \ /* Formule generale definissant les variations du facteur du facteur d'homothetie. */ #define sPARAMETRE_FH_MINIMAL(numero_de_la_periode) \ FLOT(sTRANSFORMAT_31(numero_de_la_periode,liste_PARAMETRE_FH_MINIMAL)) \ /* Formule generale definissant les variations du minimum du facteur d'homothetie. */ dfTRANSFORMAT_31(liste_FACTEUR_MINIMAL_RAYON,fichier_FACTEUR_MINIMAL_RAYON,FACTEUR_MINIMAL_RAYON_IMPLICITE,FACTEUR_MINIMAL_RAYON) dfTRANSFORMAT_31(liste_PARAMETRE_R0,fichier_PARAMETRE_R0,PARAMETRE_R0_IMPLICITE,R0) /* Definition des fichiers de la valeur initiale du rayon et de l'exposant de 'theta'. */ #define sFACTEUR_MINIMAL_RAYON(numero_de_la_periode) \ FLOT(sTRANSFORMAT_31(numero_de_la_periode,liste_FACTEUR_MINIMAL_RAYON)) #define sPARAMETRE_R0(numero_de_la_periode) \ FLOT(sTRANSFORMAT_31(numero_de_la_periode,liste_PARAMETRE_R0)) /* Formule generale definissant les variations du rayon et de l'exposant de 'theta'. */ dfTRANSFORMAT_31(liste_PARAMETRE_THETA0,fichier_PARAMETRE_THETA0,PARAMETRE_THETA0_IMPLICITE,THETA0) dfTRANSFORMAT_31(liste_PARAMETRE_dTHETA,fichier_PARAMETRE_dTHETA,PARAMETRE_dTHETA_IMPLICITE,dTHETA) /* Definition des fichiers de la valeur initiale du 'theta' et de son increment. */ #define sPARAMETRE_THETA0(numero_de_la_periode) \ FLOT(sTRANSFORMAT_31(numero_de_la_periode,liste_PARAMETRE_THETA0)) #define sPARAMETRE_dTHETA(numero_de_la_periode) \ FLOT(sTRANSFORMAT_31(numero_de_la_periode,liste_PARAMETRE_dTHETA)) /* Formule generale definissant les variations du 'theta' et de son increment. */ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* D E F I N I T I O N D E S T R O I S F O N C T I O N S ' F ' : */ /* */ /*************************************************************************************************************************************/ #include xrf/recursif.11.I" /* ATTENTION, il est imperatif que les fonctions derivables formellement soient definies */ /* dans un fichier a part afin qu'elles ne soient pas l'objet d'une double definition. En */ /* effet, on trouve dans 'v $xcc/cpp$Z' : */ /* */ /* $CA $module$w */ /* | $xcp/cpp$X ... -c$PASSE_D -e$PASSE_5 */ /* > $fichierR */ /* */ /* Ainsi, si par exemple la definition de 'RAYON(h,theta)' etait faite localement dans le */ /* fichier '$xrf/recursif.11$K', cette definition apparaitrait deux fois dans le fichier */ /* '$module$w' : une premiere fois en tete, provenant de '$PASSE_D' ou l'on ne trouve que */ /* les definitions du type '-define ...', puis une deuxieme fois a la suite, la ou se trouve */ /* concatene au fichier '$module$W' des '-define ...' le fichier '$fichierA' a compiler... */ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* D E F I N I T I O N D E L A C O N S T R U C T I O N R E C U R S I V E : */ /* */ /*************************************************************************************************************************************/ #define VISUALISER_LE_POINT_DE_DEPART \ FAUX #define VISUALISER_UNE_SEULE_FOIS_LE_POINT_DE_DEPART \ VRAI DEFV(Local,DEFV(Logical,INIT(visualiser_le_point_de_depart,VISUALISER_LE_POINT_DE_DEPART))); DEFV(Local,DEFV(Logical,INIT(visualiser_une_seule_fois_le_point_de_depart,VISUALISER_UNE_SEULE_FOIS_LE_POINT_DE_DEPART))); /* Introduit le 20110106174945 afin de pouvoir visualiser le point de depart de chaque */ /* iteration (pour 'v $xiirf/RECU.D5'). La possibilite de la visualiser plusieurs fois */ /* (pour chacun de ses "fils") a ete introduit le 20110107094539 ; ceci permettra donc */ /* de visualiser les "filiations" via 'v $xrv/particule.10$K' ('v $xiirf/RECU.E5'). */ #define INTRODUIRE_DE_L_ALEATOIRE \ FAUX DEFV(Local,DEFV(Logical,INIT(introduire_de_l_aleatoire,INTRODUIRE_DE_L_ALEATOIRE))); /* Indique si l'objet est deterministe ('FAUX') ou non deterministe ('VRAI'). */ #define PROBABILITE_DE_GENERATION \ FDU DEFV(Local,DEFV(Float,INIT(probabilite_de_generation,PROBABILITE_DE_GENERATION))); /* Donne si 'IL_FAUT(introduire_de_l_aleatoire)' la probabilite de generation. */ #define CHANGER_LE_NOMBRE_D_ITERATIONS \ VRAI DEFV(Local,DEFV(Logical,INIT(changer_le_nombre_d_iterations,CHANGER_LE_NOMBRE_D_ITERATIONS))); /* Afin de pouvoir bloquer 'CHANGEMENT_DU_NOMBRE_D_ITERATIONS(...)'. Ceci fut introduit */ /* le 20110106173109 (pour 'v $xiirf/RECU.D5')... */ #define CHANGEMENT_DU_NOMBRE_D_ITERATIONS(n) \ COND(IL_FAUT(changer_le_nombre_d_iterations) \ ,MAX2(UN,INTE(MUL2(RACX(RACX(ffh)),n))) \ ,n \ ) \ /* Fonction de changement du nombre d'iterations ; ce nombre doit etre reduit puisque */ \ /* progressivement la taille des spirales est reduite : on prend 'RACX(RACX(...))' de */ \ /* facon arbitraire et non parametree... On notera enfin que l'on fait toujours au moins */ \ /* une iteration... */ #define CHANGEMENT_DU_FACTEUR_D_HOMOTHETIE(h) \ MUL2(ffh,h) \ /* Fonction de changement du facteur d'homothetie... */ #define CHANGEMENT_DE_L_ANGLE_THETA(t) \ NEUT(t) \ /* Fonction de changement de l'angle 'theta' initial, actuellement neutre... */ #define CHANGEMENT_DE_L_INCREMENT_DE_L_ANGLE_THETA(dt) \ NEUT(dt) \ /* Fonction de changement de l'increment de l'angle 'theta' initial, actuellement neutre... */ BFonctionI #define VISUALISATION_D_UN_POINT(Xf,Yf,Zf,numero_de_l_iteration) \ Bblock \ Test(IL_FAUT(visualiser_en_RVB)) \ Bblock \ DEFV(Float,INIT(d_nombre_d_iterations,d_FCONSTANTES)); \ /* Derivee du nombre d'iterations... */ \ EGAL(dcx,d#Fx(fh,theta_courant)); \ EGAL(dcy,d#Fy(fh,theta_courant)); \ EGAL(dcz,d#Fz(fh,theta_courant)); \ /* Calcul des derivees dans le cas ou une visualisation RVB est demandee... */ \ \ RECHERCHE_DES_EXTREMA_DES_COORDONNEES_ET_DES_DERIVEES; \ /* On notera que cette recherche n'est pas conditionnee par 'editer_les_extrema', car les */ \ /* extrema pourraient etre utilises pour la visualisation... */ \ Eblock \ ATes \ Bblock \ Eblock \ ETes \ \ CALS(memorisation_1_point_07(SOUS(Xf,Xcentre_ESPACE) \ ,SOUS(Yf,Ycentre_ESPACE) \ ,SOUS(Zf,Zcentre_ESPACE) \ ,dcx \ ,dcy \ ,dcz \ ,numero_de_l_iteration \ ) \ ); \ Eblock \ /* Visualisation d'un point (introduit le 20110106174945). */ DEFV(Local,DEFV(FonctionI,definition_recursive(nombre_d_iterations,cx,cy,cz,fh,theta,dtheta))) DEFV(Argument,DEFV(Int,nombre_d_iterations)); /* Nombre d'iterations a effectuer. */ DEFV(Argument,DEFV(Float,cx)); DEFV(Argument,DEFV(Float,cy)); DEFV(Argument,DEFV(Float,cz)); /* Definition des coordonnees de depart (point "central" de la spirale). */ DEFV(Argument,DEFV(Float,fh)); /* Definition du facteur d'homothetie courant. */ DEFV(Argument,DEFV(Float,theta)); DEFV(Argument,DEFV(Float,dtheta)); /* Definition de l'angle 'theta' de depart et de son increment... */ /*-----------------------------------------------------------------------------------------------------------------------------------*/ Bblock DEFV(Float,INIT(theta0_courant,theta)); DEFV(Float,INIT(d_theta0_courant,d_FCONSTANTES)); /* Memorisation du 'theta' initial a cause de la fonction 'RAYON(h,theta)' qui fait un */ /* 'NORM(...)' en utilisant le 'theta' de depart et d'arrivee pour cette occurence de la */ /* fonction 'definition_recursive(...)' ; on ne peut pas utiliser 'theta0' car en effet, */ /* 'theta0_courant' et 'theta0' sont differents puisque 'theta_courant' devient le nouveau */ /* 'theta0_courant' lors d'un appel recursif de 'definition_recursive(...)'... */ DEFV(Float,INIT(theta_courant,theta)); DEFV(Float,INIT(d_theta_courant,d_FVARIABLES_DE_DERIVATION)); /* Definition du 'theta' courant. On notera que cette definition locale est due uniquement a */ /* l'instruction : */ /* */ /* INCR(theta_courant,dtheta); */ /* */ /* qui suit... */ INIT_ERROR; /*..............................................................................................................................*/ INCR(recursivite_courante,I); /* Gestion de la profondeur de la recursivite... */ Test(IFET(IL_FAUT(visualiser_le_point_de_depart) ,IL_FAUT(visualiser_une_seule_fois_le_point_de_depart) ) ) Bblock VISUALISATION_D_UN_POINT(cx,cy,cz,PRED(PREMIERE_ITERATION_D_UN_Komp)); /* Memorisation du point de depart (introduit le 20110106174945). */ Eblock ATes Bblock Eblock ETes Komp(numero_de_l_iteration_courante,nombre_d_iterations) Bblock DEFV(Float,INIT(cx_recursif,ADD2(cx,Fx(fh,theta_courant)))); DEFV(Float,INIT(cy_recursif,ADD2(cy,Fy(fh,theta_courant)))); DEFV(Float,INIT(cz_recursif,ADD2(cz,Fz(fh,theta_courant)))); /* Translation du point courant... */ DEFV(Logical,INIT(l_iteration_courante_est_deja_visualisee,FAUX)); /* Afin de savoir si l'iteration courante a deja ete visualisee... */ Test(IFET(IL_FAUT(visualiser_le_point_de_depart) ,IL_NE_FAUT_PAS(visualiser_une_seule_fois_le_point_de_depart) ) ) Bblock VISUALISATION_D_UN_POINT(cx,cy,cz,PRED(PREMIERE_ITERATION_D_UN_Komp)); /* Memorisation du point de depart (introduit sous cette forme le 20110107094539). */ VISUALISATION_D_UN_POINT(cx_recursif,cy_recursif,cz_recursif,numero_de_l_iteration_courante); /* Memorisation de l'iteration courante... */ EGAL(l_iteration_courante_est_deja_visualisee,VRAI); /* L'iteration courante a donc deja ete visualisee... */ Eblock ATes Bblock Eblock ETes Test(IFOU(IFGE(recursivite_courante,recursivite_maximale) ,IFLE(fh,fh_minimal) ) ) Bblock /* Cas ou l'on a atteint la profondeur maximale de la recursivite, ou bien le facteur */ /* d'homothetie 'fh' est devenu trop petit ; la recursivite est stoppee, est une sphere */ /* est visualisee, ou encore s'il faut visualiser le point de depart de chaque iteration. */ Test(IFOU(IL_FAUT(visualiser_le_fantome) ,IFGE(numero_de_l_iteration_courante,PREMIERE_ITERATION_VISUALISEE) ) ) Bblock Test(EST_FAUX(l_iteration_courante_est_deja_visualisee)) Bblock VISUALISATION_D_UN_POINT(cx_recursif,cy_recursif,cz_recursif,numero_de_l_iteration_courante); /* Memorisation de l'iteration courante... */ Eblock ATes Bblock Eblock ETes Eblock ATes Bblock Eblock ETes Eblock ATes Bblock /* Cas ou l'on n'a pas encore atteint la profondeur maximale de la recursivite, et ou le */ /* facteur d'homothetie 'fh' est encore trop grand, on doit donc construire une nouvelle */ /* spirale, mais d'echelle inferieure... */ DEFV(Logical,INIT(il_faut_generer,VRAI)); /* A priori, on va generer en faisant un appel recursif... */ Test(IL_FAUT(introduire_de_l_aleatoire)) Bblock DEFV(Float,INIT(probabilite,FLOT__UNDEF)); GENERATION_D_UNE_PROBABILITE_01(probabilite); /* Generation de l'evenement... */ Test(IFGT(probabilite,probabilite_de_generation)) Bblock EGAL(il_faut_generer,FAUX); /* Cas ou il faut "aborter" la generation... */ Eblock ATes Bblock Eblock ETes Eblock ATes Bblock Eblock ETes Test(IL_FAUT(il_faut_generer)) Bblock CALS(definition_recursive(CHANGEMENT_DU_NOMBRE_D_ITERATIONS(nombre_d_iterations) ,cx_recursif,cy_recursif,cz_recursif ,CHANGEMENT_DU_FACTEUR_D_HOMOTHETIE(fh) ,CHANGEMENT_DE_L_ANGLE_THETA(theta_courant) ,CHANGEMENT_DE_L_INCREMENT_DE_L_ANGLE_THETA(dtheta) ) ); /* Generation recursive de l'objet... */ Eblock ATes Bblock Eblock ETes Eblock ETes INCR(theta_courant,dtheta); /* Progression du 'theta' courant. */ Eblock EKom DECR(recursivite_courante,I); /* Gestion de la profondeur de la recursivite... */ RETU_ERROR; Eblock EFonctionI /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* D E F I N I T I O N D E S I N I T I A L I S A T I O N S : */ /* */ /*************************************************************************************************************************************/ #include xrk/attractor.18.I" /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* G E N E R A T I O N D ' U N O B J E T R E C U R S I F D E T Y P E " C H O U - F L E U R " : */ /* */ /*************************************************************************************************************************************/ BCommande(nombre_d_arguments,arguments) /*-----------------------------------------------------------------------------------------------------------------------------------*/ Bblock /*..............................................................................................................................*/ INITIALISATIONS_GENERALES; /* Initialisations generales faites au tout debut... */ iTRANSFORMAT_31(liste_COEFFICIENT_Kx,COEFFICIENT_Kx_IMPLICITE); iTRANSFORMAT_31(liste_COEFFICIENT_Ky,COEFFICIENT_Ky_IMPLICITE); iTRANSFORMAT_31(liste_COEFFICIENT_Kz,COEFFICIENT_Kz_IMPLICITE); /* Initialisation des facteurs d'echelle des trois coordonnees. */ iTRANSFORMAT_31(liste_COEFFICIENT_Tx,COEFFICIENT_Tx_IMPLICITE); iTRANSFORMAT_31(liste_COEFFICIENT_Ty,COEFFICIENT_Ty_IMPLICITE); /* Initialisation des valeurs initiales des facteurs d'echelle de l'angle 'theta'. */ iTRANSFORMAT_31(liste_VARIABLE_cx0,VARIABLE_cx0_IMPLICITE); iTRANSFORMAT_31(liste_VARIABLE_cy0,VARIABLE_cy0_IMPLICITE); iTRANSFORMAT_31(liste_VARIABLE_cz0,VARIABLE_cz0_IMPLICITE); /* Initialisation des valeurs initiales des trois coordonnees (cx,cy,cz). */ iTRANSFORMAT_31(liste_RECURSIVITE_MAXIMALE,RECURSIVITE_MAXIMALE_IMPLICITE); /* Initialisation de la valeur initiale de la recursivite maximale. */ iTRANSFORMAT_31(liste_PARAMETRE_FFH,PARAMETRE_FFH_IMPLICITE); /* Initialisation de la valeur initiale du facteur du facteur d'homothetie. */ iTRANSFORMAT_31(liste_PARAMETRE_FH_MINIMAL,PARAMETRE_FH_MINIMAL_IMPLICITE); /* Initialisation de la valeur initiale du minimum du facteur d'homothetie. */ iTRANSFORMAT_31(liste_FACTEUR_MINIMAL_RAYON,FACTEUR_MINIMAL_RAYON_IMPLICITE); iTRANSFORMAT_31(liste_PARAMETRE_R0,PARAMETRE_R0_IMPLICITE); /* Initialisation de la valeur initiale du rayon et de l'exposant de 'theta'. */ iTRANSFORMAT_31(liste_PARAMETRE_THETA0,PARAMETRE_THETA0_IMPLICITE); iTRANSFORMAT_31(liste_PARAMETRE_dTHETA,PARAMETRE_dTHETA_IMPLICITE); /* Initialisation de la valeur initiale du 'theta' et de son increment. */ iTRANSFORMAT_31(liste_NOMBRE_D_ITERATIONS,NOMBRE_D_ITERATIONS_IMPLICITE); /* Initialisation du nombre d'iterations. */ #include xrv/champs_5.1A.I" GET_ARGUMENTSv(nombre_d_arguments ,BLOC(PROCESS_ARGUMENTS_GEOMETRIQUES; PROCESS_ARGUMENT_FICHIER("COEFFICIENT_Kx=" ,fichier_COEFFICIENT_Kx ,liste_COEFFICIENT_Kx ,COEFFICIENT_Kx_IMPLICITE ,gTRANSFORMAT_31 ); PROCESS_ARGUMENT_FICHIER("COEFFICIENT_Ky=" ,fichier_COEFFICIENT_Ky ,liste_COEFFICIENT_Ky ,COEFFICIENT_Ky_IMPLICITE ,gTRANSFORMAT_31 ); PROCESS_ARGUMENT_FICHIER("COEFFICIENT_Kz=" ,fichier_COEFFICIENT_Kz ,liste_COEFFICIENT_Kz ,COEFFICIENT_Kz_IMPLICITE ,gTRANSFORMAT_31 ); PROCESS_ARGUMENT_FICHIER("COEFFICIENT_Tx=" ,fichier_COEFFICIENT_Tx ,liste_COEFFICIENT_Tx ,COEFFICIENT_Tx_IMPLICITE ,gTRANSFORMAT_31 ); PROCESS_ARGUMENT_FICHIER("COEFFICIENT_Ty=" ,fichier_COEFFICIENT_Ty ,liste_COEFFICIENT_Ty ,COEFFICIENT_Ty_IMPLICITE ,gTRANSFORMAT_31 ); PROCESS_ARGUMENT_FICHIER("VARIABLE_cx0=" ,fichier_VARIABLE_cx0 ,liste_VARIABLE_cx0 ,VARIABLE_cx0_IMPLICITE ,gTRANSFORMAT_31 ); PROCESS_ARGUMENT_FICHIER("VARIABLE_cy0=" ,fichier_VARIABLE_cy0 ,liste_VARIABLE_cy0 ,VARIABLE_cy0_IMPLICITE ,gTRANSFORMAT_31 ); PROCESS_ARGUMENT_FICHIER("VARIABLE_cz0=" ,fichier_VARIABLE_cz0 ,liste_VARIABLE_cz0 ,VARIABLE_cz0_IMPLICITE ,gTRANSFORMAT_31 ); PROCESS_ARGUMENT_FICHIER("RECURSIVITE_MAXIMALE=" ,fichier_RECURSIVITE_MAXIMALE ,liste_RECURSIVITE_MAXIMALE ,RECURSIVITE_MAXIMALE_IMPLICITE ,gTRANSFORMAT_31 ); PROCESS_ARGUMENT_FICHIER("PARAMETRE_FFH=" ,fichier_PARAMETRE_FFH ,liste_PARAMETRE_FFH ,PARAMETRE_FFH_IMPLICITE ,gTRANSFORMAT_31 ); PROCESS_ARGUMENT_FICHIER("PARAMETRE_FH_MINIMAL=" ,fichier_PARAMETRE_FH_MINIMAL ,liste_PARAMETRE_FH_MINIMAL ,PARAMETRE_FH_MINIMAL_IMPLICITE ,gTRANSFORMAT_31 ); PROCESS_ARGUMENT_FICHIER("FACTEUR_MINIMAL_RAYON=" ,fichier_FACTEUR_MINIMAL_RAYON ,liste_FACTEUR_MINIMAL_RAYON ,FACTEUR_MINIMAL_RAYON_IMPLICITE ,gTRANSFORMAT_31 ); PROCESS_ARGUMENT_FICHIER("PARAMETRE_R0=" ,fichier_PARAMETRE_R0 ,liste_PARAMETRE_R0 ,PARAMETRE_R0_IMPLICITE ,gTRANSFORMAT_31 ); PROCESS_ARGUMENT_FICHIER("PARAMETRE_THETA0=" ,fichier_PARAMETRE_THETA0 ,liste_PARAMETRE_THETA0 ,PARAMETRE_THETA0_IMPLICITE ,gTRANSFORMAT_31 ); PROCESS_ARGUMENT_FICHIER("PARAMETRE_dTHETA=" ,fichier_PARAMETRE_dTHETA ,liste_PARAMETRE_dTHETA ,PARAMETRE_dTHETA_IMPLICITE ,gTRANSFORMAT_31 ); GET_ARGUMENT_L("changer_nombre_iterations=""changer=""cni=",changer_le_nombre_d_iterations); /* Introduit le 20110106173109 (pour 'v $xiirf/RECU.D5')... */ PROCESS_ARGUMENT_FICHIER("NOMBRE_D_ITERATIONS=" ,fichier_NOMBRE_D_ITERATIONS ,liste_NOMBRE_D_ITERATIONS ,NOMBRE_D_ITERATIONS_IMPLICITE ,gTRANSFORMAT_31 ); PROCESS_ARGUMENTS_DE_VISUALISATION; PROCESS_ARGUMENTS_DE_VISUALISATION_DES_AXES_DE_COORDONNEES; GET_ARGUMENT_L("renormaliser=",renormaliser_les_niveaux); GET_ARGUMENT_I("n=""iterations=",nombre_d_iterations); GET_ARGUMENT_L("visualiser_point_depart=""vpd=",visualiser_le_point_de_depart); GET_ARGUMENT_L("visualiser_point_depart_une_fois=""vpd1=",visualiser_une_seule_fois_le_point_de_depart); GET_ARGUMENT_N("visualiser_point_depart_N_fois=""vpdN=",visualiser_une_seule_fois_le_point_de_depart); /* Argument introduit le 20110106174945 (pour 'v $xiirf/RECU.D5') et complete le */ /* 20110107094539 avec la possibilite de visualiser 'N' fois ('v $xiirf/RECU.E5'). */ GET_ARGUMENT_I("recursivite=",recursivite_maximale); GET_ARGUMENT_L("aleatoire=",introduire_de_l_aleatoire); GET_ARGUMENT_F("probabilite=",probabilite_de_generation); ) ); #include xrv/champs_5.19.I" /* Pour eviter le message : */ /* */ /* Static function is not referenced. */ /* */ /* sur 'SYSTEME_ES9000_AIX_CC'... */ #include xrk/attractor.19.I" /* Validations et definition de l'espace physique. */ Komp(numero_de_la_periode_courante_de_la_simulation,nombre_de_periodes_de_la_simulation) Bblock INITIALISATIONS_RELATIVES_A_CHAQUE_NOUVELLE_IMAGE(numero_de_la_periode_courante); /* Initialisations necessaires avant le calcul et la generation de chaque nouvelle image. */ EGAL(kx,sCOEFFICIENT_Kx(numero_de_la_periode_courante)); EGAL(ky,sCOEFFICIENT_Ky(numero_de_la_periode_courante)); EGAL(kz,sCOEFFICIENT_Kz(numero_de_la_periode_courante)); /* Calcul des facteurs d'echelle des trois coordonnees. */ EGAL(tx,sCOEFFICIENT_Tx(numero_de_la_periode_courante)); EGAL(ty,sCOEFFICIENT_Ty(numero_de_la_periode_courante)); /* Calcul des valeurs initiales des facteurs d'echelle de l'angle 'theta'. */ EGAL(cx,sVARIABLE_cx0(numero_de_la_periode_courante)); EGAL(cy,sVARIABLE_cy0(numero_de_la_periode_courante)); EGAL(cz,sVARIABLE_cz0(numero_de_la_periode_courante)); /* Calcul des valeurs initiales des trois coordonnees (cx,cy,cz). */ EGAL(ffh,sPARAMETRE_FFH(numero_de_la_periode_courante)); /* Calcul du facteur du facteur d'homothetie. */ EGAL(fh_minimal,sPARAMETRE_FH_MINIMAL(numero_de_la_periode_courante)); /* Calcul du minimum du facteur d'homothetie. */ EGAL(facteur_minimal_rayon,sFACTEUR_MINIMAL_RAYON(numero_de_la_periode_courante)); EGAL(r0,sPARAMETRE_R0(numero_de_la_periode_courante)); /* Calcul de la valeur minimale du facteur multiplicatif associe a 'RAYON(...)' et du */ /* rayon initial. */ EGAL(theta0,sPARAMETRE_THETA0(numero_de_la_periode_courante)); EGAL(dtheta,sPARAMETRE_dTHETA(numero_de_la_periode_courante)); /* Calcul du 'theta' et de son increment. */ vTRANSFORMAT_31(nombre_d_iterations ,sNOMBRE_D_ITERATIONS,numero_de_la_periode_courante,fichier_NOMBRE_D_ITERATIONS ); /* Calcul du nombre d'iterations lorsqu'il est variable. */ vTRANSFORMAT_31(recursivite_maximale ,sRECURSIVITE_MAXIMALE,numero_de_la_periode_courante,fichier_RECURSIVITE_MAXIMALE ); /* Calcul de la recursivite maximale lorsqu'elle est variable. */ DECR(cz ,MOYS(Fz(fh,AXPB(nombre_d_iterations,dtheta,theta0)) ,Fz(fh,theta0) ) ); /* Cette translation de la coordonnee 'Z' est destinee a centrer l'objet a l'origine, ce qui */ /* permet d'ameliorer la perception tridimensionnel des objets stereoscopiques... */ CALS(definition_recursive(nombre_d_iterations ,cx,cy,cz ,fh ,theta0,dtheta ) ); /* Generation recursive de l'objet... */ #include xrk/attractor.1A.I" VISUALISATION_DES_AXES_DE_COORDONNEES; /* Visualisation si necessaire des trois axes de coordonnees. */ Test(IFET(IL_FAUT(visualiser_en_RVB),IL_FAUT(renormaliser_les_niveaux))) Bblock GENERATION_D_UNE_IMAGE_ET_PASSAGE_A_LA_SUIVANTE_AVEC_RENORMALISATION(BLOC(VIDE;) ,SOUS(dXmax_ESPACE,dXmin_ESPACE) ,SOUS(maximum_de_dcx,minimum_de_dcx) ,SOUS(dYmax_ESPACE,dYmin_ESPACE) ,SOUS(maximum_de_dcy,minimum_de_dcy) ,SOUS(dZmax_ESPACE,dZmin_ESPACE) ,SOUS(maximum_de_dcz,minimum_de_dcz) ); /* Generation de l'image courante avec renormalisation des niveaux. On notera que la regle */ /* de trois faite ci-dessus a l'aide 'SCAL(...)' n'est possible que parce que les derivees */ /* ont ete ramenees dans [0,1[ grace aux fonctions '?_DERIVEE_DANS_01(...)'... */ Eblock ATes Bblock GENERATION_D_UNE_IMAGE_ET_PASSAGE_A_LA_SUIVANTE(BLOC(VIDE;)); /* Generation de l'image courante sans renormalisation des niveaux. */ Eblock ETes Eblock EKom EDITION_DES_EXTREMA_DES_COORDONNEES_ET_DES_DERIVEES; /* Edition facultative des extrema des coordonnees. */ RETU_Commande; Eblock ECommande