/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        R E F L E X I O N   D ' U N   T R I A N G L E  :                                                                           */
/*                                                                                                                                   */
/*                                                                                                                                   */
/*        Definition :                                                                                                               */
/*                                                                                                                                   */
/*                    Pour chaque triplet de points {P,Q,R}                                                                          */
/*                  (forme par trois coordonnees successives                                                                         */
/*                  {X,Y} dans les deux fichiers Arguments)                                                                          */
/*                  on calcule le symetrique de P par rapport                                                                        */
/*                  a QR. Puis ensuite on se deplace dans les                                                                        */
/*                  fichiers de facon a traiter le triplet                                                                           */
/*                  suivant {Q,R,S} 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 Triangle" ne demande                                                                        */
/*                  que trois points (un seul triangle) dans                                                                         */
/*                  les fichiers...                                                                                                  */
/*                                                                                                                                   */
/*                                                                                                                                   */
/*        Author of '$xrv/ReflexionTriangle.01$K' :                                                                                  */
/*                                                                                                                                   */
/*                    Jean-Francois COLONNA (LACTAMME, 20160722120508).                                                              */
/*                                                                                                                                   */
/*************************************************************************************************************************************/

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        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 (introduit le 20160723101911).                           */

#define   PONDERATION_X                                                                                                                 \
                    FZERO
#define   PONDERATION_Y                                                                                                                 \
                    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

