/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        I N V E R S I O N   G E O M E T R I Q U E   D E S   C O O R D O N N E E S   E T   D U   R A Y O N  :                       */
/*                                                                                                                                   */
/*                                                                                                                                   */
/*        Author of '$xrv/inversion.01$K' :                                                                                          */
/*                                                                                                                                   */
/*                    Jean-Francois COLONNA (LACTAMME, 20060425162949).                                                              */
/*                                                                                                                                   */
/*************************************************************************************************************************************/

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        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  :                                               */
/*                                                                                                                                   */
/*************************************************************************************************************************************/
                                        /* Le 20080311163558, fut supprime :                                                         */
                                        /*                                                                                           */
                                        /*                  @define   PRAGMA_CL_____MODULE_NON_OPTIMISABLE                           */
                                        /*                                                                                           */
                                        /* qui semblait inutile...                                                                   */

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        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   X_POLE_D_INVERSION                                                                                                            \
                    FXorigine
#define   Y_POLE_D_INVERSION                                                                                                            \
                    FYorigine
#define   Z_POLE_D_INVERSION                                                                                                            \
                    FZorigine
#define   PUISSANCE_D_INVERSION                                                                                                         \
                    EXP2(RAYON_IMPLICITE)
                                        /* Definition de l'inversion...                                                              */
#define   VALIDER_LA_PUISSANCE_D_INVERSION                                                                                              \
                    FAUX                                                                                                                \
                                        /* Validation introduite le 20080401094446. Le 20080401141906 la valeur par defaut est       */ \
                                        /* passee de 'VRAI' a 'FAUX' a cause des usages 'v $xrs/SurfParti.01$Z .xrv.inversion.01.X'  */ \
                                        /* ou le rayon peut ne pas etre force ('v $xrs/SurfParti.01$Z ForcerRayonI' ou c'est le cas  */ \
                                        /* par defaut...).                                                                           */
#define   PONDERATION_X_____IMPLICITE                                                                                                   \
                    FZERO
#define   PONDERATION_Y_____IMPLICITE                                                                                                   \
                    FZERO
#define   PONDERATION_Z_____IMPLICITE                                                                                                   \
                    FZERO
#define   PONDERATION_RAYON_IMPLICITE                                                                                                   \
                    FZERO
                                        /* Ponderation de selection des coordonnees et du rayon apres inversion...                   */

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        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"
                                        /* Passage a l'allocation dynamique le 20060214185123...                                     */
#include  xrv/ARITHMET.21.I"
#include  xrv/champs_5.41.I"

#define   X_IMPLICITE                                                                                                                   \
                    FZERO
#define   Y_IMPLICITE                                                                                                                   \
                    FZERO
#define   Z_IMPLICITE                                                                                                                   \
                    FZERO
#define   RAYON_IMPLICITE                                                                                                               \
                    FU

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);
gGENERATION_D_UN_FICHIER(fichier_LISTE_RAYON,liste_initiale_des_RAYON);
                                        /* 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)
#define   ELEMENT_DU_FICHIER_LISTE_RAYON(index)                                                                                         \
                    gELEMENT_DU_FICHIER(liste_initiale_des_RAYON,index)
                                        /* Acces a un element courant des fichiers de coordonnees cartesiennes.                      */

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

     DEFV(Float,INIT(X_pole_d_inversion,X_POLE_D_INVERSION));
     DEFV(Float,INIT(Y_pole_d_inversion,Y_POLE_D_INVERSION));
     DEFV(Float,INIT(Z_pole_d_inversion,Z_POLE_D_INVERSION));
     DEFV(Float,INIT(puissance_d_inversion,PUISSANCE_D_INVERSION));
                                        /* Definition de l'inversion...                                                              */
     DEFV(Logical,INIT(valider_la_puissance_d_inversion,VALIDER_LA_PUISSANCE_D_INVERSION));
                                        /* Validation introduite le 20080401094446. Le 20080401141906 la valeur par defaut est       */
                                        /* passee de 'VRAI' a 'FAUX' a cause des usages 'v $xrs/SurfParti.01$Z .xrv.inversion.01.X'  */
                                        /* ou le rayon peut ne pas etre force ('v $xrs/SurfParti.01$Z ForcerRayonI' ou c'est le cas  */
                                        /* par defaut...).                                                                           */
     DEFV(Float,INIT(ponderation_X____,PONDERATION_X_____IMPLICITE));
     DEFV(Float,INIT(ponderation_Y____,PONDERATION_Y_____IMPLICITE));
     DEFV(Float,INIT(ponderation_Z____,PONDERATION_Z_____IMPLICITE));
     DEFV(Float,INIT(ponderation_RAYON,PONDERATION_RAYON_IMPLICITE));
                                        /* Ponderation de selection des coordonnees et du rayon apres inversion...                   */
     /*..............................................................................................................................*/
