/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        E Q U A T I O N   D ' U N   P L A N  :                                                                                     */
/*                                                                                                                                   */
/*                                                                                                                                   */
/*        Author of '$xcg/EquationPlan.01$K' :                                                                                       */
/*                                                                                                                                   */
/*                    Jean-Francois COLONNA (LACTAMME, 20180703095941).                                                              */
/*                                                                                                                                   */
/*************************************************************************************************************************************/

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

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        P A R A M E T R E S  :                                                                                                     */
/*                                                                                                                                   */
/*************************************************************************************************************************************/
#define   COORDONNEE_X1                                                                                                                 \
                    FU
#define   COORDONNEE_Y1                                                                                                                 \
                    FZERO
#define   COORDONNEE_Z1                                                                                                                 \
                    FZERO

#define   COORDONNEE_X2                                                                                                                 \
                    FZERO
#define   COORDONNEE_Y2                                                                                                                 \
                    FU
#define   COORDONNEE_Z2                                                                                                                 \
                    FZERO

#define   COORDONNEE_X3                                                                                                                 \
                    FZERO
#define   COORDONNEE_Y3                                                                                                                 \
                    FZERO
#define   COORDONNEE_Z3                                                                                                                 \
                    FU
                                        /* Definition des 3x3 parametres de la matrice...                                            */

#define   EPSILON_DE_PERTURBATION_DU_DETERMINANT_M_NUL                                                                                  \
                    gEPSILON
#define   INCREMENT_DE_l_EPSILON_DE_PERTURBATION_DU_DETERMINANT_M_NUL                                                                   \
                    FZERO
                                        /* Afin de supprimer artificiellement le probleme de nullite du determinant M nul...         */

#define   INVERSER_LA_SOLUTION                                                                                                          \
                    FAUX                                                                                                                \
                                        /* Faut-il conserver les signes de la solution ('FAUX') ou bien les inverser ('VRAI') ?      */ \
                                        /* Ceci a ete introduit le 20180704092422, on ne sait jamais : on notera au passage que      */ \
                                        /* si 'AX+BY+CZ+D=0' est l'equation d'un plan, alors '-(AX+BY+CZ+D)=0' est aussi equation    */ \
                                        /* de ce plan...                                                                             */

#define   SIGNER_LES_VALEURS                                                                                                            \
                    VRAI                                                                                                                \
                                        /* Faut-il signer toutes les valeurs ('VRAI') ou pas ('FAUX') ?                              */

#define   EDITER_L_EN_TETE                                                                                                              \
                    VRAI
#define   EDITER_A                                                                                                                      \
                    VRAI
#define   EDITER_B                                                                                                                      \
                    VRAI
#define   EDITER_C                                                                                                                      \
                    VRAI
#define   EDITER_D                                                                                                                      \
                    VRAI
                                        /* Controle de l'edition des variables {A,B,C,D}.                                            */

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        P E R T U R B A T I O N   E V E N T U E L L E   D E   L ' E P S I L O N  :                                                 */
/*                                                                                                                                   */
/*************************************************************************************************************************************/

DEFV(Float,INIT(epsilon_de_perturbation_du_determinant_M_nul,EPSILON_DE_PERTURBATION_DU_DETERMINANT_M_NUL));
DEFV(Float,INIT(increment_de_l_epsilon_de_perturbation_du_determinant_M_nul
               ,INCREMENT_DE_l_EPSILON_DE_PERTURBATION_DU_DETERMINANT_M_NUL
                )
     );
                                        /* Afin de supprimer artificiellement le probleme de nullite du determinant M nul...         */

BFonctionF

