/*************************************************************************************************************************************/ /* */ /* I N T E G R A T I O N T R I D I M E N S I O N N E L L E D ' U N E S U I T E D ' I M A G E S : */ /* */ /* */ /* Nota : */ /* */ /* Ce programme est tres inspire de la */ /* commande 'v $xci/albumK'. */ /* */ /* */ /* Author of '$xrv/champs_5.30$K' : */ /* */ /* Jean-Francois COLONNA (LACTAMME, 1995??????????). */ /* */ /*************************************************************************************************************************************/ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* 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 L A C O M P I L A T I O N : */ /* */ /*************************************************************************************************************************************/ #define __VERSION__GENERATION_D_UN_NUCLEON \ /* Et oui, car on veut faire croire que l'on est dans '$xrq/nucleon.L0$K'... */ #include xrq/nucleon.L1.I" /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* D E F I N I T I O N S D E S C O N S T A N T E S U N I V E R S E L L E S : */ /* */ /*************************************************************************************************************************************/ #include xrq/nucleon.L2.I" /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* D E F I N I T I O N S D U T E M P S : */ /* */ /*************************************************************************************************************************************/ #include xrq/nucleon.L3.I" #include xrv/particule.41.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 ) : */ /* */ /*************************************************************************************************************************************/ #define Xcentre_ESPACE \ FLOT(k___Xmin) #define Ycentre_ESPACE \ FLOT(k___Ymin) #define Zcentre_ESPACE \ FLOT(k___Zmin) /* Definition de l'origine (ou "centre") de l'espace physique. En fait, elles ne servent */ /* qu'a recentrer l'objet lors de la visualisation, et d'autre part, elles doivent */ /* etre des constantes absolues a cause de : */ /* */ /* DEFINITION_D_UNE_POSITION(position_indefinie,Xcentre_ESPACE,...); \ */ /* */ /* dans '$xrq/nucleon.L5$I'. */ #define Xtranslation \ MOIT(dimX) #define Ytranslation \ MOIT(dimY) #define Ztranslation \ MOIT(dimZ) /* Definition des demi-longueurs des trois axes. */ #define hXmin_ESPACE \ SOUS(Xmin,Xtranslation) #define hYmin_ESPACE \ SOUS(Ymin,Ytranslation) #define hZmin_ESPACE \ SOUS(Zmin,Ztranslation) /* Definition du "coin" inferieur-gauche-arriere de l'espace physique. */ #define hXmax_ESPACE \ ADD2(Xmin,Xtranslation) #define hYmax_ESPACE \ ADD2(Ymin,Ytranslation) #define hZmax_ESPACE \ ADD2(Zmin,Ztranslation) /* Definition du "coin" superieur-droite-avant de l'espace physique. */ #include xrk/attractor.12.I" #include xrk/attractor.1D.I" /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* D E F I N I T I O N S D E S D I F F E R E N T S E S P A C E S : */ /* */ /*************************************************************************************************************************************/ #include xrq/nucleon.L4.I" /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* G E S T I O N D E L A B R U M E E V E N T U E L L E : */ /* */ /*************************************************************************************************************************************/ #include xrv/champs_5.16.I" /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* G E N E R A T I O N D E S I M A G E S : */ /* */ /*************************************************************************************************************************************/ #include xrv/champs_5.14.I" /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* P O U R S E S I M P L I F I E R L A V I E : */ /* */ /*************************************************************************************************************************************/ #include xrq/nucleon.L5.I" #include xrq/nucleon.L6.I" #include xrq/nucleon.LB.I" /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* A N T I - A L I A S I N G : */ /* */ /*************************************************************************************************************************************/ #include xrq/nucleon.LP.I" /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* D E F I N I T I O N S D E L A S O U R C E L U M I N E U S E : */ /* */ /*************************************************************************************************************************************/ #include xrq/nucleon.LQ.I" #include xrv/champs_5.21.I" /* Pour corriger les initialisations precedentes. ATTENTION, a cause de la derivation */ /* formelle d'ordre superieur a 1, ces 'undef's ne peuvent etre que dans un fichier */ /* d'include... */ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* D E F I N I T I O N S D E S F O N D U S : */ /* */ /*************************************************************************************************************************************/ #include xrq/nucleon.LR.2.I" /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* D E F I N I T I O N S D E L A G E S T I O N D U " D E P T H - C U E I N G " : */ /* */ /*************************************************************************************************************************************/ #define AJUSTER_AUTOMATIQUEMENT_PROFONDEUR_MINIMALE_ET_PROFONDEUR_MAXIMALE \ VRAI \ /* Afin d'ajuster automatiquement lex extrema de la troisieme coordonnee... */ #define PROFONDEUR_MINIMALE_DE_TRONCATION \ GRO3(FRA4(COORDONNEE_BARYCENTRIQUE_MAXIMALE)) \ /* Afin de ne pas avoir trop de depth-cueing... */ #include xrq/nucleon.Ld.I" /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* D E F I N I T I O N S D E L A G E S T I O N D U Z O O M : */ /* */ /*************************************************************************************************************************************/ #include xrq/nucleon.Le.I" /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* D E F I N I T I O N S D E L A V I S U A L I S A T I O N D ' U N E S P H E R E : */ /* */ /*************************************************************************************************************************************/ #include xrv/champs_5.1C.I" /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* D E F I N I T I O N S D E S T R A N S L A T I O N S E T R O T A T I O N S : */ /* */ /*************************************************************************************************************************************/ #include xrq/nucleon.LT.2.I" /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* G E S T I O N D E S C O U L E U R S : */ /* */ /*************************************************************************************************************************************/ #include xrv/champs_5.15.I" /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* G E S T I O N D E L A L I S T E D E S P O I N T S D E S T I N E E A F A I R E U N T R I */ /* S U R L A C O O R D O N N E E ' Z ' D ' A R R I E R E E N A V A N T P O U R L U T T E R */ /* E F F I C A C E M E N T C O N T R E L ' A L I A S I N G : */ /* */ /*************************************************************************************************************************************/ #include xrv/champs_5.11.I" /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* D E F I N I T I O N S D E S M O D E S D E R E P R E S E N T A T I O N D E S C H A M P S : */ /* */ /*************************************************************************************************************************************/ #define EDITER_LA_DEFINITION_DE_L_ESPACE_PHYSIQUE \ FAUX DEFV(Local,DEFV(Logical,INIT(editer_la_definition_de_l_espace_physique,EDITER_LA_DEFINITION_DE_L_ESPACE_PHYSIQUE))); /* Indique si l'on doit ('VRAI') ou pas ('FAUX') editer la definition de l'espace physique. */ #define SE_PLACER_AU_CENTRE_DE_GRAVITE_DES_PARALLELEPIPEDES \ FAUX DEFV(Local,DEFV(Logical,INIT(se_placer_au_centre_de_gravite_des_parallelepipedes ,SE_PLACER_AU_CENTRE_DE_GRAVITE_DES_PARALLELEPIPEDES ) ) ); /* Les spheres de materialisation doivent-elles etre centrees aux sommets des */ /* parallelepipedes ('FAUX') ou bien aux centres de gravite de ceux-ci ('VRAI'). */ #define PAS_HORIZONTAL \ GRO8(PasX) #define PAS_VERTICAL \ GRO8(PasY) DEFV(Local,DEFV(Int,INIT(pas_horizontal,PAS_HORIZONTAL))); DEFV(Local,DEFV(Int,INIT(pas_vertical,PAS_VERTICAL))); /* Pas de sous-echantillonnage des champs (introduit ici sous forme de 'Int's le */ /* 20111019191953). */ #define CHAMP_X(x,y,z) \ FLOT(SOUS(COXR(x),Xtranslation)) \ /* Definition de la coordonnee 'X'. */ #define CHAMP_Y(x,y,z) \ FLOT(SOUS(COYR(y),Ytranslation)) \ /* Definition de la coordonnee 'Y'. */ #define FACTEUR_DU_Z_AUTOMATIQUE \ VRAI DEFV(Local,DEFV(Logical,INIT(facteur_du_Z_automatique,FACTEUR_DU_Z_AUTOMATIQUE))); /* Indicateur permettant d'ajuster automatiquement et au mieux 'facteur_du_Z'... */ #define FACTEUR_DU_Z \ FU DEFV(Local,DEFV(Float,INIT(facteur_du_Z,FACTEUR_DU_Z))); /* Facteur permettant de "scaler" la troisieme dimension... */ /* */ /* ATTENTION, lorsque l'espace est tres 'distordu', il est plus que conseille d'augmenter */ /* la valeur de 'facteur_du_Z' de facon a ramener l'espace a quelque chose d'assez proche */ /* d'un cube ('v $xig/fonct$vv$DEF COEFFICIENT_DE_FORME_DE_L_ESPACE_TRIDIMENSIONNEL'). */ #define CHAMP_Z(x,y,z) \ MUL2(facteur_du_Z,SOUS(COZR(z),Ztranslation)) \ /* Definition de la coordonnee 'Z'. */ #include xrv/champs_5.1B.I" #define RAYON_DE_VISUALISATION \ FLOT(HUIT) \ /* Introduit le 20060311100415 a cause de 'v $xrv/champs_5.1A$I PROKESS_ARGUMENT_F' qui */ \ /* en a besoin depuis le 20060224121036... */ #define FACTEUR_DU_RAYON_DE_VISUALISATION \ DIVI(RAYON_DE_VISUALISATION,FU) DEFV(Local,DEFV(Float,INIT(facteur_du_rayon_de_visualisation,FACTEUR_DU_RAYON_DE_VISUALISATION))); /* Facteur permettant de "scaler" le rayon des spheres. Il donne aussi le rayon maximal des */ /* spheres de visualisation... */ #define CHAMP_RAYON(x,y,z) \ RAYON_DES_SPHERES_REPRESENTATIVES(facteur_du_rayon_de_visualisation \ ,______NORMALISE_NIVEAU(densite_des_niveaux) \ ) \ /* Definition du rayon des spheres. */ #define CHAMP_ROUGE(x,y,z) \ composante_ROUGE #define CHAMP_VERTE(x,y,z) \ composante_VERTE #define CHAMP_BLEUE(x,y,z) \ composante_BLEUE /* Definition des trois composantes (ROUGE,VERTE,BLEUE). */ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* 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.24.I" #include xrv/champs_5.26.I" BFonctionI DEFV(Local,DEFV(FonctionI,memorisation_1_point_17(X,Y,Z,densite_des_niveaux,composante_ROUGE,composante_VERTE,composante_BLEUE))) DEFV(Argument,DEFV(Int,X)); DEFV(Argument,DEFV(Int,Y)); DEFV(Argument,DEFV(Int,Z)); /* Definition de la position {x,y,z} du point courant dans les coordonnees des champs. */ DEFV(Argument,DEFV(genere_p,densite_des_niveaux)); /* Densite des niveaux a l'interieur du parallelepipede associe a {X,Y,Z}. */ DEFV(Argument,DEFV(Float,composante_ROUGE)); DEFV(Argument,DEFV(Float,composante_VERTE)); DEFV(Argument,DEFV(Float,composante_BLEUE)); /* Definition des valeurs qui vont definir le coloriage des spheres... */ /*-----------------------------------------------------------------------------------------------------------------------------------*/ Bblock #include xrk/attractor.15.I" /* Donnees utiles... */ INIT_ERROR; /*..............................................................................................................................*/ MEMORISATION_DU_POINT_COURANT_COMPLET(CHAMP_X(X,Y,Z),CHAMP_Y(X,Y,Z),CHAMP_Z(X,Y,Z) ,CHAMP_RAYON(X,Y,Z) ,CHAMP_ROUGE(X,Y,Z),CHAMP_VERTE(X,Y,Z),CHAMP_BLEUE(X,Y,Z) ); /* Memorisation du point courant , mais uniquement s'il est visible en fonction des */ /* conditions de visualisation... */ RETU_ERROR; Eblock EFonctionI /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* F O N C T I O N D E V I S U A L I S A T I O N D U P O I N T C O U R A N T : */ /* */ /*************************************************************************************************************************************/ #include xrv/champs_5.12.I" /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* G E S T I O N D E L A V I S U A L I S A T I O N S T E R E O S C O P I Q U E : */ /* */ /*************************************************************************************************************************************/ #define POSITIONNEMENT_RELATIF_DE_L_OBSERVATEUR_SUR_L_AXE_OZ \ FACTEUR_D_ELOIGNEMENT_EN_Z_D_UN_OBSERVATEUR_LOINTAIN \ /* A priori, on eloigne l'observateur car, en effet, il peut y avoir partout dans l'espace */ \ /* parallelepipedique des points a visualiser et il faut, bien entendu eviter, qu'il soient */ \ /* trop pres de l'observateur en particulier lors d'operations de rotation afin de ne pas */ \ /* induire de fortes distorsions. On notera qu'on ecrase ainsi la definition implicite */ \ /* faite dans '$xrv/champs_5.13$I'. Ceci a ete introduit le 19961021192212. */ #include xrv/champs_5.13.I" /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* D E F I N I T I O N S D E L ' I N T E R P O L A T I O N D E S P A R A M E T R E S : */ /* */ /*************************************************************************************************************************************/ #include xrq/nucleon.LX.2.I" /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* 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 xrv/champs_5.17.I" /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* D E F I N I T I O N D U S E U I L L A G E : */ /* */ /*************************************************************************************************************************************/ #define LE_SEUILLAGE_EST_ALEATOIRE \ FAUX \ /* Le seuillage est-il aleatoire ('VRAI') ou deterministe ('FAUX') et lie donc aux */ \ /* parametres 'SEUIL_DE_MASQUAGE_INFERIEUR' et 'SEUIL_DE_MASQUAGE_SUPERIEUR'. */ #define GRAINE \ DEUX \ /* Graine initiale. */ #define FACTEUR_DES_NIVEAUX \ FU \ /* Seuil implicite de generation des points. */ #define SEUIL_DE_MASQUAGE_INFERIEUR \ GRIS \ /* Seuil de masquage en-dessous duquel les points des images 'nom_imageA' sont ignores. */ #define SEUIL_DE_MASQUAGE_SUPERIEUR \ BLANC \ /* Seuil de masquage au-dessu duquel les points des images 'nom_imageA' sont ignores. */ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* D E F I N I T I O N D E L A S E Q U E N C E A I N T E G R E R : */ /* */ /*************************************************************************************************************************************/ #include xci/sequence.01.I" #define INVERSER_L_ORDRE_DE_RECUPERATION_DES_IMAGES \ FAUX \ /* Indique s'il faut inverser l'ordre de parcours de l'ensemble des images. On a : */ \ /* */ \ /* FAUX : l'image d'arriere-plan est la premiere de la liste, */ \ /* VRAI : l'image d'arriere-plan est la derniere de la liste. */ \ /* */ #define PREMIERE_TRANCHE_VERTICALE \ Zmin \ /* Premiere tranche verticale, */ #define DERNIERE_TRANCHE_VERTICALE \ Zmax \ /* Derniere tranche verticale. */ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* A C C E S A U X I M A G E S : */ /* */ /*************************************************************************************************************************************/ #define EDITER_LES_MESSAGES_D_ERREUR \ EDITER_LES_MESSAGES_D_ERREUR_DES_FICHIERS \ /* Indique si les messages d'erreur des fichiers doivent etre emis ('VRAI') ou pas ('FAUX'), */ \ /* ce qui peut etre tres utile lorsque l'on considere que les images non existantes ne sont */ \ /* pas encore produites et qu'il faut donc les attendre... */ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* N U M E R O T A G E D E S I M A G E S : */ /* */ /*************************************************************************************************************************************/ #define NUMERO_D_IMAGE(numero_d_image) \ COND(IL_NE_FAUT_PAS(inverser_l_ordre_de_recuperation_des_images) \ ,numero_d_image \ ,SOUS(derniere_image,SOUS(numero_d_image,premiere_image)) \ ) \ /* Fonction de calcul du numero de l'image courante... */ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* I N T E G R A T I O N T R I D I M E N S I O N N E L L E D ' U N E S U I T E D ' I M A G E S : */ /* */ /*************************************************************************************************************************************/ BCommande(nombre_d_arguments,arguments) /*-----------------------------------------------------------------------------------------------------------------------------------*/ Bblock DEFV(CHAR,INIC(POINTERc(nom_imageA),NOM_PIPE)); /* Nom de la sequence a integrer. */ DEFV(CHAR,INIC(POINTERc(nom_postfixe),NOM_UNDEF_VIDE)); /* Nom d'un eventuel postfixe a placer derriere <nom_imageA><numero> (par exemple '$ROUGE'). */ DEFV(Int,INIT(premiere_image,PREMIERE_IMAGE)); /* Numero de la premiere image, */ DEFV(Int,INIT(derniere_image,DERNIERE_IMAGE)); /* Numero de la derniere image ('derniere_image' n'est necessaire qu'a cause de la */ /* 'NUMERO_D_IMAGE(...)' qui permet d'inverser l'ordre des images...). */ DEFV(Logical,INIT(inverser_l_ordre_de_recuperation_des_images,INVERSER_L_ORDRE_DE_RECUPERATION_DES_IMAGES)); /* Indique s'il faut inverser l'ordre de parcours de l'ensemble des images. On a : */ /* */ /* FAUX : l'image d'arriere-plan est la premiere de la liste, */ /* VRAI : l'image d'arriere-plan est la derniere de la liste. */ /* */ DEFV(Int,INIT(numero_d_image,UNDEF)); /* Numero de l'image courante. */ DEFV(Int,INIT(pas_des_images,PAS_DES_IMAGES)); /* Pas de passage d'un numero d'image a une autre. */ DEFV(CHAR,INIT(POINTERc(nom_image),NOM_UNDEF)); /* Nom courant des images. */ DEFV(Logical,INIT(le_seuillage_est_aleatoire,LE_SEUILLAGE_EST_ALEATOIRE)); /* Le seuillage est-il aleatoire ('VRAI') ou deterministe ('FAUX') et lie donc aux */ /* parametres 'SEUIL_DE_MASQUAGE_INFERIEUR' et 'SEUIL_DE_MASQUAGE_SUPERIEUR'. */ DEFV(Int,INIT(graine,GRAINE)); /* Graine du generateur aleatoire... */ DEFV(Float,INIT(facteur_des_niveaux,FACTEUR_DES_NIVEAUX)); /* Pour calculer le seuil de generation aleatoire a partir d'un niveau. */ DEFV(Float,INIT(borne_inferieure,PROBABILITE_NULLE)); /* Borne inferieure du generateur, */ DEFV(Float,INIT(borne_superieure,PROBABILITE_UNITE)); /* Borne superieure du generateur. */ DEFV(pointI_3D,point_courant); /* Point (entier) courant. */ DEFV(genere_p,INIT(seuil_de_masquage_inferieur,SEUIL_DE_MASQUAGE_INFERIEUR)); /* Seuil de masquage en-dessous duquel les points des images 'nom_imageA' sont ignores. */ DEFV(genere_p,INIT(seuil_de_masquage_superieur,SEUIL_DE_MASQUAGE_SUPERIEUR)); /* Seuil de masquage au-dessus duquel les points des images 'nom_imageA' sont ignores. */ /*..............................................................................................................................*/ EGAL(files_____editer_les_messages_d_erreur_de_lecture_des_fichiers,EDITER_LES_MESSAGES_D_ERREUR); /* Initialisation de l'indicateur d'edition des messages d'erreur... */ INITIALISATIONS_GENERALES; /* Initialisations generales faites au tout debut... */ SET_FACTEUR_D_ELOIGNEMENT_EN_Z_DE_L_OBSERVATEUR(POSITIONNEMENT_RELATIF_DE_L_OBSERVATEUR_SUR_L_AXE_OZ); /* A cause de 'v $xrv/champs_5.1A$I 20221022102442', 'facteur_en_Z_de_l_observateur' et */ /* 'Projection_OX_OY_____facteur_d_eloignement_en_Z_de_l_observateur' doivent imperativement */ /* avoir la meme valeur par defaut afin d'eviter le message d'erreur : */ /* */ /* le 'GET_ARGUMENTS2_F(...)' relatif a 'eloignement_Z_observateur=eZo=' */ /* gere des arguments de valeurs par defaut differentes : */ /* {"F1=+2" # "F2=+100"}. */ /* */ /* genere par 'v $xig/fonct$vv$DEF GESTION_DE_L_IMBRICATION____DES_GET_ARGUMENTSn_x' et en */ /* notant que la tabulation suivant 'GET_ARGUMENTS2_F(...) ' est normale et definie */ /* par 'v $xig/fonct$vv$DEF 20190831122149'. Ceci a donc ete mis en place sous cette forme */ /* le 20221023102625... */ #include xrv/champs_5.1A.I" GET_ARGUMENTSv(nombre_d_arguments ,BLOC(PROCESS_ARGUMENTS_GEOMETRIQUES; GET_ARGUMENT_C("imageA=""A=",nom_imageA); GET_ARGUMENT_C("postfixe=",nom_postfixe); GET_ARGUMENT_I("premiere=",premiere_image); GET_ARGUMENT_I("derniere=",derniere_image); GET_ARGUMENT_I("pas=",pas_des_images); PROCESS_ARGUMENTS_DE_VISUALISATION_PRIMAIRES; GET_ARGUMENT_L("editer=",editer_la_definition_de_l_espace_physique); GET_ARGUMENT_L("aleatoire=",le_seuillage_est_aleatoire); GET_ARGUMENT_I("graine=",graine); GET_ARGUMENT_L("affiner_rdn=",rdnIFnD_____affiner_la_generation); GET_ARGUMENT_L("iterer_rdn=",rdnIFnD_____iterer_la_generation); GET_ARGUMENT_F("facteurN=",facteur_des_niveaux); GET_ARGUMENT_P("seuilI=""seuil=""masqueI=""masque=",seuil_de_masquage_inferieur); GET_ARGUMENT_P("seuilS=""masqueS=",seuil_de_masquage_superieur); GET_ARGUMENT_L("gravite=",se_placer_au_centre_de_gravite_des_parallelepipedes); GET_ARGUMENT_L("Zauto=",facteur_du_Z_automatique); GET_ARGUMENT_F("facteurZ=",facteur_du_Z); GET_ARGUMENT_I("pas_horizontal=""pash=",pas_horizontal); GET_ARGUMENT_I("pas_vertical=""pasv=",pas_vertical); /* Arguments introduits le 20111019183632... */ PROCESS_ARGUMENTS_DE_DEFINITION_DU_RAYON_DES_SPHERES_REPRESENTATIVES; GET_ARGUMENT_F("facteurR=",facteur_du_rayon_de_visualisation); ) ); SET_ECHANTILLONNAGE(pas_horizontal,pas_vertical); /* Introduit le 20111019191151... */ #include xrv/champs_5.19.I" /* Pour eviter le message : */ /* */ /* Static function is not referenced. */ /* */ /* sur 'SYSTEME_ES9000_AIX_CC'... */ Test(IFGT(nombre_de_periodes_de_la_simulation,NOMBRE_MAXIMAL_DE_PERIODES_DE_LA_SIMULATION)) Bblock PRINT_ERREUR("la simulation demandee est trop longue"); EGAL(nombre_de_periodes_de_la_simulation,NOMBRE_MAXIMAL_DE_PERIODES_DE_LA_SIMULATION); /* Et on seuille le nombre de periodes... */ Eblock ATes Bblock Eblock ETes DEFINITION_DE_L_ESPACE_PHYSIQUE; /* Initialisation de la definition de l'espace physique apres que les dimensions des images */ /* aient ete definies... */ Test(IL_FAUT(facteur_du_Z_automatique)) Bblock EGAL(facteur_du_Z,DIVI(FLOT(MIN2(dimX,dimY)),FLOT(dimZ))); /* On choisit a priori le rapport de la plus petite des dimensions '{dimX,dimY}' a 'dimZ'... */ Eblock ATes Bblock Eblock ETes Test(IL_FAUT(editer_la_definition_de_l_espace_physique)) Bblock CAL2(Prin0("definition de l'espace physique :\n")); CAL2(Prin6("[%g,%g]x[%g,%g]x[%g,%g]\n" ,CHAMP_X(Xmin,Ymin,Zmin),CHAMP_X(Xmax,Ymax,Zmax) ,CHAMP_Y(Xmin,Ymin,Zmin),CHAMP_Y(Xmax,Ymax,Zmax) ,CHAMP_Z(Xmin,Ymin,Zmin),CHAMP_Z(Xmax,Ymax,Zmax) ) ); CAL2(Prin0("\n")); Eblock ATes Bblock Eblock ETes Test(EST_VRAI(le_seuillage_est_aleatoire)) Bblock INITIALISATION_POINT_3D(point_courant,Xmin,Ymin,Zmin); CALS(rdnI3D(ADRESSE(point_courant),UNDEF,RDN_INIT,borne_inferieure,borne_superieure)); /* Initialisation du generateur aleatoire. */ Eblock ATes Bblock Eblock ETes begin_nouveau_block Bblock BDEFV(album,album_d_images); /* Definition de l'album d'images dans lequel ranger la sequence a visualiser... */ EGAL(numero_d_image,premiere_image); /* Numero de la premiere image a recuperer... */ PUSH_ECHANTILLONNAGE; SET_ECHANTILLONNAGE(PasX,PasY); SET_ECHANTILLONNAGE_DE_PROFONDEUR(PasZ); /* Les pas "de base" sont choisis pour l'initialisation de l'album, afin que lors du calcul */ /* de la densite par {begin_album,end_album}, on puisse definir des parallelepipedes de */ /* proportions quelconques... */ begin_fuite Bblock EGAL(nom_image ,COND(IFEQ_chaine(nom_postfixe,NOM_UNDEF_VIDE) ,chain_Aconcaten2_sauf_nom_pipe(nom_imageA ,chain_numero_modulo(NUMERO_D_IMAGE(numero_d_image),nombre_de_chiffres) ) ,chain_Aconcaten3_sauf_nom_pipe(nom_imageA ,chain_numero_modulo(NUMERO_D_IMAGE(numero_d_image),nombre_de_chiffres) ,nom_postfixe ) ) ); /* Le 20221212120947, 'chain_numero_modulo(...)' a remplace 'chain_numero(...)'... */ Test(PAS_D_ERREUR(CODE_ERROR(Iload_image(PAGE(album_d_images,Z),nom_image)))) Bblock Eblock ATes Bblock gTest__CODE_ERREUR__ERREUR07 (BLOC(Bblock PRINT_ATTENTION("la fin de flot a ete rencontree lors du chargement d'une 'image'"); Eblock ) ,BLOC(Bblock Test(IL_FAUT(files_____editer_les_messages_d_erreur_de_lecture_des_fichiers)) Bblock PRINT_ERREUR("le fichier demande n'existe pas ou n'est pas de type 'image'"); Eblock ATes Bblock Eblock ETes CALi(Inoir(PAGE(album_d_images,Z))); /* Et dans ce cas, on fait comme si une image NOIR avait ete lue. On notera que cela a ete */ /* introduit pour permettre de lire peu d'images, c'est-a-dire d'avoir : */ /* */ /* DIVI(NBRE(premiere_image,derniere_image),pas_des_images) */ /* */ /* qui soit un nombre plus petit que 'dimZ'. On aura d'ailleurs toujours interet a prendre */ /* une valeur pour 'dimZ' qui soit du meme ordre de grandeur que 'dimX' et 'dimY' (ou du */ /* moins pas trop petit devant ces dernieres), et ce afin afin d'eviter des problemes */ /* visuels lors des rotations, car, en effet, l'espace semble alors tres "plat"... */ Eblock ) ); Eblock ETes CALZ_FreCC(nom_image); INCR(numero_d_image,pas_des_images); /* Numero de l'image suivante a recuperer... */ Eblock end_fuite PULL_ECHANTILLONNAGE; Komp(numero_de_la_periode_courante_de_la_simulation,nombre_de_periodes_de_la_simulation) Bblock PUSH_ECHANTILLONNAGE; SET_ECHANTILLONNAGE(PasX,PasY); INITIALISATIONS_RELATIVES_A_CHAQUE_NOUVELLE_IMAGE(numero_de_la_periode_courante); /* Initialisations necessaires avant le calcul et la generation de chaque nouvelle image. */ PULL_ECHANTILLONNAGE; begin_album Bblock DEFV(genere_Float,INIT(cumul_des_X_ponderes,FZERO)); DEFV(genere_Float,INIT(cumul_des_Y_ponderes,FZERO)); DEFV(genere_Float,INIT(cumul_des_Z_ponderes,FZERO)); /* Afin de calculer si besoin est la position du centre de gravite... */ DEFV(genere_Float,INIT(cumul_des_niveaux,FLOT__NOIR)); /* Afin de cumuler les niveaux a l'interieur d'un parallelepipede, */ DEFV(Int,INIT(nombre_de_niveaux_cumules,ZERO)); /* Et d'en connaitre leur nombre. */ DEFV(genere_p,INIT(densite_des_niveaux,NIVEAU_UNDEF)); /* Enfin, densite des niveaux a l'interieur d'un parallelepipede. */ Test(EST_VRAI(le_seuillage_est_aleatoire)) Bblock INITIALISATION_POINT_3D(point_courant,X,Y,Z); Eblock ATes Bblock Eblock ETes begin_albumQ(DoIn,EnTete_de_sauvegardM ## Z,XYZmax(EnTete_de_sauvegardM ## Z,pasZ_global),PasZ ,DoIn,EnTete_de_sauvegardM ## Y,XYZmax(EnTete_de_sauvegardM ## Y,pasY_global),PasY ,DoIn,EnTete_de_sauvegardM ## X,XYZmax(EnTete_de_sauvegardM ## X,pasX_global),PasX ) Bblock DEFV(genere_p,INIT(niveau_courant,NIVEAU_UNDEF)); /* Niveau au point courant {X,Y,Z} de l'album. */ PUSH_ECHANTILLONNAGE; SET_ECHANTILLONNAGE(PasX,PasY); SET_ECHANTILLONNAGE_DE_PROFONDEUR(PasZ); /* ATTENTION, a cause de l'acces aux points d'un album (ou d'une image), il est essentiel */ /* de revenir ici aux pas de base, car sinon, l'acces aux valeurs se fera via les fonctions */ /* 'Findice_?(...)' qui recupere alors ces valeurs aux noeuds du maillage {pasX,pasY,pasZ} */ /* et non pas au point courant {X,Y,Z}... */ /* */ /* ATTENTION, de plus ces operations sur l'ECHANTILLONNAGE ne peuvent etre faites hors de */ /* {begin_albumQ(...)',end_albumQ(...)} car, en effet, on a besoin dans ces deux directives */ /* des pas effectifs {pasX,pasY,pasZ} pour calculer la taille du parallelepipede courant... */ EGAL(niveau_courant,Aload_point_valide(album_d_images,X,Y,Z)); /* Niveau au point courant {X,Y,Z} de l'album. */ PULL_ECHANTILLONNAGE; Test(IL_FAUT(se_placer_au_centre_de_gravite_des_parallelepipedes)) Bblock INCR(cumul_des_X_ponderes,MUL2(FLOT(NIVR(niveau_courant)),FLOT(COXR(X)))); INCR(cumul_des_Y_ponderes,MUL2(FLOT(NIVR(niveau_courant)),FLOT(COYR(Y)))); INCR(cumul_des_Z_ponderes,MUL2(FLOT(NIVR(niveau_courant)),FLOT(COZR(Z)))); /* Cumul des niveaux ponderes a l'interieur du parallelepipede courant... */ Eblock ATes Bblock Eblock ETes INCR(cumul_des_niveaux,FLOT(NIVR(niveau_courant))); INCR(nombre_de_niveaux_cumules,I); /* Cumul des niveaux a l'interieur du parallelepipede courant... */ Eblock end_albumQ(EDoI,EDoI,EDoI) Test(IZNE(nombre_de_niveaux_cumules)) Bblock EGAL(densite_des_niveaux,GENP(NIVA(DIVI(cumul_des_niveaux,FLOT(nombre_de_niveaux_cumules))))); /* Cumul des niveaux a l'interieur du parallelepipede courant... */ Eblock ATes Bblock PRINT_ERREUR("le cumul des niveaux dans le parallelepipede courant est mauvais"); EGAL(densite_des_niveaux,NIVEAU_UNDEF); Eblock ETes Test(IFOU(IFET(EST_VRAI(le_seuillage_est_aleatoire) ,IFLE(rdnI3D(ADRESSE(point_courant) ,graine ,RDN_GENERE ,FLOT__ARGUMENT_ABSENT,FLOT__ARGUMENT_ABSENT ) ,MUL2(facteur_des_niveaux,______NORMALISE_NIVEAU(densite_des_niveaux)) ) ) ,IFET(EST_FAUX(le_seuillage_est_aleatoire) ,IFINff(densite_des_niveaux,seuil_de_masquage_inferieur,seuil_de_masquage_superieur) ) ) ) Bblock Test(IL_FAUT(se_placer_au_centre_de_gravite_des_parallelepipedes)) Bblock Test(IZNE(cumul_des_niveaux)) Bblock CALi(memorisation_1_point_17(INTE(DIVI(cumul_des_X_ponderes,cumul_des_niveaux)) ,INTE(DIVI(cumul_des_Y_ponderes,cumul_des_niveaux)) ,INTE(DIVI(cumul_des_Z_ponderes,cumul_des_niveaux)) ,densite_des_niveaux ,______NORMALISE_NIVEAU(Aload_point_valide(album_d_images ,SUCX(X) ,NEUT(Y) ,NEUT(Z) ) ) ,______NORMALISE_NIVEAU(Aload_point_valide(album_d_images ,NEUT(X) ,SUCY(Y) ,NEUT(Z) ) ) ,______NORMALISE_NIVEAU(Aload_point_valide(album_d_images ,NEUT(X) ,NEUT(Y) ,SUCZ(Z) ) ) ) ); /* Memorisation du centre de gravite du parallelepipede courant, le coloriage etant lie */ /* a un pseudo-gradient selon les trois axes 'OX', 'OY' et 'OZ' ; il ne s'agit pas d'un */ /* vrai gradient, car sinon, il faudrait systematiquement retrancher ci-dessus, pour les */ /* trois composantes, une quantite 'Aload_point_valide(album_d_images,X,Y,Z)' ; or ceci */ /* n'est pas possible car il n'y a pas possibilite de renormaliser les niveaux grace a */ /* 'renormaliser_arbitrairement_les_differentielles' qui n'est pas defini ici... */ Eblock ATes Bblock /* Lorsque le cumul des niveaux est nul, on ne trace pas (cela signifie que le volume du */ /* parallelepipede courant est vide...). */ Eblock ETes Eblock ATes Bblock CALi(memorisation_1_point_17(X ,Y ,Z ,densite_des_niveaux ,______________BLANC_NORMALISE ,______________BLANC_NORMALISE ,______________BLANC_NORMALISE ) ); /* Memorisation du sommet {X,Y,Z} du parallelepipede courant... */ Eblock ETes Eblock ATes Bblock Eblock ETes Eblock end_album PUSH_ECHANTILLONNAGE; SET_ECHANTILLONNAGE(PasX,PasY); CALCUL_DU_PSEUDO_CENTRE_DE_GRAVITE_ET_TRI_D_UNE_LISTE_DE_POINTS; /* Tri eventuel de la liste des points par 'Z' croissants, avec retour prealable sur le */ /* dernier point memorise dans la liste... */ VISUALISATION_D_UNE_LISTE_DE_POINTS(numero_de_la_periode_courante); /* Visualisation de la liste des points (eventuellement triees). */ GENERATION_DE_L_EVENTUEL_EFFET_DE_BRUME; /* Generation de l'eventuel effet de brume... */ PULL_ECHANTILLONNAGE; GENERATION_D_UNE_IMAGE(numero_de_la_periode_courante); /* Memorisation de l'image courante. */ INCR(numero_de_la_periode_courante,I); /* Et passage a l'image suivante... */ Eblock EKom EDEFV(album,album_d_images); /* Definition de l'album d'images dans lequel ranger la sequence a visualiser... */ Eblock end_nouveau_block RETU_Commande; Eblock ECommande