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



Copyright © Jean-François COLONNA, 2019-2024.
Copyright © CMAP (Centre de Mathématiques APpliquées) UMR CNRS 7641 / École polytechnique, Institut Polytechnique de Paris, 2019-2024.