/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        R E F L E X I O N   D ' U N   T E T R A E D R E  :                                                                         */
/*                                                                                                                                   */
/*                                                                                                                                   */
/*        Definition :                                                                                                               */
/*                                                                                                                                   */
/*                    Pour chaque quadruplet de points {P,Q,R,S}                                                                     */
/*                  (forme par quatre coordonnees successives                                                                        */
/*                  {X,Y,Z} dans les trois fichiers Arguments)                                                                       */
/*                  on calcule le symetrique de P par rapport                                                                        */
/*                  a QRS. Puis ensuite on se deplace dans les                                                                       */
/*                  fichiers de facon a traiter le quadruplet                                                                        */
/*                  suivant {Q,R,S,T} et ainsi de suite. On                                                                          */
/*                  notera que les fichiers sont exploites                                                                           */
/*                  "modulo" de facon a revenir au debut si                                                                          */
/*                  besoin est. Enfin, l'utilisation normale,                                                                        */
/*                  dite "Refelxion d'un Tetraedre" ne demande                                                                       */
/*                  que quatre points (un seul tetraedre) dans                                                                       */
/*                  les fichiers...                                                                                                  */
/*                                                                                                                                   */
/*                                                                                                                                   */
/*        Author of '$xrv/ReflexionTetraedre.01$K' :                                                                                 */
/*                                                                                                                                   */
/*                    Jean-Francois COLONNA (LACTAMME, 20160724093205).                                                              */
/*                                                                                                                                   */
/*************************************************************************************************************************************/

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        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_DE_REFLEXION                                                                                              \
                    UN                                                                                                                  \
                                        /* Nombre d'iterations de reflexion.                                                         */

#define   PONDERATION_X                                                                                                                 \
                    FZERO
#define   PONDERATION_Y                                                                                                                 \
                    FZERO
#define   PONDERATION_Z                                                                                                                 \
                    FZERO
                                        /* Ponderation de selection des coordonnees apres transformation.                            */

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        D E F I N I T I O N   D E S   F I C H I E R S  :                                                                           */
/*                                                                                                                                   */
/*************************************************************************************************************************************/
#include  xrv/ARITHMET.1d.I"
#include  xrv/ARITHMET.21.I"
#include  xrv/champs_5.41.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 cartesiennes.                           */

#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 cartesiennes.                      */

gGENERATION_D_UN_FICHIER(fichier_intermediaire_LISTE_X,liste_intermediaire_des_X);
gGENERATION_D_UN_FICHIER(fichier_intermediaire_LISTE_Y,liste_intermediaire_des_Y);
gGENERATION_D_UN_FICHIER(fichier_intermediaire_LISTE_Z,liste_intermediaire_des_Z);
                                        /* Definition en memoire des fichiers de coordonnees cartesiennes intermediaires.            */

#define   ELEMENT_DU_FICHIER_INTERMEDIAIRE_LISTE_X(index)                                                                               \
                    gELEMENT_DU_FICHIER(liste_intermediaire_des_X,index)
#define   ELEMENT_DU_FICHIER_INTERMEDIAIRE_LISTE_Y(index)                                                                               \
                    gELEMENT_DU_FICHIER(liste_intermediaire_des_Y,index)
#define   ELEMENT_DU_FICHIER_INTERMEDIAIRE_LISTE_Z(index)                                                                               \
                    gELEMENT_DU_FICHIER(liste_intermediaire_des_Z,index)
                                        /* Acces a un element courant des fichiers de coordonnees cartesiennes intermediaires.       */

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        M A C R O S   U T I L E S  :                                                                                               */
/*                                                                                                                                   */
/*************************************************************************************************************************************/

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

     DEFV(Int,INIT(nombre_d_iterations_de_reflexion,NOMBRE_D_ITERATIONS_DE_REFLEXION));
                                        /* Nombre d'iterations de reflexion.                                                         */

     DEFV(Float,INIT(ponderation_X,PONDERATION_X));
     DEFV(Float,INIT(ponderation_Y,PONDERATION_Y));
     DEFV(Float,INIT(ponderation_Z,PONDERATION_Z));
                                        /* Ponderation de selection des coordonnees apres transformation.                            */
     /*..............................................................................................................................*/
