/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        T R A N S F O R M A T I O N   D E   T R O I S   F I C H I E R S   N U M E R I Q U E S                                      */
/*        A   L ' A I D E   D E   " I T E R A T E D   F U N C T I O N   S E T " S  :                                                 */
/*                                                                                                                                   */
/*                                                                                                                                   */
/*        Definition :                                                                                                               */
/*                                                                                                                                   */
/*                    Pour chaque point {X,Y,Z} d'une liste, on                                                                      */
/*                  iterera N fois la transformation lineaire                                                                        */
/*                  suivante :                                                                                                       */
/*                                                                                                                                   */
/*                                      /   \     /   \                                                                              */
/*                                      | X |     | X |                                                                              */
/*                                      |   |     |   |                                                                              */
/*                                      | Y | = M.| Y | + T                                                                          */
/*                                      |   |     |   |                                                                              */
/*                                      | Z |     | Z |                                                                              */
/*                                      \   /     \   /                                                                              */
/*                                                                                                                                   */
/*                  ou la matrice 'M' et le vecteur colonne 'T'                                                                      */
/*                  (dit "de translation") sont choisis de facon                                                                     */
/*                  aleatoire parmi un ensemble de couples {M(i),T(i)}.                                                              */
/*                  A chacun de ces couples est donc associee une                                                                    */
/*                  probabilite 'P(i)'.                                                                                              */
/*                                                                                                                                   */
/*                                                                                                                                   */
/*        Author of '$xrv/IFS.01$K' :                                                                                                */
/*                                                                                                                                   */
/*                    Jean-Francois COLONNA (LACTAMME, 20050610141954).                                                              */
/*                                                                                                                                   */
/*************************************************************************************************************************************/

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

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        F I C H I E R S   D ' I N C L U D E S  :                                                                                   */
/*                                                                                                                                   */
/*************************************************************************************************************************************/
#include  INCLUDES_BASE

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        V A L E U R S   I M P L I C I T E S   D E S   P A R A M E T R E S  :                                                       */
/*                                                                                                                                   */
/*************************************************************************************************************************************/
#define   NOMBRE_D_ITERATIONS                                                                                                           \
                    UN                                                                                                                  \
                                        /* Nombre d'iterations...                                                                    */
#define   N_EDITER_QUE_LA_DERNIERE_ITERATION                                                                                            \
                    VRAI                                                                                                                \
                                        /* Faut-il n'editer que la derniere iteration ('VRAI') ou bien toutes les iterations         */ \
                                        /* ('FAUX') ? Cet argument a ete introduit le 20050612162159...                              */
#define   EDITER_LE_NUMERO_TRANSFORMATION_COURANTE                                                                                      \
                    FAUX                                                                                                                \
                                        /* Si 'IL_NE_FAUT_PAS(n_editer_que_la_derniere_iteration)', faut-il editer la valeur         */ \
                                        /* calculee ('FAUX') ou bien le numero de la transformation courante qui a permis son        */ \
                                        /* calcul ('VRAI') ? Cet argument a ete introduit le 20050612162159...                       */

#define   GRAINE                                                                                                                        \
                    PARE(1789)                                                                                                          \
                                        /* Definition du generateur aleatoire...                                                     */

#define   PONDERATION_OX_IMPLICITE                                                                                                      \
                    FZERO
#define   PONDERATION_OY_IMPLICITE                                                                                                      \
                    FZERO
#define   PONDERATION_OZ_IMPLICITE                                                                                                      \
                    FZERO
                                        /* Ponderation de selection des coordonnees apres transformation.                            */

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        D E F I N I T I O N   D E S   " I T E R A T E D   F U N C T I O N   S E T " S  :                                           */
/*                                                                                                                                   */
/*************************************************************************************************************************************/
#define   NOMBRE_MAXIMAL_DE_PERIODES_DE_LA_SIMULATION                                                                                   \
                    MILLE                                                                                                               \
                                        /* Definition du nombre d'elements de chacun des treize vecteurs suivants...                 */ \
                                        /*                                                                                           */ \
                                        /* ATTENTION : evidemment 'NOMBRE_MAXIMAL_DE_PERIODES_DE_LA_SIMULATION' est en fait le       */ \
                                        /* nombre maximal de transformations {M(i),T(i)} qui peuvent etre utilisees, et non pas un   */ \
                                        /* nombre maximal de periodes qui n'a pas de sens ici...                                     */