DEFV(LoF,DEFV(FonctionF,epsilon_avec_incrementation_eventuelle(epsilon)))
DEFV(Argument,DEFV(Float,epsilon));
/*-----------------------------------------------------------------------------------------------------------------------------------*/
     Bblock
     DEFV(Float,INIT(epsilon_de_perturbation_du_determinant_M_nul_avant_incrementation,epsilon_de_perturbation_du_determinant_M_nul));

     INIT_ERROR;
     /*..............................................................................................................................*/
     INCR(epsilon_de_perturbation_du_determinant_M_nul,increment_de_l_epsilon_de_perturbation_du_determinant_M_nul);
                                        /* Cela peut etre utile. En effet, un determinant peut peut-etre conserver la meme valeur    */
                                        /* nulle si tous ses elements sont translates de la meme facon...                            */

     RETU(epsilon_de_perturbation_du_determinant_M_nul_avant_incrementation);
     Eblock

EFonctionF

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        M A C R O S   U T I L E S  :                                                                                               */
/*                                                                                                                                   */
/*************************************************************************************************************************************/
#define   PERTURBE(x,epsilon)                                                                                                           \
                    ADD2(x,epsilon_avec_incrementation_eventuelle(epsilon))
#define   CALCUL_DU_DETERMINANT__M(epsilon)                                                                                             \
                    Bblock                                                                                                              \
                    EGAL(determinant_M_                                                                                                 \
                        ,DET3(PERTURBE(coordonnee_X1,epsilon),PERTURBE(coordonnee_Y1,epsilon),PERTURBE(coordonnee_Z1,epsilon)           \
                             ,PERTURBE(coordonnee_X2,epsilon),PERTURBE(coordonnee_Y2,epsilon),PERTURBE(coordonnee_Z2,epsilon)           \
                             ,PERTURBE(coordonnee_X3,epsilon),PERTURBE(coordonnee_Y3,epsilon),PERTURBE(coordonnee_Z3,epsilon)           \
                              )                                                                                                         \
                         );                                                                                                             \
                    Eblock                                                                                                              \
                                        /* Calcul du determinant 'M'...                                                              */

#define   CALCUL_DES_DETERMINANTS__MA_MB_MC                                                                                             \
                    Bblock                                                                                                              \
                    EGAL(determinant_MA                                                                                                 \
                        ,DET3(variable____D,coordonnee_Y1,coordonnee_Z1                                                                 \
                             ,variable____D,coordonnee_Y2,coordonnee_Z2                                                                 \
                             ,variable____D,coordonnee_Y3,coordonnee_Z3                                                                 \
                              )                                                                                                         \
                         );                                                                                                             \
                    EGAL(determinant_MB                                                                                                 \
                        ,DET3(coordonnee_X1,variable____D,coordonnee_Z1                                                                 \
                             ,coordonnee_X2,variable____D,coordonnee_Z2                                                                 \
                             ,coordonnee_X3,variable____D,coordonnee_Z3                                                                 \
                              )                                                                                                         \
                         );                                                                                                             \
                    EGAL(determinant_MC                                                                                                 \
                        ,DET3(coordonnee_X1,coordonnee_Y1,variable____D                                                                 \
                             ,coordonnee_X2,coordonnee_Y2,variable____D                                                                 \
                             ,coordonnee_X3,coordonnee_Y3,variable____D                                                                 \
                              )                                                                                                         \
                         );                                                                                                             \
                    Eblock                                                                                                              \
                                        /* Calcul des trois determinants 'MA', 'MB' et 'MC' en fonction de 'D'...                    */

#define   CALCUL_DES_VARIABLES_A_B_C                                                                                                    \
                    Bblock                                                                                                              \
                    EGAL(variable____A,DIV0(determinant_MA,determinant_M_,FZERO,FZERO));                                                \
                    EGAL(variable____B,DIV0(determinant_MB,determinant_M_,FZERO,FZERO));                                                \
                    EGAL(variable____C,DIV0(determinant_MC,determinant_M_,FZERO,FZERO));                                                \
                    Eblock                                                                                                              \
                                        /* Calcul des trois variables 'A', 'B' et 'C' en fonction de 'D'...                          */