#include  xrv/champs_5.1A.I"
                                        /* Ceci fut introduit le 20070103173746...                                                   */

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

                         PROKESF_ARGUMENT_FICHIER("LISTE_RAYON="
                                                 ,fichier_LISTE_RAYON
                                                 ,liste_initiale_des_RAYON
                                                 ,RAYON_IMPLICITE
                                                 ,lTRANSFORMAT_0d
                                                 ,iGENERATION_D_UN_FICHIER
                                                  );

                         GET_ARGUMENT_F("Xpole=""X=",X_pole_d_inversion);
                         GET_ARGUMENT_F("Ypole=""Y=",Y_pole_d_inversion);
                         GET_ARGUMENT_F("Zpole=""Z=",Z_pole_d_inversion);
                         GET_ARGUMENT_F("puissance=""p=",puissance_d_inversion);
                         GET_ARGUMENT_L("valider_puissance_inversion=""valider=",valider_la_puissance_d_inversion);

                         GET_ARGUMENT_F("pX=""Pond1=",ponderation_X____);
                         GET_ARGUMENT_F("pY=""Pond2=",ponderation_Y____);
                         GET_ARGUMENT_F("pZ=""Pond3=",ponderation_Z____);
                         GET_ARGUMENT_F("pRAYON=""pR=""Pond4=",ponderation_RAYON);

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

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

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

     gOPERATION_SUR_LES_FICHIERS(BLOC(
                                      DEFV(Float,INIT(coordonnee_X,ELEMENT_DU_FICHIER_LISTE_X(index)));
                                      DEFV(Float,INIT(coordonnee_Y,ELEMENT_DU_FICHIER_LISTE_Y(index)));
                                      DEFV(Float,INIT(coordonnee_Z,ELEMENT_DU_FICHIER_LISTE_Z(index)));
                                      DEFV(Float,INIT(rayon,ELEMENT_DU_FICHIER_LISTE_RAYON(index)));
                                        /* Recuperation des coordonnees {X,Y,Z} du point courant M1 et du rayon dans les fichiers.   */

                                      DEFV(Float,INIT(lambda,FLOT__UNDEF));
                                      DEFV(Float,INIT(module_au_carre,FLOT__UNDEF));

                                      EGAL(module_au_carre
                                          ,disF3D(X_pole_d_inversion,Y_pole_d_inversion,Z_pole_d_inversion
                                                 ,coordonnee_X,coordonnee_Y,coordonnee_Z
                                                  )
                                           );
                                        /* Module au carre du vecteur allant du pole d'inversion I au point courant M1.              */
                                      EGAL(lambda,DIVZ(puissance_d_inversion,module_au_carre));
                                        /* Parametre de passage du vecteur IM1 au vecteur IM2...                                     */

                                      Test(IL_FAUT(valider_la_puissance_d_inversion))
                                           Bblock
                                           Test(IFNE(puissance_d_inversion,EXP2(rayon)))
                                                Bblock
                                                PRINT_ATTENTION("la puissance d'inversion n'est pas egale au carre du rayon");
                                                CAL3(Prme3("(puissance=%f rayon=%f rayon.rayon=%f)\n"
                                                          ,puissance_d_inversion,rayon,EXP2(rayon)
                                                           )
                                                     );
                                        /* Tests et edition introduits le 20080401094446...                                          */
                                                Eblock
                                           ATes
                                                Bblock
                                                Eblock
                                           ETes
                                           Eblock
                                      ATes
                                           Bblock
                                           Eblock
                                      ETes
                                      )
                                ,LIZ4(ponderation_X____,BARY(X_pole_d_inversion,coordonnee_X,lambda)
                                     ,ponderation_Y____,BARY(Y_pole_d_inversion,coordonnee_Y,lambda)
                                     ,ponderation_Z____,BARY(Z_pole_d_inversion,coordonnee_Z,lambda)
                                     ,ponderation_RAYON,MUL2(DIVI(puissance_d_inversion,SOUS(module_au_carre,EXP2(rayon)))
                                                            ,rayon
                                                             )
                                      )
                                ,EDITER_LA_VALEUR_RESULTANTE_DANS_gOPERATION_SUR_LES_FICHIERS
                                ,nombre_d_exemplaires_du_resultat_de_l_operation_sur_les_valeurs_courantes
                                 );
                                        /* Inversion des coordonnees et du rayon. On notera qu'une sphere subit dans ce cas          */
                                        /* une homothetie de rapport :                                                               */
                                        /*                                                                                           */
                                        /*                   puissance                                                               */
                                        /*                  -----------                                                              */
                                        /*                    2     2                                                                */
                                        /*                   d  -  R                                                                 */
                                        /*                                                                                           */
                                        /* ou 'R' est son rayon et 'd' designe la distance de son centre au pole d'inversion.        */
                                        /*                                                                                           */
                                        /* En ce qui concerne les coordonnees, soient 'I' le centre d'inversion et 'M1' le point     */
                                        /* courant a inverser (et 'M2' son "inverse"). On a donc :                                   */
                                        /*                                                                                           */
                                        /*                 --->          --->                                                        */
                                        /*                  IM  = lambda. IM                                                         */
                                        /*                    2             1                                                        */
                                        /*                                                                                           */
                                        /* les deux vecteurs etant colineaires et :                                                  */
                                        /*                                                                                           */
                                        /*                 --->  --->                                   2                            */
                                        /*                  IM  . IM  = puissance                   (= R  en general)                */
                                        /*                    1     2                                                                */
                                        /*                                                                                           */
                                        /* d'ou :                                                                                    */
                                        /*                                                                                           */
                                        /*                           puissance                                                       */
                                        /*                 lambda = -----------                                                      */
                                        /*                             ---> 2                                                        */
                                        /*                            | IM |                                                         */
                                        /*                                1                                                          */
                                        /*                                                                                           */
                                        /* et 'C' designant une coordonnee quelconque, on a donc :                                   */
                                        /*                                                                                           */
                                        /*                  C  - C  = lambda.(C  - C )                                               */
                                        /*                   2    I            1    I                                                */
                                        /*                                                                                           */
                                        /* soit :                                                                                    */
                                        /*                                                                                           */
                                        /*                  C  = (1-lambda).C + lambda.C                                             */
                                        /*                   2               I          1                                            */
                                        /*                                                                                           */
                                        /* ou encore :                                                                               */
                                        /*                                                                                           */
                                        /*                  C  = BARY(C ,C ,lambda)                                                  */
                                        /*                   2         I  1                                                          */
                                        /*                                                                                           */
                                        /* en notant que 'lambda' n'est pas a priori dans [0,1]...                                   */

     lGENERATION_D_UN_FICHIER(liste_initiale_des_RAYON,RAYON_IMPLICITE);
     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.