#include  xrv/champs_5.41.I"
#include  xrq/particle.M2.I"
#include  xrq/nucleon.L3.I"
#include  xrq/nucleon.Lf.2.I"

dfTRANSFORMAT_31(liste_ELEMENT_M11,fichier_ELEMENT_M11,ELEMENT_M11_IMPLICITE,FU)
dfTRANSFORMAT_31(liste_ELEMENT_M12,fichier_ELEMENT_M12,ELEMENT_M12_IMPLICITE,FZERO)
dfTRANSFORMAT_31(liste_ELEMENT_M13,fichier_ELEMENT_M13,ELEMENT_M13_IMPLICITE,FZERO)

dfTRANSFORMAT_31(liste_ELEMENT_M21,fichier_ELEMENT_M21,ELEMENT_M21_IMPLICITE,FZERO)
dfTRANSFORMAT_31(liste_ELEMENT_M22,fichier_ELEMENT_M22,ELEMENT_M22_IMPLICITE,FU)
dfTRANSFORMAT_31(liste_ELEMENT_M23,fichier_ELEMENT_M23,ELEMENT_M23_IMPLICITE,FZERO)

dfTRANSFORMAT_31(liste_ELEMENT_M31,fichier_ELEMENT_M31,ELEMENT_M31_IMPLICITE,FZERO)
dfTRANSFORMAT_31(liste_ELEMENT_M32,fichier_ELEMENT_M32,ELEMENT_M32_IMPLICITE,FZERO)
dfTRANSFORMAT_31(liste_ELEMENT_M33,fichier_ELEMENT_M33,ELEMENT_M33_IMPLICITE,FU)
                                        /* Definition des matrices 'M(i)'.                                                           */

dfTRANSFORMAT_31(liste_TRANSLATION_OX,fichier_TRANSLATION_OX,TRANSLATION_OX_IMPLICITE,FZERO)
dfTRANSFORMAT_31(liste_TRANSLATION_OY,fichier_TRANSLATION_OY,TRANSLATION_OY_IMPLICITE,FZERO)
dfTRANSFORMAT_31(liste_TRANSLATION_OZ,fichier_TRANSLATION_OZ,TRANSLATION_OZ_IMPLICITE,FZERO)
                                        /* Definition des trois translations 'T(i)'.                                                 */

dfTRANSFORMAT_31(liste_PROBABILITE,fichier_PROBABILITE,PROBABILITE_IMPLICITE,FU)
                                        /* Definition des probabilites de selection d'un couple {M(i),T(i)}.                         */

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        D E F I N I T I O N   D E S   T R O I S   F I C H I E R S  :                                                               */
/*                                                                                                                                   */
/*************************************************************************************************************************************/
#include  xrv/ARITHMET.1d.I"
                                        /* Passage a l'allocation dynamique le 20060214174631...                                     */
#include  xrv/ARITHMET.21.I"
#include  xrv/champs_5.14.I"

#define   X_IMPLICITE                                                                                                                   \
                    FZERO
#define   Y_IMPLICITE                                                                                                                   \
                    FZERO
#define   Z_IMPLICITE                                                                                                                   \
                    FZERO

gGENERATION_D_UN_FICHIER(fichier_LISTE_X,liste_initiale_des_X);
gGENERATION_D_UN_FICHIER(fichier_LISTE_Y,liste_initiale_des_Y);
gGENERATION_D_UN_FICHIER(fichier_LISTE_Z,liste_initiale_des_Z);
                                        /* Definition en memoire des fichiers de coordonnees.                                        */

#define   ELEMENT_DU_FICHIER_LISTE_X(index)                                                                                             \
                    gELEMENT_DU_FICHIER(liste_initiale_des_X,index)
#define   ELEMENT_DU_FICHIER_LISTE_Y(index)                                                                                             \
                    gELEMENT_DU_FICHIER(liste_initiale_des_Y,index)
