/*************************************************************************************************************************************/ /* */ /* 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 " Y O U R T E " B I D I M E N S I O N N E L L E : */ /* */ /* */ /* Author of '$xrf/recursif.21$K' : */ /* */ /* Jean-Francois COLONNA (LACTAMME, 20050425135851). */ /* */ /*************************************************************************************************************************************/ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* 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_CPP_____MODULE_NON_DERIVABLE @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.0) #define dYmin_ESPACE \ PARE(-1.0) #define dZmin_ESPACE \ PARE(-1.0) /* Definition des minima des differentielles {dx,dy,dz}. */ #define dXmax_ESPACE \ PARE(1.0) #define dYmax_ESPACE \ PARE(1.0) #define dZmax_ESPACE \ PARE(1.0) /* 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...). */ #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" /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* 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 " Y O U R T E " B I D I M E N S I O N N E L L E : */ /* */ /*************************************************************************************************************************************/ #include xrk/attractor.17.I" 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 \ TROIS 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 RAYON_DE_VISUALISATION \ GRO5(FRA10(FU)) \ /* Introduit le 20060311094427 a cause de 'v $xrv/champs_5.1A$I PROKESS_ARGUMENT_F' qui */ \ /* en a besoin depuis le 20060224121036... */ #define FACTEUR_D_HOMOTHETIE_DU_RAYON \ GRO8(FRA16(FU)) #define RAYON_INITIAL \ RAYON_DE_VISUALISATION DEFV(Local,DEFV(Float,INIT(rayon_initial,RAYON_INITIAL))); DEFV(Local,DEFV(Float,INIT(facteur_d_homothetie_du_rayon,FACTEUR_D_HOMOTHETIE_DU_RAYON))); /* Gestion du rayon... */ #define THETA_INITIAL \ PI_SUR_2 #define INCREMENT_DE_THETA \ DIVI(CERCLE_TRIGONOMETRIQUE,QUATRE) #define NOMBRE_DE_ROTATIONS \ TROIS DEFV(Local,DEFV(Float,INIT(theta_initial,THETA_INITIAL))); DEFV(Local,DEFV(Float,INIT(increment_de_theta,INCREMENT_DE_THETA))); DEFV(Local,DEFV(Int,INIT(nombre_de_rotations,NOMBRE_DE_ROTATIONS))); /* Gestion de l'angle... */ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* 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 : */ /* */ /*************************************************************************************************************************************/ #include xrk/attractor.16.I" DEFV(Local,DEFV(Float,INIT(rayon_de_visualisation,FLOT__UNDEF))); /* Rayon du disque materialisant une iteration. */ BFonctionI DEFV(Local,DEFV(FonctionI,memorisation_1_point_07(AXf,AYf,AZf,AdXf,AdYf,AdZf,numero_de_l_iteration_courante))) /* La fonction 'memorisation_1_point_07(...)' a ete introduite le 20051126092334 pour */ /* 'v $xrv/particule.31$I memorisation_1_point_07', c'est-a-dire un peu tardivement et */ /* je ne comprends pas pourquoi cela ne s'etait pas vu plus tot... */ 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 BFonctionI DEFV(Local,DEFV(FonctionI,memorisation_1_point_08(AXf,AYf,AZf,AdXf,AdYf,AdZf,numero_de_l_iteration_courante,rayon))) /* Le nom 'memorisation_1_point_07(...)' a ete change en 'memorisation_1_point_08(...)' */ /* le 20051126092334, c'est-a-dire un peu tardivement. En fait, il apparait que les deux */ /* fonctions 'memorisation_1_point_07(...)' et 'memorisation_1_point_08(...)' sont toutes */ /* deux necessaires, la premiere pour 'v $xrv/particule.31$I memorisation_1_point_07' et */ /* la seconde en local ci-apres dans 'v $xrf/recursif.21$K definition_recursive'... */ 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). */ DEFV(Argument,DEFV(Float,rayon)); /* Rayon courant... */ /*-----------------------------------------------------------------------------------------------------------------------------------*/ Bblock #include xrk/attractor.15.I" INIT_ERROR; /*..............................................................................................................................*/ EGAL(rayon_de_visualisation,rayon); 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 : */ /* */ /*************************************************************************************************************************************/ #define __VERSION__PERMETTRE_L_UTILISATION_D_UN_FOND \ /* Afin de permettre la mise en place d'un fond pour chaque image generee (definition */ \ /* introduite ici le 20050427131137). */ #include xrv/particule.31.I" /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* 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 FACTEUR_ROUGE \ FU #define FACTEUR_VERTE \ FU #define FACTEUR_BLEUE \ FU DEFV(Local,DEFV(Float,INIT(facteur_ROUGE,FACTEUR_ROUGE))); DEFV(Local,DEFV(Float,INIT(facteur_VERTE,FACTEUR_VERTE))); DEFV(Local,DEFV(Float,INIT(facteur_BLEUE,FACTEUR_BLEUE))); /* Facteurs introduits le 20050427124513... */ #define FACTEUR_DU_RAYON_DE_VISUALISATION \ FU DEFV(Local,DEFV(Float,INIT(facteur_du_rayon_de_visualisation,FACTEUR_DU_RAYON_DE_VISUALISATION))); /* Facteur introduit le 20050427132313... */ BFonctionI DEFV(Local,DEFV(FonctionI,definition_recursive(cx,cy,cz,rayon,theta))) DEFV(Argument,DEFV(Float,cx)); DEFV(Argument,DEFV(Float,cy)); DEFV(Argument,DEFV(Float,cz)); /* Definition des coordonnees du centre courant... */ DEFV(Argument,DEFV(Float,rayon)); /* Rayon courant... */ DEFV(Argument,DEFV(Float,theta)); /* Definition de l'angle 'theta' de depart courant... */ /*-----------------------------------------------------------------------------------------------------------------------------------*/ Bblock INIT_ERROR; /*..............................................................................................................................*/ INCR(recursivite_courante,I); /* Gestion de la profondeur de la recursivite... */ EGAL(dcx,COSX(MUL2(facteur_ROUGE,NEUT(rayon)))); EGAL(dcy,COSX(MUL2(facteur_VERTE,NEUT(theta)))); EGAL(dcz,COSX(MUL2(facteur_BLEUE,PRED(recursivite_courante)))); /* Definition du coloriage (tres arbitraire...). On notera malgre tout que d'une part */ /* la fonction 'COSX(...)' maintient les valeurs dans [-1,+1] (ce qui se retrouve dans la */ /* definition de {d?min_ESPACE,d?max_ESPACE}) et d'autre part, annuler deux des trois */ /* facteurs bloque a +1 les deux 'dc?' correspondants et permet donc de visualiser le */ /* troisieme seul... */ RECHERCHE_DES_EXTREMA_DES_COORDONNEES_ET_DES_DERIVEES; CALS(memorisation_1_point_08(SOUS(cx,Xcentre_ESPACE) ,SOUS(cy,Ycentre_ESPACE) ,SOUS(cz,Zcentre_ESPACE) ,dcx ,dcy ,dcz ,UNDEF ,MUL2(facteur_du_rayon_de_visualisation,rayon) ) ); /* Memorisation de l'iteration courante... */ Test(IFGT(recursivite_courante,recursivite_maximale)) Bblock /* Cas ou l'on a atteint la profondeur maximale de la recursivite... */ Eblock ATes Bblock /* Cas ou l'on n'a pas encore atteint la profondeur maximale de la recursivite : */ Repe(nombre_de_rotations) Bblock DEFV(Float,INIT(theta_recursif ,SOUS(ADD2(theta ,MUL2(SOUS(compteur_des_repetitions_du_Repe,PREMIERE_ITERATION_D_UN_Repe),increment_de_theta) ) ,MOIT(MUL2(TRMU(nombre_de_rotations),increment_de_theta)) ) ) ); DEFV(Float,INIT(rayon_recursif,MUL2(facteur_d_homothetie_du_rayon,rayon))); CALS(definition_recursive(ADD2(cx,MUL2(ADD2(rayon,rayon_recursif),COSX(theta_recursif))) ,ADD2(cy,MUL2(ADD2(rayon,rayon_recursif),SINX(theta_recursif))) ,cz ,rayon_recursif ,theta_recursif ) ); /* Generation recursive de l'objet... */ Eblock ERep Eblock ETes 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 " Y O U R T E " B I D I M E N S I O N N E L L E : */ /* */ /*************************************************************************************************************************************/ BCommande(nombre_d_arguments,arguments) /*-----------------------------------------------------------------------------------------------------------------------------------*/ Bblock DONNEES_NECESSAIRES_A_L_UTILISATION_D_UN_FOND; /* Introduit le 20050427131522... */ /*..............................................................................................................................*/ INITIALISATIONS_GENERALES; /* Initialisations generales faites au tout debut... */ #include xrv/champs_5.1A.I" GET_ARGUMENTSv(nombre_d_arguments ,BLOC(PROCESS_ARGUMENTS_GEOMETRIQUES; PROCESS_ARGUMENTS_DE_VISUALISATION; PROCESS_ARGUMENTS_DE_VISUALISATION_DES_AXES_DE_COORDONNEES; GET_ARGUMENT_L("renormaliser=",renormaliser_les_niveaux); GET_ARGUMENT_F("fhr=""fh=",facteur_d_homothetie_du_rayon); GET_ARGUMENT_F("rayon=""r0=",rayon_initial); GET_ARGUMENT_F("theta=""t0=",theta_initial); GET_ARGUMENT_F("dtheta=""dt=",increment_de_theta); GET_ARGUMENT_I("ntheta=""nt=",nombre_de_rotations); GET_ARGUMENT_F("fROUGE=""fR=",facteur_ROUGE); GET_ARGUMENT_F("fVERTE=""fV=",facteur_VERTE); GET_ARGUMENT_F("fBLEUE=""fB=",facteur_BLEUE); GET_ARGUMENT_F("fr=",facteur_du_rayon_de_visualisation); GET_ARGUMENT_I("recursivite=",recursivite_maximale); ) ); #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(cx,Xcentre_ESPACE); EGAL(cy,Ycentre_ESPACE); EGAL(cz,Zcentre_ESPACE); CALS(definition_recursive(cx ,cy ,cz ,rayon_initial ,theta_initial ) ); /* 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