gGENERATION_D_UN_FICHIER(fichier_LISTE_X,liste_initiale_des_X);
gGENERATION_D_UN_FICHIER(fichier_LISTE_Y,liste_initiale_des_Y);
                                        /* 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)
                                        /* 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);
                                        /* 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)
                                        /* 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 R I A N G L 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 (introduit le 20160723101911).                           */

     DEFV(Float,INIT(ponderation_X,PONDERATION_X));
     DEFV(Float,INIT(ponderation_Y,PONDERATION_Y));
                                        /* 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
                                                  );

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

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

                         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 20211005104946...                                       */
                         )
                    );

     Test(IFGE(nombre_d_elements,TROIS))
          Bblock
                                        /* Test de validation introduit le 20160724111923...                                         */
          iGENERATION_D_UN_FICHIER(liste_intermediaire_des_X,X_IMPLICITE);
          iGENERATION_D_UN_FICHIER(liste_intermediaire_des_Y,Y_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(index))));
                    DEFV(Int,INIT(indexQ
                                 ,MODS(NEUT(SUCC(index))
                                      ,PREMIER_ELEMENT_D_UN_FICHIER
                                      ,DERNIER_ELEMENT_D_UN_FICHIER
                                       )
                                  )
                         );
                    DEFV(Int,INIT(indexR
                                 ,MODS(SUCC(SUCC(index))
                                      ,PREMIER_ELEMENT_D_UN_FICHIER
                                      ,DERNIER_ELEMENT_D_UN_FICHIER
                                       )
                                  )
                         );
                                        /* Index des sommets {P,Q,R} du triangle courant.                                            */

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

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

                    DEFV(Float,INIT(XR,FLOT__UNDEF));
                    DEFV(Float,INIT(YR,FLOT__UNDEF));
                                        /* Coordonnees des sommets {P,Q,R} du triangle courant.                                      */

                    DEFV(Float,INIT(A_QR,FLOT__UNDEF));
                    DEFV(Float,INIT(B_QR,FLOT__UNDEF));
                    DEFV(complexe,AB_QR);
                    DEFV(Float,INIT(C_QR,FLOT__UNDEF));
                                        /* Definition de la droite QR.                                                               */

                    DEFV(Float,INIT(A_pQR,FLOT__UNDEF));
                    DEFV(Float,INIT(B_pQR,FLOT__UNDEF));
                    DEFV(complexe,AB_pQR);
                    DEFV(Float,INIT(C_pQR,FLOT__UNDEF));
                                        /* Definition de la droite perpendiculaire a la droite QR et passant par P.                  */

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

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

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

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

                    EGAL(XR,ELEMENT_DU_FICHIER_LISTE_X(indexR));
                    EGAL(YR,ELEMENT_DU_FICHIER_LISTE_Y(indexR));
                                        /* Recuperation des coordonnees des sommets {P,Q,R} du triangle courant.                     */

                    EGAL(A_QR,NEGA(SOUS(YR,YQ)));
                    EGAL(B_QR,NEUT(SOUS(XR,XQ)));
                    EGAL(C_QR
                        ,DET2(NEUT(XQ),SOUS(XR,XQ)
                             ,NEUT(YQ),SOUS(YR,YQ)
                              )
                         );
                                        /* Equation de la droite QR (droite 1) :                                                     */
                                        /*                                                                                           */
                                        /*                  A1.x        + B1.y       + C1                      = 0                   */
                                        /*                                                                                           */
                                        /*                  -(YR-YQ).x  + (XR-XQ).y  + [XQ(YR-YQ) - YQ(XR-XQ)] = 0                   */
                                        /*                                                                                           */

                    Cinitialisation(AB_QR,A_QR,B_QR);
                    Cproduit(AB_pQR,AB_QR,C_____nombre_complexe__0_p1);
                    EGAL(A_pQR,Reelle(AB_pQR));
                    EGAL(B_pQR,Imaginaire(AB_pQR));
                                        /* Jusqu'au 20160723100312, il y avait ici :                                                 */
                                        /*                                                                                           */
                                        /*                  EGAL(A_pQR,NEUT(B_QR));                                                  */
                                        /*                  EGAL(B_pQR,NEGA(A_QR));                                                  */
                                        /*                                                                                           */
                                        /* qui est peut-etre plus rapide que ce qui le remplace a cette date et qui est beaucoup     */
                                        /* plus elegant en utilisant une rotation de +pi/2 via une multiplication par (0,1)...       */
                    EGAL(C_pQR,NEGA(ADD2(MUL2(A_pQR,XP),MUL2(B_pQR,YP))));
                                        /* Equation de la droite perpendiculaire a la droite QR et passant par P (droite 2) :        */
                                        /*                                                                                           */
                                        /*                  A2.x        + B2.y       + C2                      = 0                   */
                                        /*                                                                                           */
                                        /* avec :                                                                                    */
                                        /*                                                                                           */
                                        /*                  A2.XP       + B2.YP      + C2                      = 0                   */
                                        /* et :                                                                                      */
                                        /*                                                                                           */
                                        /*                  A2 = +B1                                                                 */
                                        /*                  B2 = -A1                                                                 */
                                        /*                                                                                           */

                    EGAL(diviseur,DET2(A_QR,B_QR,A_pQR,B_pQR));

                    Test(IZEQ(diviseur))
                         Bblock
                         PRINT_ERREUR("un determinant est nul");
                                        /* En fait cela ne peut se produire que si :                                                 */
                                        /*                                                                                           */
                                        /*                  A_QRxB_pQR - B_QRxA_pQR = 0                                              */
                                        /*                                                                                           */
                                        /* soit :                                                                                    */
                                        /*                                                                                           */
                                        /*                  A_QRx(-A_QR) - B_QRxB_QR = 0                                             */
                                        /*                                                                                           */
                                        /* ou encore :                                                                               */
                                        /*                                                                                           */
                                        /*                      2       2                                                            */
                                        /*                  A_QR  + B_QR  = 0                                                        */
                                        /*                                                                                           */
                                        /* ce qui ne peut donc se produire que si :                                                  */
                                        /*                                                                                           */
                                        /*                  A_QR = B_QR = 0                                                          */
                                        /*                                                                                           */
                                        /* ou encore :                                                                               */
                                        /*                                                                                           */
                                        /*                  XQ = XR                                                                  */
                                        /*                  YQ = YR                                                                  */
                                        /*                                                                                           */
                                        /* ce qui veut dire que les points Q et R sont confondus...                                  */
                         Eblock
                    ATes
                         Bblock
                         Eblock
                    ETes

                    EGAL(XI,DIVZ(DET2(B_QR,C_QR,B_pQR,C_pQR),diviseur));
                    EGAL(YI,DIVZ(DET2(C_QR,A_QR,C_pQR,A_pQR),diviseur));
                                        /* Point d'intersection entre le droite QR et sa perpendiculaire passant par P.              */

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

                    EGAL(ELEMENT_DU_FICHIER_INTERMEDIAIRE_LISTE_X(index),sXP);
                    EGAL(ELEMENT_DU_FICHIER_INTERMEDIAIRE_LISTE_Y(index),sYP);
                    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));
                    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(LIZ2(ponderation_X,ELEMENT_DU_FICHIER_LISTE_X(index)
                                                                               ,ponderation_Y,ELEMENT_DU_FICHIER_LISTE_Y(index)
                                                                                )
                                                                           );
                                        /* Introduit sous cette forme le 20160804093557...                                           */
               Eblock
          EDoI

          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 3 elements dans chaque fichier");
          Eblock
     ETes

     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.