#define   ELEMENT_DU_FICHIER_LISTE_Z(index)                                                                                             \
                    gELEMENT_DU_FICHIER(liste_initiale_des_Z,index)
                                        /* Acces a un element courant des fichiers de coordonnees.                                   */

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        D E F I N I T I O N   D E   L A   V A L E U R   A   E D I T E R  :                                                         */
/*                                                                                                                                   */
/*************************************************************************************************************************************/
#define   VALEUR_A_EDITER                                                                                                               \
                    LIZ3(ponderation_OX,Xf                                                                                              \
                        ,ponderation_OY,Yf                                                                                              \
                        ,ponderation_OZ,Zf                                                                                              \
                         )                                                                                                              \
                                        /* Valeur a editer...                                                                        */

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        T R A N S F O R M A T I O N   D E   T R O I S   F I C H I E R S   N U M E R I Q U E S                                      */
/*        A   L ' A I D E   D E   " I T E R A T E D   F U N C T I O N   S E T " S  :                                                 */
/*                                                                                                                                   */
/*************************************************************************************************************************************/
BCommande(nombre_d_arguments,arguments)
/*-----------------------------------------------------------------------------------------------------------------------------------*/
     Bblock
#include  xrv/ARITHMET.22.I"
#include  xci/valeurs.03.I"

     DEFV(Int,INIT(nombre_d_iterations,NOMBRE_D_ITERATIONS));
                                        /* Nombre  d'iterations...                                                                   */
     DEFV(Logical,INIT(n_editer_que_la_derniere_iteration,N_EDITER_QUE_LA_DERNIERE_ITERATION));
                                        /* Faut-il n'editer que la derniere iteration ('VRAI') ou bien toutes les iterations         */
                                        /* ('FAUX') ? Cet argument a ete introduit le 20050612162159...                              */
     DEFV(Logical,INIT(editer_le_numero_transformation_courante,EDITER_LE_NUMERO_TRANSFORMATION_COURANTE));
                                        /* Si 'IL_NE_FAUT_PAS(n_editer_que_la_derniere_iteration)', faut-il editer la valeur         */
                                        /* calculee ('FAUX') ou bien le numero de la transformation courante qui a permis son        */
                                        /* calcul ('VRAI') ? Cet argument a ete introduit le 20050612162159...                       */

     DEFV(Int,INIT(graine,GRAINE));
                                        /* Definition du generateur aleatoire...                                                     */

     DEFV(pointI_3D,point_courant_de_l_espace_de_parametrage);
                                        /* Point courant d'un espace abstrait servant a parametrer le generateur d'evenements.       */
     SPIRALE_DEFINITION_GENERALE(SPIRALE_DELTA_HORIZONTAL_GLOBAL,SPIRALE_DELTA_VERTICAL_GLOBAL)
                                        /* Donnees de generation d'une spirale de parcours d'un espace abstrait bidimensionnel       */
                                        /* de parametrage de la generation des evenements.                                           */

     DEFV(Float,INIT(ponderation_OX,PONDERATION_OX_IMPLICITE));
     DEFV(Float,INIT(ponderation_OY,PONDERATION_OY_IMPLICITE));
     DEFV(Float,INIT(ponderation_OZ,PONDERATION_OZ_IMPLICITE));
                                        /* Ponderation de selection des coordonnees apres transformation.                            */
     /*..............................................................................................................................*/