#include  xrv/champs_5.1A.I"

     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
                                                  );

                         GET_ARGUMENT_I("passes=""iterations=",nombre_d_iterations_de_reflexion);
                                        /* Arguments introduits le 20160727132241...                                                 */

                         GET_ARGUMENT_F("pX=""Pond1=",ponderation_X);
                         GET_ARGUMENT_F("pY=""Pond2=",ponderation_Y);
                         GET_ARGUMENT_F("pZ=""Pond3=",ponderation_Z);

                         PROCESS_ARGUMENTS_DE_PARAMETRAGE_DE_LA_GENERATION_DE_SUITE_DE_VALEURS_3;
                         PROCESS_ARGUMENTS_DE_PARAMETRAGE_DE_LA_GENERATION_DE_SUITE_DE_VALEURS_1;

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

     Test(IFGE(nombre_d_elements,QUATRE))
          Bblock
                                        /* Test de validation introduit le 20160724111914...                                         */
          iGENERATION_D_UN_FICHIER(liste_intermediaire_des_X,X_IMPLICITE);
          iGENERATION_D_UN_FICHIER(liste_intermediaire_des_Y,Y_IMPLICITE);
          iGENERATION_D_UN_FICHIER(liste_intermediaire_des_Z,Z_IMPLICITE);

          Repe(nombre_d_iterations_de_reflexion)
               Bblock
               DoIn(index
                   ,premier_element_d_un_fichier
                   ,DERNIER_ELEMENT_D_UN_FICHIER
                   ,pas_de_parcours_d_un_fichier
                    )
                    Bblock
                    DEFV(Int,INIT(indexP,NEUT(NEUT(NEUT(index)))));
                    DEFV(Int,INIT(indexQ
                                 ,MODS(NEUT(NEUT(SUCC(index)))
                                      ,PREMIER_ELEMENT_D_UN_FICHIER
                                      ,DERNIER_ELEMENT_D_UN_FICHIER
                                       )
                                  )
                         );
                    DEFV(Int,INIT(indexR
                                 ,MODS(NEUT(SUCC(SUCC(index)))
                                      ,PREMIER_ELEMENT_D_UN_FICHIER
                                      ,DERNIER_ELEMENT_D_UN_FICHIER
                                       )
                                  )
                         );
                    DEFV(Int,INIT(indexS
                                 ,MODS(SUCC(SUCC(SUCC(index)))
                                      ,PREMIER_ELEMENT_D_UN_FICHIER
                                      ,DERNIER_ELEMENT_D_UN_FICHIER
                                       )
                                  )
                         );
                                        /* Index des sommets {P,Q,R,S} du tetraedre courant.                                         */

                    DEFV(Float,INIT(XP,FLOT__UNDEF));
                    DEFV(Float,INIT(YP,FLOT__UNDEF));
                    DEFV(Float,INIT(ZP,FLOT__UNDEF));

                    DEFV(Float,INIT(XQ,FLOT__UNDEF));
                    DEFV(Float,INIT(YQ,FLOT__UNDEF));
                    DEFV(Float,INIT(ZQ,FLOT__UNDEF));

                    DEFV(Float,INIT(XR,FLOT__UNDEF));
                    DEFV(Float,INIT(YR,FLOT__UNDEF));
                    DEFV(Float,INIT(ZR,FLOT__UNDEF));

                    DEFV(Float,INIT(XS,FLOT__UNDEF));
                    DEFV(Float,INIT(YS,FLOT__UNDEF));
                    DEFV(Float,INIT(ZS,FLOT__UNDEF));
                                        /* Coordonnees des sommets {P,Q,R,S} du tetraedre courant.                                   */

                    DEFV(Float,INIT(A_QRS,FLOT__UNDEF));
                    DEFV(Float,INIT(B_QRS,FLOT__UNDEF));
                    DEFV(Float,INIT(C_QRS,FLOT__UNDEF));
                    DEFV(Float,INIT(D_QRS,FLOT__UNDEF));
                                        /* Definition du plan QRS.                                                                   */

                    DEFV(Float,INIT(A_pQRS,FLOT__UNDEF));
                    DEFV(Float,INIT(B_pQRS,FLOT__UNDEF));
                    DEFV(Float,INIT(C_pQRS,FLOT__UNDEF));
                    DEFV(Float,INIT(diviseur,FLOT__UNDEF));
                    DEFV(Float,INIT(multiplicateur,FLOT__UNDEF));
                                        /* Definition de la droite perpendiculaire au plan QRS et passant par P.                     */

                    DEFV(Float,INIT(XI,FLOT__UNDEF));
                    DEFV(Float,INIT(YI,FLOT__UNDEF));
                    DEFV(Float,INIT(ZI,FLOT__UNDEF));
                                        /* Point d'intersection entre le plan QRS et sa perpendiculaire passant par P.               */

                    DEFV(Float,INIT(sXP,FLOT__UNDEF));
                    DEFV(Float,INIT(sYP,FLOT__UNDEF));
                    DEFV(Float,INIT(sZP,FLOT__UNDEF));
                                        /* Point symetrique du point P par rapport a QRS.                                            */

                    EGAL(XP,ELEMENT_DU_FICHIER_LISTE_X(indexP));
                    EGAL(YP,ELEMENT_DU_FICHIER_LISTE_Y(indexP));
                    EGAL(ZP,ELEMENT_DU_FICHIER_LISTE_Z(indexP));

                    EGAL(XQ,ELEMENT_DU_FICHIER_LISTE_X(indexQ));
                    EGAL(YQ,ELEMENT_DU_FICHIER_LISTE_Y(indexQ));
                    EGAL(ZQ,ELEMENT_DU_FICHIER_LISTE_Z(indexQ));

                    EGAL(XR,ELEMENT_DU_FICHIER_LISTE_X(indexR));
                    EGAL(YR,ELEMENT_DU_FICHIER_LISTE_Y(indexR));
                    EGAL(ZR,ELEMENT_DU_FICHIER_LISTE_Z(indexR));

                    EGAL(XS,ELEMENT_DU_FICHIER_LISTE_X(indexS));
                    EGAL(YS,ELEMENT_DU_FICHIER_LISTE_Y(indexS));
                    EGAL(ZS,ELEMENT_DU_FICHIER_LISTE_Z(indexS));
                                        /* Recuperation des coordonnees des sommets {P,Q,R,S} du tetraedre courant.                  */

                    EGAL(A_QRS
                        ,NEUT(DET2(SOUS(YR,YQ),SOUS(ZR,ZQ)
                                  ,SOUS(YS,YQ),SOUS(ZS,ZQ)
                                   )
                              )
                         );
                    EGAL(B_QRS
                        ,NEGA(DET2(SOUS(XR,XQ),SOUS(ZR,ZQ)
                                  ,SOUS(XS,XQ),SOUS(ZS,ZQ)
                                   )
                              )
                         );
                    EGAL(C_QRS
                        ,NEUT(DET2(SOUS(XR,XQ),SOUS(YR,YQ)
                                  ,SOUS(XS,XQ),SOUS(YS,YQ)
                                   )
                              )
                         );

                    EGAL(D_QRS
                        ,NEGA(LIZ3(A_QRS,XQ
                                  ,B_QRS,YQ
                                  ,C_QRS,ZQ
                                   )
                              )
                         );
                                        /* Equation du plan QRS :                                                                    */
                                        /*                                                                                           */
                                        /*                  | x  - XQ       y  - YQ       z  - ZQ |                                  */
                                        /*                  | XR - XQ       YR - YQ       ZR - ZQ | = 0                              */
                                        /*                  | XS - XQ       YS - YQ       ZS - ZQ |                                  */
                                        /*                                                                                           */
                                        /* soit :                                                                                    */
                                        /*                                                                                           */
                                        /*                  A.x + B.y + C.z + D = 0                                                  */
                                        /*                                                                                           */

                    EGAL(A_pQRS,A_QRS);
                    EGAL(B_pQRS,B_QRS);
                    EGAL(C_pQRS,C_QRS);
                                        /* Equation de la droite perpendiculaire au plan QRS et passant par P :                      */
                                        /*                                                                                           */
                                        /*                   x - XP     y - YP     z - ZP                                            */
                                        /*                  -------- = -------- = --------                                           */
                                        /*                     A          B          C                                               */
                                        /*                                                                                           */

                    EGAL(diviseur
                        ,LIZ3(A_QRS,A_pQRS
                             ,B_QRS,B_pQRS
                             ,C_QRS,C_pQRS
                              )
                         );

                    Test(IZEQ(diviseur))
                         Bblock
                         PRINT_ERREUR("le plan QRS est indetermine");
                         Eblock
                    ATes
                         Bblock
                         Eblock
                    ETes

                    EGAL(multiplicateur
                        ,DIVZ(LIN3(A_QRS,XP
                                  ,B_QRS,YP
                                  ,C_QRS,ZP
                                  ,D_QRS
                                   )
                             ,diviseur
                              )
                         );
                    EGAL(XI,SOUS(XP,MUL2(multiplicateur,A_pQRS)));
                    EGAL(YI,SOUS(YP,MUL2(multiplicateur,B_pQRS)));
                    EGAL(ZI,SOUS(ZP,MUL2(multiplicateur,C_pQRS)));
                                        /* Point d'intersection entre le plan QRS et sa perpendiculaire passant par P.               */

                    EGAL(sXP,AMOY(XI,XP));
                    EGAL(sYP,AMOY(YI,YP));
                    EGAL(sZP,AMOY(ZI,ZP));
                                        /* Point symetrique du point P par rapport a QRS.                                            */

                    EGAL(ELEMENT_DU_FICHIER_INTERMEDIAIRE_LISTE_X(index),sXP);
                    EGAL(ELEMENT_DU_FICHIER_INTERMEDIAIRE_LISTE_Y(index),sYP);
                    EGAL(ELEMENT_DU_FICHIER_INTERMEDIAIRE_LISTE_Z(index),sZP);
                    Eblock
               EDoI

               DoIn(index
                   ,PREMIER_ELEMENT_D_UN_FICHIER
                   ,DERNIER_ELEMENT_D_UN_FICHIER
                   ,I
                    )
                    Bblock
                    EGAL(ELEMENT_DU_FICHIER_LISTE_X(index),ELEMENT_DU_FICHIER_INTERMEDIAIRE_LISTE_X(index));
                    EGAL(ELEMENT_DU_FICHIER_LISTE_Y(index),ELEMENT_DU_FICHIER_INTERMEDIAIRE_LISTE_Y(index));
                    EGAL(ELEMENT_DU_FICHIER_LISTE_Z(index),ELEMENT_DU_FICHIER_INTERMEDIAIRE_LISTE_Z(index));
                    Eblock
               EDoI
               Eblock
          ERep

          DoIn(index
              ,PREMIER_ELEMENT_D_UN_FICHIER
              ,DERNIER_ELEMENT_D_UN_FICHIER
              ,I
               )
               Bblock
               EDITION_DANS_gOPERATION_SUR_LES_FICHIERS_AVEC_SAUT_DE_LIGNE(LIZ3(ponderation_X,ELEMENT_DU_FICHIER_LISTE_X(index)
                                                                               ,ponderation_Y,ELEMENT_DU_FICHIER_LISTE_Y(index)
                                                                               ,ponderation_Z,ELEMENT_DU_FICHIER_LISTE_Z(index)
                                                                                )
                                                                           );
                                        /* Introduit sous cette forme le 20160804093448...                                           */
               Eblock
          EDoI

          lGENERATION_D_UN_FICHIER(liste_intermediaire_des_Z,Z_IMPLICITE);
          lGENERATION_D_UN_FICHIER(liste_intermediaire_des_Y,Y_IMPLICITE);
          lGENERATION_D_UN_FICHIER(liste_intermediaire_des_X,X_IMPLICITE);
          Eblock
     ATes
          Bblock
          PRINT_ERREUR("rien n'est fait car il faut au moins 4 elements dans chaque fichier");
          Eblock
     ETes

     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.