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