#include  xrv/champs_5.1A.I"
                                        /* Ceci fut introduit le 20070103171443...                                                   */

     iTRANSFORMAT_31(liste_ELEMENT_M11,ELEMENT_M11_IMPLICITE);
     iTRANSFORMAT_31(liste_ELEMENT_M12,ELEMENT_M12_IMPLICITE);
     iTRANSFORMAT_31(liste_ELEMENT_M13,ELEMENT_M13_IMPLICITE);

     iTRANSFORMAT_31(liste_ELEMENT_M21,ELEMENT_M21_IMPLICITE);
     iTRANSFORMAT_31(liste_ELEMENT_M22,ELEMENT_M22_IMPLICITE);
     iTRANSFORMAT_31(liste_ELEMENT_M23,ELEMENT_M23_IMPLICITE);

     iTRANSFORMAT_31(liste_ELEMENT_M31,ELEMENT_M31_IMPLICITE);
     iTRANSFORMAT_31(liste_ELEMENT_M32,ELEMENT_M32_IMPLICITE);
     iTRANSFORMAT_31(liste_ELEMENT_M33,ELEMENT_M33_IMPLICITE);
                                        /* Initialisation des matrices 'M(i)'.                                                       */

     iTRANSFORMAT_31(liste_TRANSLATION_OX,TRANSLATION_OX_IMPLICITE);
     iTRANSFORMAT_31(liste_TRANSLATION_OY,TRANSLATION_OY_IMPLICITE);
     iTRANSFORMAT_31(liste_TRANSLATION_OZ,TRANSLATION_OZ_IMPLICITE);
                                        /* Initialisation des trois translations 'T(i)'.                                             */

     iTRANSFORMAT_31(liste_PROBABILITE,PROBABILITE_IMPLICITE);
                                        /* Initialisation des probabilites de selection d'un couple {M(i),T(i)}.                     */

     INITIALISATION_TRANSFORMATION;
                                        /* Mise en place de la transformation neutre...                                              */

     GET_ARGUMENTS_(nombre_d_arguments
                   ,BLOC(PROCESS_ARGUMENT_I("nombre_elements=""ne=",nombre_d_elements
                                           ,BLOC(VIDE;)
                                           ,BLOC(Bblock
                                                 PRINT_AVERTISSEMENT("'ne=' doit etre defini avant toute entree de fichiers");
                                                 Eblock
                                                 )
                                            );

                         PROCESS_ARGUMENTS_DE_DEFINITION_DES_FICHIERS_01;

                         PROKESF_ARGUMENT_FICHIER("LISTE_X="
                                                 ,fichier_LISTE_X
                                                 ,liste_initiale_des_X
                                                 ,X_IMPLICITE
                                                 ,lTRANSFORMAT_0d
                                                 ,iGENERATION_D_UN_FICHIER
                                                  );
                         PROKESF_ARGUMENT_FICHIER("LISTE_Y="
                                                 ,fichier_LISTE_Y
                                                 ,liste_initiale_des_Y
                                                 ,Y_IMPLICITE
                                                 ,lTRANSFORMAT_0d
                                                 ,iGENERATION_D_UN_FICHIER
                                                  );
                         PROKESF_ARGUMENT_FICHIER("LISTE_Z="
                                                 ,fichier_LISTE_Z
                                                 ,liste_initiale_des_Z
                                                 ,Z_IMPLICITE
                                                 ,lTRANSFORMAT_0d
                                                 ,iGENERATION_D_UN_FICHIER
                                                  );

                         PROCESS_ARGUMENT_I("nt=",nombre_de_periodes_de_la_simulation
                                        /* ATTENTION : evidemment 'nombre_de_periodes_de_la_simulation' est en fait le nombre de     */
                                        /* transformations {M(i),T(i)} qui vont etre utilisees, et non pas un nombre de periodes     */
                                        /* qui n'a pas de sens ici...                                                                */
                                           ,BLOC(VIDE;)
                                           ,BLOC(
                                                 Bblock
                                                 PRINT_AVERTISSEMENT("'nt=' doit etre defini avant tout fichier");

                                                 Test(IFGT(nombre_de_periodes_de_la_simulation
                                                          ,NOMBRE_MAXIMAL_DE_PERIODES_DE_LA_SIMULATION
                                                           )
                                                      )
                                                      Bblock
                                                      PRINT_ERREUR("trop de transformations sont demandees");
                                                      PRINT_ERREUR("elles vont donc etre limitees");
                                                      CAL1(Prer1("le nombre de transformations demande etait de %d, "
                                                                ,nombre_de_periodes_de_la_simulation
                                                                 )
                                                           );
                                                      CAL1(Prer1("le maximum etant de %d\n"
                                                                ,NOMBRE_MAXIMAL_DE_PERIODES_DE_LA_SIMULATION
                                                                 )
                                                           );

                                                      EGAL(nombre_de_periodes_de_la_simulation
                                                          ,NOMBRE_MAXIMAL_DE_PERIODES_DE_LA_SIMULATION
                                                           );
                                        /* Et on seuille le nombre de transformations...                                             */
                                                      Eblock
                                                 ATes
                                                      Bblock
                                                      Eblock
                                                 ETes
                                                 Eblock
                                                 )
                                            );

                         PROCESS_ARGUMENT_FICHIER("ELEMENT_M11="
                                                 ,fichier_ELEMENT_M11
                                                 ,liste_ELEMENT_M11
                                                 ,ELEMENT_M11_IMPLICITE
                                                 ,gTRANSFORMAT_31
                                                  );
                         PROCESS_ARGUMENT_FICHIER("ELEMENT_M12="
                                                 ,fichier_ELEMENT_M12
                                                 ,liste_ELEMENT_M12
                                                 ,ELEMENT_M12_IMPLICITE
                                                 ,gTRANSFORMAT_31
                                                  );
                         PROCESS_ARGUMENT_FICHIER("ELEMENT_M13="
                                                 ,fichier_ELEMENT_M13
                                                 ,liste_ELEMENT_M13
                                                 ,ELEMENT_M13_IMPLICITE
                                                 ,gTRANSFORMAT_31
                                                  );

                         PROCESS_ARGUMENT_FICHIER("ELEMENT_M21="
                                                 ,fichier_ELEMENT_M21
                                                 ,liste_ELEMENT_M21
                                                 ,ELEMENT_M21_IMPLICITE
                                                 ,gTRANSFORMAT_31
                                                  );
                         PROCESS_ARGUMENT_FICHIER("ELEMENT_M22="
                                                 ,fichier_ELEMENT_M22
                                                 ,liste_ELEMENT_M22
                                                 ,ELEMENT_M22_IMPLICITE
                                                 ,gTRANSFORMAT_31
                                                  );
                         PROCESS_ARGUMENT_FICHIER("ELEMENT_M23="
                                                 ,fichier_ELEMENT_M23
                                                 ,liste_ELEMENT_M23
                                                 ,ELEMENT_M23_IMPLICITE
                                                 ,gTRANSFORMAT_31
                                                  );

                         PROCESS_ARGUMENT_FICHIER("ELEMENT_M31="
                                                 ,fichier_ELEMENT_M31
                                                 ,liste_ELEMENT_M31
                                                 ,ELEMENT_M31_IMPLICITE
                                                 ,gTRANSFORMAT_31
                                                  );
                         PROCESS_ARGUMENT_FICHIER("ELEMENT_M32="
                                                 ,fichier_ELEMENT_M32
                                                 ,liste_ELEMENT_M32
                                                 ,ELEMENT_M32_IMPLICITE
                                                 ,gTRANSFORMAT_31
                                                  );
                         PROCESS_ARGUMENT_FICHIER("ELEMENT_M33="
                                                 ,fichier_ELEMENT_M33
                                                 ,liste_ELEMENT_M33
                                                 ,ELEMENT_M33_IMPLICITE
                                                 ,gTRANSFORMAT_31
                                                  );

                         PROCESS_ARGUMENT_FICHIER("TRANSLATION_OX="
                                                 ,fichier_TRANSLATION_OX
                                                 ,liste_TRANSLATION_OX
                                                 ,TRANSLATION_OX_IMPLICITE
                                                 ,gTRANSFORMAT_31
                                                  );
                         PROCESS_ARGUMENT_FICHIER("TRANSLATION_OY="
                                                 ,fichier_TRANSLATION_OY
                                                 ,liste_TRANSLATION_OY
                                                 ,TRANSLATION_OY_IMPLICITE
                                                 ,gTRANSFORMAT_31
                                                  );
                         PROCESS_ARGUMENT_FICHIER("TRANSLATION_OZ="
                                                 ,fichier_TRANSLATION_OZ
                                                 ,liste_TRANSLATION_OZ
                                                 ,TRANSLATION_OZ_IMPLICITE
                                                 ,gTRANSFORMAT_31
                                                  );

                         PROCESS_ARGUMENT_FICHIER("PROBABILITE="
                                                 ,fichier_PROBABILITE
                                                 ,liste_PROBABILITE
                                                 ,PROBABILITE_IMPLICITE
                                                 ,gTRANSFORMAT_31
                                                  );

                         GET_ARGUMENT_I("iterations=",nombre_d_iterations);
                         GET_ARGUMENT_L("derniere=",n_editer_que_la_derniere_iteration);
                         GET_ARGUMENT_N("toutes=",n_editer_que_la_derniere_iteration);
                         GET_ARGUMENT_L("numero=",editer_le_numero_transformation_courante);
                         GET_ARGUMENT_N("valeur=",editer_le_numero_transformation_courante);

                         GET_ARGUMENT_I("graine=""g=",graine);
                         GET_ARGUMENT_L("affiner_rdn=",rdnIFnD_____affiner_la_generation);
                         GET_ARGUMENT_L("iterer_rdn=",rdnIFnD_____iterer_la_generation);

                         GET_ARGUMENT_F("px=""pX=""Pond1=",ponderation_OX);
                                        /* A ne pas confondre avec 'v $xig/fonct$vv$DEF ENTREE_ARGUMENT_pasX'...                     */
                         GET_ARGUMENT_F("py=""pY=""Pond2=",ponderation_OY);
                                        /* A ne pas confondre avec 'v $xig/fonct$vv$DEF ENTREE_ARGUMENT_pasY'...                     */
                         GET_ARGUMENT_F("pz=""pZ=""Pond3=",ponderation_OZ);
                                        /* A ne pas confondre avec 'v $xig/fonct$vv$DEF ENTREE_ARGUMENT_pasZ'...                     */

                         PROCESS_ARGUMENTS_DE_PARAMETRAGE_DE_LA_GENERATION_DE_SUITE_DE_VALEURS_3;
                                        /* Cette procedure fut introduite le 20070103171443...                                       */

                         PROCESS_ARGUMENTS_DE_PARAMETRAGE_DE_LA_GENERATION_DE_SUITE_DE_VALEURS_1;
                                        /* Cette procedure fut introduite le 20061226193534...                                       */

                         PROCESS_ARGUMENTS_DE_PARAMETRAGE_DE_LA_GENERATION_DE_SUITE_DE_VALEURS_5;
                                        /* Cette procedure fut introduite le 20211005104350...                                       */
                         )
                    );

     SPIRALE_VALIDATION;
                                        /* Validation des pas de parcours (pasX,pasY) de l'espace abstrait de parametrage du         */
                                        /* generateur d'evenements.                                                                  */
     INITIALISATION_POINT_3D(point_courant_de_l_espace_de_parametrage,Xmin,Ymin,Zmin);
                                        /* Initialisation de l'espace de parametrage independante du format de l'image, puisque le   */
                                        /* point 'min' n'en depend pas...                                                            */

     gOPERATION_SUR_LES_FICHIERS(BLOC(
                                      DEFV(Float,INIT(Xf,ELEMENT_DU_FICHIER_LISTE_X(index)));
                                      DEFV(Float,INIT(Yf,ELEMENT_DU_FICHIER_LISTE_Y(index)));
                                      DEFV(Float,INIT(Zf,ELEMENT_DU_FICHIER_LISTE_Z(index)));
                                        /* Recuperation des coordonnees {X,Y,Z} courantes dans les fichiers.                         */

                                      Test(IL_FAUT(n_editer_que_la_derniere_iteration))
                                           Bblock
                                           Eblock
                                      ATes
                                           Bblock
                                           Test(IL_FAUT(editer_le_numero_transformation_courante))
                                                Bblock
                                                Eblock
                                           ATes
                                                Bblock
                                                EDITION_DANS_gOPERATION_SUR_LES_FICHIERS_AVEC_SAUT_DE_LIGNE(VALEUR_A_EDITER);
                                        /* Edition des coordonnees {X,Y,Z} avant iteration...                                        */
                                        /*                                                                                           */
                                        /* Introduit sous cette forme le 20160804094346...                                           */
                                                Eblock
                                           ETes
                                           Eblock
                                      ETes

                                      Test(IZGT(nombre_de_periodes_de_la_simulation))
                                           Bblock
                                           Repe(nombre_d_iterations)
                                                Bblock
                                                DEFV(Int,INIT(numero_transformation_courante
                                                             ,NUMERO_DE_LA_PREMIERE_PERIODE_DE_LA_SIMULATION
                                                              )
                                                     );
                                        /* Numero de la transformation courante...                                                   */
                                                DEFV(Logical,INIT(chercher_une_transformation,VRAI));
                                        /* Il faut rechercher au moins une transformation...                                         */

                                                DEFV(Float,INIT(borne_inferieure,COORDONNEE_BARYCENTRIQUE_MINIMALE));
                                                DEFV(Float,INIT(borne_superieure,COORDONNEE_BARYCENTRIQUE_MAXIMALE));
                                        /* Definition des bornes {inf,sup} du generateur aleatoire...                                */
                                                DEFV(Float,INIT(valeur_aleatoire,FLOT__UNDEF));
                                        /* Valeur aleatoire courante...                                                              */
                                                DEFV(Float,INIT(cumul_des_probabilites,FZERO));
                                        /* Cumul des probabilites des differentes transformations...                                 */

                                                DEFV(Float,INIT(translation_OX,FZERO));
                                                DEFV(Float,INIT(translation_OY,FZERO));
                                                DEFV(Float,INIT(translation_OZ,FZERO));
                                        /* Definition des trois translations. On notera l'initialisation avec 'FZERO' et non pas     */
                                        /* 'FLOT__UNDEF' pour le cas ou aucune transformation ne serait selectionnee...              */

                                                DEFV(Float,INIT(Xf_transforme,FLOT__UNDEF));
                                                DEFV(Float,INIT(Yf_transforme,FLOT__UNDEF));
                                                DEFV(Float,INIT(Zf_transforme,FLOT__UNDEF));
                                        /* Valeurs transformees par la transformation courante des coordonnees {X,Y,Z} courantes...  */

                                                Tant(IL_FAUT(chercher_une_transformation))
                                                     Bblock
                                                     EGAL(valeur_aleatoire
                                                         ,rdnI3D(ADRESSE(point_courant_de_l_espace_de_parametrage)
                                                                ,graine
                                                                ,RDN_INIT_AND_GENERE
                                                                ,borne_inferieure,borne_superieure
                                                                 )
                                                          );
                                        /* Generation d'une valeur aleatoire dans [borne_inferieure,borne_superieure] et parametree  */
                                        /* par le point courant de l'espace de parametrage.                                          */

                                                     SPIRALE_INITIALISATION;
                                        /* Initialisation dynamique de 'spirale_nombre_de_points_a_traiter'.                         */
                                                     SPIRALE_DEPLACEMENT(ASD1(point_courant_de_l_espace_de_parametrage,x)
                                                                        ,ASD1(point_courant_de_l_espace_de_parametrage,y)
                                                                         );
                                        /* Deplacement du point courant de la spirale de l'espace de parametrage.                    */
                                                     SPIRALE_PARCOURS;
                                        /* Parcours de la spirale avec rotation eventuelle de PI/2 du bras courant...                */

                                                     INCR(cumul_des_probabilites
                                                         ,sTRANSFORMAT_31(numero_transformation_courante,liste_PROBABILITE)
                                                          );

                                                     Test(IFLE(valeur_aleatoire,cumul_des_probabilites))
                                                          Bblock
                                                          EGAL(ASD2(vecteurs_____matrix_3D,cx,cx)
                                                              ,sTRANSFORMAT_31(numero_transformation_courante,liste_ELEMENT_M11)
                                                               );
                                                          EGAL(ASD2(vecteurs_____matrix_3D,cx,cy)
                                                              ,sTRANSFORMAT_31(numero_transformation_courante,liste_ELEMENT_M12)
                                                               );
                                                          EGAL(ASD2(vecteurs_____matrix_3D,cx,cz)
                                                              ,sTRANSFORMAT_31(numero_transformation_courante,liste_ELEMENT_M13)
                                                               );

                                                          EGAL(ASD2(vecteurs_____matrix_3D,cy,cx)
                                                              ,sTRANSFORMAT_31(numero_transformation_courante,liste_ELEMENT_M21)
                                                               );
                                                          EGAL(ASD2(vecteurs_____matrix_3D,cy,cy)
                                                              ,sTRANSFORMAT_31(numero_transformation_courante,liste_ELEMENT_M22)
                                                               );
                                                          EGAL(ASD2(vecteurs_____matrix_3D,cy,cz)
                                                              ,sTRANSFORMAT_31(numero_transformation_courante,liste_ELEMENT_M23)
                                                               );

                                                          EGAL(ASD2(vecteurs_____matrix_3D,cz,cx)
                                                              ,sTRANSFORMAT_31(numero_transformation_courante,liste_ELEMENT_M31)
                                                               );
                                                          EGAL(ASD2(vecteurs_____matrix_3D,cz,cy)
                                                              ,sTRANSFORMAT_31(numero_transformation_courante,liste_ELEMENT_M32)
                                                               );
                                                          EGAL(ASD2(vecteurs_____matrix_3D,cz,cz)
                                                              ,sTRANSFORMAT_31(numero_transformation_courante,liste_ELEMENT_M33)
                                                               );

                                                          EGAL(translation_OX
                                                              ,sTRANSFORMAT_31(numero_transformation_courante,liste_TRANSLATION_OX)
                                                               );
                                                          EGAL(translation_OY
                                                              ,sTRANSFORMAT_31(numero_transformation_courante,liste_TRANSLATION_OY)
                                                               );
                                                          EGAL(translation_OZ
                                                              ,sTRANSFORMAT_31(numero_transformation_courante,liste_TRANSLATION_OZ)
                                                               );

                                                          EGAL(chercher_une_transformation,FAUX);
                                        /* On arrete d'iterer puisque l'on a trouve une transformation...                            */
                                                          Eblock
                                                     ATes
                                                          Bblock
                                                          Test(IFLT(numero_transformation_courante
                                                                   ,LSTX(NUMERO_DE_LA_PREMIERE_PERIODE_DE_LA_SIMULATION
                                                                        ,nombre_de_periodes_de_la_simulation
                                                                         )
                                                                    )
                                                               )
                                        /* Je note le 20150617100948 que plutot que 'nombre_de_periodes_de_la_simulation', c'est     */
                                        /* peut-etre :                                                                               */
                                        /*                                                                                           */
                                        /*                  LSTX(NUMERO_DE_LA_PREMIERE_PERIODE_DE_LA_SIMULATION                      */
                                        /*                      ,nombre_de_periodes_de_la_simulation                                 */
                                        /*                       )                                                                   */
                                        /*                                                                                           */
                                        /* qu'il faudrait utiliser. Finalement je corrige cela le 20150617105120...                  */
                                                               Bblock
                                                               INCR(numero_transformation_courante,I);
                                        /* Passage a la transformation suivante...                                                   */
                                                               Eblock
                                                          ATes
                                                               Bblock
                                                               PRINT_ERREUR("aucune transformation n'a pu etre selectionnee");
                                        /* Ce sera en fait la derniere transformation prise en compte qui sera utilisee (ou la       */
                                        /* transformation par defaut la premier fois...).                                            */
                                                               EGAL(chercher_une_transformation,FAUX);
                                        /* Et evidemment, on arrete d'iterer...                                                      */
                                                               Eblock
                                                          ETes
                                                          Eblock
                                                     ETes
                                                     Eblock
                                                ETan

                                                Test(IFEXff(cumul_des_probabilites,borne_inferieure,borne_superieure))
                                                     Bblock
                                                     PRINT_ERREUR("le cumul des probabilites est incorrect");
                                                     CAL1(Prer1("cumul...........=%f\n",cumul_des_probabilites));
                                                     CAL1(Prer1("borne inferieure=%f\n",borne_inferieure));
                                                     CAL1(Prer1("borne superieure=%f\n",borne_superieure));
                                                     Eblock
                                                ATes
                                                     Bblock
                                                     Eblock
                                                ETes

                                                EGAL(Xf_transforme,TRANSFORMATION_GEOMETRIQUE_3D_Fx(Xf,Yf,Zf,translation_OX));
                                                EGAL(Yf_transforme,TRANSFORMATION_GEOMETRIQUE_3D_Fy(Xf,Yf,Zf,translation_OY));
                                                EGAL(Zf_transforme,TRANSFORMATION_GEOMETRIQUE_3D_Fz(Xf,Yf,Zf,translation_OZ));
                                                EGAL(Xf,Xf_transforme);
                                                EGAL(Yf,Yf_transforme);
                                                EGAL(Zf,Zf_transforme);
                                        /* Et enfin, application de la transformation...                                             */

                                                Test(IL_FAUT(n_editer_que_la_derniere_iteration))
                                                     Bblock
                                                     Eblock
                                                ATes
                                                     Bblock
                                                     Test(IL_FAUT(editer_le_numero_transformation_courante))
                                                          Bblock
                                                          CAL2(Prin1("%d",numero_transformation_courante));
                                        /* Edition du numero de la transformation selectionnee...                                    */
                                                          Eblock
                                                     ATes
                                                          Bblock
                                                          EDITION_DANS_gOPERATION_SUR_LES_FICHIERS(VALEUR_A_EDITER);
                                        /* Edition des coordonnees {X,Y,Z} apres chaque iteration...                                 */
                                                          Eblock
                                                     ETes

                                                     CAL2(Prin0("\n"));
                                                     Eblock
                                                ETes
                                                Eblock
                                           ERep
                                           Eblock
                                      ATes
                                           Bblock
                                           Eblock
                                      ETes
                                      )
                                ,VALEUR_A_EDITER
                                ,n_editer_que_la_derniere_iteration
                                ,nombre_d_exemplaires_du_resultat_de_l_operation_sur_les_valeurs_courantes
                                 );
                                        /* Transformation tridimensionnelle.                                                         */

     lGENERATION_D_UN_FICHIER(liste_initiale_des_Z,Z_IMPLICITE);
     lGENERATION_D_UN_FICHIER(liste_initiale_des_Y,Y_IMPLICITE);
     lGENERATION_D_UN_FICHIER(liste_initiale_des_X,X_IMPLICITE);

     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.