#define   INVERSION_DE_LA_SOLUTION(x)                                                                                                   \
                    COND(IL_FAUT(inverser_la_solution),NEGA(x),NEUT(x))

#define   NORMALISE(x)                                                                                                                  \
                    DIVI(x,MAX4(variable____A,variable____B,variable____C,variable____D))

#define   PRINT(valeur,nom_de_la_valeur,editer)                                                                                         \
                    Bblock                                                                                                              \
                    Test(IL_FAUT(editer))                                                                                               \
                         Bblock                                                                                                         \
                         Test(IL_FAUT(editer_l_en_tete))                                                                                \
                              Bblock                                                                                                    \
                              CAL2(Prin0(Cara(chain_Aconcaten2(nom_de_la_valeur                                                         \
                                                              ,"="                                                                      \
                                                               )                                                                        \
                                              )                                                                                         \
                                         )                                                                                              \
                                   );                                                                                                   \
                              Eblock                                                                                                    \
                         ATes                                                                                                           \
                              Bblock                                                                                                    \
                              Eblock                                                                                                    \
                         ETes                                                                                                           \
                                                                                                                                        \
                         CAL2(Prin1(Cara(chain_Aconcaten4("%"                                                                           \
                                                         ,COND(IL_FAUT(signer_les_valeurs),"+",C_VIDE)                                  \
                                                         ,".^^^"                                                                        \
                                                         ,"\n"                                                                          \
                                                          )                                                                             \
                                         )                                                                                              \
                                   ,valeur                                                                                              \
                                    )                                                                                                   \
                              );                                                                                                        \
                         Eblock                                                                                                         \
                    ATes                                                                                                                \
                         Bblock                                                                                                         \
                         Eblock                                                                                                         \
                    ETes                                                                                                                \
                    Eblock                                                                                                              \
                                        /* On ne peut donc pas utiliser 'v $xci/valeurs.03.I valeurs_signees'...                     */

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        E Q U A T I O N   D ' U N   P L A N  :                                                                                     */
/*                                                                                                                                   */
/*************************************************************************************************************************************/
BCommande(nombre_d_arguments,arguments)
/*-----------------------------------------------------------------------------------------------------------------------------------*/
     Bblock
     DEFV(Float,INIT(coordonnee_X1,COORDONNEE_X1));
     DEFV(Float,INIT(coordonnee_Y1,COORDONNEE_Y1));
     DEFV(Float,INIT(coordonnee_Z1,COORDONNEE_Z1));

     DEFV(Float,INIT(coordonnee_X2,COORDONNEE_X2));
     DEFV(Float,INIT(coordonnee_Y2,COORDONNEE_Y2));
     DEFV(Float,INIT(coordonnee_Z2,COORDONNEE_Z2));

     DEFV(Float,INIT(coordonnee_X3,COORDONNEE_X3));
     DEFV(Float,INIT(coordonnee_Y3,COORDONNEE_Y3));
     DEFV(Float,INIT(coordonnee_Z3,COORDONNEE_Z3));
                                        /* Definition des 3x3 parametres de la matrice...                                            */

     DEFV(Logical,INIT(inverser_la_solution,INVERSER_LA_SOLUTION));
                                        /* Faut-il conserver les signes de la solution ('FAUX') ou bien les inverser ('VRAI') ?      */
                                        /* Ceci a ete introduit le 20180704092422, on ne sait jamais : on notera au passage que      */
                                        /* si 'AX+BY+CZ+D=0' est l'equation d'un plan, alors '-(AX+BY+CZ+D)=0' est aussi equation    */
                                        /* de ce plan...                                                                             */
     DEFV(Logical,INIT(signer_les_valeurs,SIGNER_LES_VALEURS));
                                        /* Faut-il signer toutes les valeurs ('VRAI') ou pas ('FAUX') ?                              */
     DEFV(Logical,INIT(editer_l_en_tete,EDITER_L_EN_TETE));
     DEFV(Logical,INIT(editer_A,EDITER_A));
     DEFV(Logical,INIT(editer_B,EDITER_B));
     DEFV(Logical,INIT(editer_C,EDITER_C));
     DEFV(Logical,INIT(editer_D,EDITER_D));
                                        /* Controle de l'edition des variables {A,B,C,D}.                                            */
     /*..............................................................................................................................*/
     EGAL(nombre_de_chiffres_des_editions_flottantes,QUATRE);
     EGAL(PREMIER_CARACTERE_ITb0(mode_fg_de_FORMAT_FLOT_EDITION),K_f);
                                        /* Et ce afin d'arrondir les valeurs editees a la fin et en particulier 'D' lorsqu'il est    */
                                        /* presque nul...                                                                            */

     GET_ARGUMENTS_(nombre_d_arguments
                   ,BLOC(GET_ARGUMENT_F("X1=""x1=",coordonnee_X1);
                         GET_ARGUMENT_F("Y1=""y1=",coordonnee_Y1);
                         GET_ARGUMENT_F("Z1=""z1=",coordonnee_Z1);

                         GET_ARGUMENT_F("X2=""x2=",coordonnee_X2);
                         GET_ARGUMENT_F("Y2=""y2=",coordonnee_Y2);
                         GET_ARGUMENT_F("Z2=""z2=",coordonnee_Z2);

                         GET_ARGUMENT_F("X3=""x3=",coordonnee_X3);
                         GET_ARGUMENT_F("Y3=""y3=",coordonnee_Y3);
                         GET_ARGUMENT_F("Z3=""z3=",coordonnee_Z3);

                         GET_ARGUMENT_F("epsilon=""eps=",epsilon_de_perturbation_du_determinant_M_nul);
                         GET_ARGUMENT_F("increment_epsilon=""ieps=",increment_de_l_epsilon_de_perturbation_du_determinant_M_nul);

                         GET_ARGUMENT_L("inverser=",inverser_la_solution);

                         GET_ARGUMENT_L("signer_valeurs=""signe=",signer_les_valeurs);
                         GET_ARGUMENT_L("en_tete=""titre=",editer_l_en_tete);
                         GET_ARGUMENT_L("A=",editer_A);
                         GET_ARGUMENT_L("B=",editer_B);
                         GET_ARGUMENT_L("C=",editer_C);
                         GET_ARGUMENT_L("D=",editer_D);
                         )
                    );

     begin_nouveau_block
          Bblock
          DEFV(Float,INIT(variable____A,FLOT__UNDEF));
          DEFV(Float,INIT(variable____B,FLOT__UNDEF));
          DEFV(Float,INIT(variable____C,FLOT__UNDEF));
          DEFV(Float,INIT(variable____D,FU));
                                        /* Definition des quatre variables cherchees, la valeur donnee a 'D' etant arbitraire...     */
                                        /*                                                                                           */
                                        /* L'equation d'un plan est :                                                                */
                                        /*                                                                                           */
                                        /*                  A.X + B.Y + C.Z + D' = 0                                                 */
                                        /*                                                                                           */
                                        /* Connaissant trois points {X1,Y1,Z1}, {X2,Y2,Z2} et {X3,Y3,Z3} de ce plan, le systeme      */
                                        /* 3x3 a resoudre est donc le suivant :                                                      */
                                        /*                                                                                           */
                                        /*                  A.X1 + B.Y1 + C.Z1 = D                                                   */
                                        /*                  A.X2 + B.Y2 + C.Z2 = D                                                   */
                                        /*                  A.X3 + B.Y3 + C.Z3 = D                                                   */
                                        /*                                                                                           */
                                        /* ou {A,B,C} sont les trois inconnues ('D' etant fixe a 1 arbitrairement...).               */
                                        /*                                                                                           */
                                        /* Par exemple :                                                                             */
                                        /*                                                                                           */
                                        /*                  x1=1 y1=0.5 z1=0 x2=1 y2=1 z2=0.5 x3=0.5 y3=1 z3=1                       */
                                        /*                                                                                           */
                                        /* donne le plan :                                                                           */
                                        /*                                                                                           */
                                        /*                  A=+1.0000 B=-1.0000 C=+1.0000 D=+0.5000                                  */
                                        /*                                                                                           */
                                        /* c'est-a-dire :                                                                            */
                                        /*                                                                                           */
                                        /*                  A=2       B=-2      C=+2      D=+1                                       */
                                        /*                                                                                           */
                                        /*                  2.X - 2.Y + 2.Z - 1 =0                                                   */
                                        /*                                                                                           */
                                        /* c'est-a-dire le plan de coupe 'v $xci/coupe_3D$K MENG.32.5.1'...                          */

          DEFV(Float,INIT(determinant_M_,FLOT__UNDEF));
                                        /* Definition du determinant 'M' 3x3 a calculer.                                             */

          CALCUL_DU_DETERMINANT__M(FZERO);
                                        /* Premiere tentative de calcul exact du determinant 'M'.                                    */

          Test(IZEQ(determinant_M_))
               Bblock
               CALCUL_DU_DETERMINANT__M(epsilon_de_perturbation_du_determinant_M_nul);
                                        /* Seconde tentative de calcul des quatre determinants avec perturbations des coefficients   */
                                        /* {{X1,Y1,Z1},{X2,Y2,Z2},{X3,Y3,Z3}} destinees a eliminer (si possible) la nullite du       */
                                        /* determinant 'M'...                                                                        */

               Test(IZEQ(determinant_M_))
                    Bblock
                    PRINT_ATTENTION("le determinant 'M' reste nul malgre la perturbation");
                                        /* A la date du 20180703141244 je ne sais quoi faire d'autre qui soit simple...              */
                    Eblock
               ATes
                    Bblock
                    Eblock
               ETes
               Eblock
          ATes
               Bblock
               Eblock
          ETes

          Test(IZNE(determinant_M_))
               Bblock
               DEFV(Float,INIT(determinant_MA,FLOT__UNDEF));
               DEFV(Float,INIT(determinant_MB,FLOT__UNDEF));
               DEFV(Float,INIT(determinant_MC,FLOT__UNDEF));
                                        /* Definition des trois determinants 'A', 'B' et 'C' 3x3 a calculer.                         */

               CALCUL_DES_DETERMINANTS__MA_MB_MC;
               CALCUL_DES_VARIABLES_A_B_C;

               PRINT(INVERSION_DE_LA_SOLUTION(NEUT(NORMALISE(variable____A))),"A",editer_A);
               PRINT(INVERSION_DE_LA_SOLUTION(NEUT(NORMALISE(variable____B))),"B",editer_B);
               PRINT(INVERSION_DE_LA_SOLUTION(NEUT(NORMALISE(variable____C))),"C",editer_C);
               PRINT(INVERSION_DE_LA_SOLUTION(NEGA(NORMALISE(variable____D))),"D",editer_D);
                                        /* La normalisation des quatre variable par rapport a leur maximum permet en quelque         */
                                        /* sorte d'effacer les effets de 'epsilon_de_perturbation_du_determinant_M_nul' puis         */
                                        /* d'arrondir les valeurs calculees lors de l'edition...                                     */
                                        /*                                                                                           */
                                        /* Le 20180704091128, j'inverse 'D' car, en effet, dans la resolution du systeme             */
                                        /* d'equations il est dans le membre droit, alors que dans l'equation du plan, il            */
                                        /* est dans le membre gauche...                                                              */
               Eblock
          ATes
               Bblock
               Eblock
          ETes
          Eblock
     end_nouveau_block

     RETU_Commande;
     Eblock
ECommande



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