/*************************************************************************************************************************************/
/* */
/* 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