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