/*************************************************************************************************************************************/ /* */ /* R E F L E X I O N D ' U N T E T R A E D R E : */ /* */ /* */ /* Definition : */ /* */ /* Pour chaque quadruplet de points {P,Q,R,S} */ /* (forme par quatre coordonnees successives */ /* {X,Y,Z} dans les trois fichiers Arguments) */ /* on calcule le symetrique de P par rapport */ /* a QRS. Puis ensuite on se deplace dans les */ /* fichiers de facon a traiter le quadruplet */ /* suivant {Q,R,S,T} et ainsi de suite. On */ /* notera que les fichiers sont exploites */ /* "modulo" de facon a revenir au debut si */ /* besoin est. Enfin, l'utilisation normale, */ /* dite "Refelxion d'un Tetraedre" ne demande */ /* que quatre points (un seul tetraedre) dans */ /* les fichiers... */ /* */ /* */ /* Author of '$xrv/ReflexionTetraedre.01$K' : */ /* */ /* Jean-Francois COLONNA (LACTAMME, 20160724093205). */ /* */ /*************************************************************************************************************************************/ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* I N T E R F A C E ' listG ' : */ /* */ /* */ /* :Debut_listG: */ /* :Fin_listG: */ /* */ /*************************************************************************************************************************************/ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* D I R E C T I V E S S P E C I F I Q U E S D E C O M P I L A T I O N : */ /* */ /*************************************************************************************************************************************/ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* F I C H I E R S D ' I N C L U D E S : */ /* */ /*************************************************************************************************************************************/ #include INCLUDES_BASE /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* V A L E U R S I M P L I C I T E S D E S P A R A M E T R E S : */ /* */ /*************************************************************************************************************************************/ #define NOMBRE_D_ITERATIONS_DE_REFLEXION \ UN \ /* Nombre d'iterations de reflexion. */ #define PONDERATION_X \ FZERO #define PONDERATION_Y \ FZERO #define PONDERATION_Z \ FZERO /* Ponderation de selection des coordonnees apres transformation. */ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* D E F I N I T I O N D E S F I C H I E R S : */ /* */ /*************************************************************************************************************************************/ #include xrv/ARITHMET.1d.I" #include xrv/ARITHMET.21.I" #include xrv/champs_5.41.I" #define X_IMPLICITE \ FZERO #define Y_IMPLICITE \ FZERO #define Z_IMPLICITE \ FZERO 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); /* 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) /* Acces a un element courant des fichiers de coordonnees cartesiennes. */ gGENERATION_D_UN_FICHIER(fichier_intermediaire_LISTE_X,liste_intermediaire_des_X); gGENERATION_D_UN_FICHIER(fichier_intermediaire_LISTE_Y,liste_intermediaire_des_Y); gGENERATION_D_UN_FICHIER(fichier_intermediaire_LISTE_Z,liste_intermediaire_des_Z); /* Definition en memoire des fichiers de coordonnees cartesiennes intermediaires. */ #define ELEMENT_DU_FICHIER_INTERMEDIAIRE_LISTE_X(index) \ gELEMENT_DU_FICHIER(liste_intermediaire_des_X,index) #define ELEMENT_DU_FICHIER_INTERMEDIAIRE_LISTE_Y(index) \ gELEMENT_DU_FICHIER(liste_intermediaire_des_Y,index) #define ELEMENT_DU_FICHIER_INTERMEDIAIRE_LISTE_Z(index) \ gELEMENT_DU_FICHIER(liste_intermediaire_des_Z,index) /* Acces a un element courant des fichiers de coordonnees cartesiennes intermediaires. */ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* M A C R O S U T I L E S : */ /* */ /*************************************************************************************************************************************/ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* R E F L E X I O N D ' U N T E T R A E D R E : */ /* */ /*************************************************************************************************************************************/ BCommande(nombre_d_arguments,arguments) /*-----------------------------------------------------------------------------------------------------------------------------------*/ Bblock #include xrv/ARITHMET.22.I" #include xci/valeurs.03.I" DEFV(Int,INIT(nombre_d_iterations_de_reflexion,NOMBRE_D_ITERATIONS_DE_REFLEXION)); /* Nombre d'iterations de reflexion. */ DEFV(Float,INIT(ponderation_X,PONDERATION_X)); DEFV(Float,INIT(ponderation_Y,PONDERATION_Y)); DEFV(Float,INIT(ponderation_Z,PONDERATION_Z)); /* Ponderation de selection des coordonnees apres transformation. */ /*..............................................................................................................................*/ #include xrv/champs_5.1A.I" GET_ARGUMENTS_(nombre_d_arguments ,BLOC(PROCESS_ARGUMENT_I("nombre_elements=""ne=",nombre_d_elements ,BLOC(VIDE;) ,BLOC(Bblock PRINT_AVERTISSEMENT("'ne=' doit etre defini avant toute entree de fichiers"); Eblock ) ); PROCESS_ARGUMENTS_DE_DEFINITION_DES_FICHIERS_01; PROKESF_ARGUMENT_FICHIER("LISTE_X=" ,fichier_LISTE_X ,liste_initiale_des_X ,X_IMPLICITE ,lTRANSFORMAT_0d ,iGENERATION_D_UN_FICHIER ); PROKESF_ARGUMENT_FICHIER("LISTE_Y=" ,fichier_LISTE_Y ,liste_initiale_des_Y ,Y_IMPLICITE ,lTRANSFORMAT_0d ,iGENERATION_D_UN_FICHIER ); PROKESF_ARGUMENT_FICHIER("LISTE_Z=" ,fichier_LISTE_Z ,liste_initiale_des_Z ,Z_IMPLICITE ,lTRANSFORMAT_0d ,iGENERATION_D_UN_FICHIER ); GET_ARGUMENT_I("passes=""iterations=",nombre_d_iterations_de_reflexion); /* Arguments introduits le 20160727132241... */ GET_ARGUMENT_F("pX=""Pond1=",ponderation_X); GET_ARGUMENT_F("pY=""Pond2=",ponderation_Y); GET_ARGUMENT_F("pZ=""Pond3=",ponderation_Z); PROCESS_ARGUMENTS_DE_PARAMETRAGE_DE_LA_GENERATION_DE_SUITE_DE_VALEURS_3; PROCESS_ARGUMENTS_DE_PARAMETRAGE_DE_LA_GENERATION_DE_SUITE_DE_VALEURS_1; PROCESS_ARGUMENTS_DE_PARAMETRAGE_DE_LA_GENERATION_DE_SUITE_DE_VALEURS_5; /* Cette procedure fut introduite le 20211005104937... */ ) ); Test(IFGE(nombre_d_elements,QUATRE)) Bblock /* Test de validation introduit le 20160724111914... */ iGENERATION_D_UN_FICHIER(liste_intermediaire_des_X,X_IMPLICITE); iGENERATION_D_UN_FICHIER(liste_intermediaire_des_Y,Y_IMPLICITE); iGENERATION_D_UN_FICHIER(liste_intermediaire_des_Z,Z_IMPLICITE); Repe(nombre_d_iterations_de_reflexion) Bblock DoIn(index ,premier_element_d_un_fichier ,DERNIER_ELEMENT_D_UN_FICHIER ,pas_de_parcours_d_un_fichier ) Bblock DEFV(Int,INIT(indexP,NEUT(NEUT(NEUT(index))))); DEFV(Int,INIT(indexQ ,MODS(NEUT(NEUT(SUCC(index))) ,PREMIER_ELEMENT_D_UN_FICHIER ,DERNIER_ELEMENT_D_UN_FICHIER ) ) ); DEFV(Int,INIT(indexR ,MODS(NEUT(SUCC(SUCC(index))) ,PREMIER_ELEMENT_D_UN_FICHIER ,DERNIER_ELEMENT_D_UN_FICHIER ) ) ); DEFV(Int,INIT(indexS ,MODS(SUCC(SUCC(SUCC(index))) ,PREMIER_ELEMENT_D_UN_FICHIER ,DERNIER_ELEMENT_D_UN_FICHIER ) ) ); /* Index des sommets {P,Q,R,S} du tetraedre courant. */ DEFV(Float,INIT(XP,FLOT__UNDEF)); DEFV(Float,INIT(YP,FLOT__UNDEF)); DEFV(Float,INIT(ZP,FLOT__UNDEF)); DEFV(Float,INIT(XQ,FLOT__UNDEF)); DEFV(Float,INIT(YQ,FLOT__UNDEF)); DEFV(Float,INIT(ZQ,FLOT__UNDEF)); DEFV(Float,INIT(XR,FLOT__UNDEF)); DEFV(Float,INIT(YR,FLOT__UNDEF)); DEFV(Float,INIT(ZR,FLOT__UNDEF)); DEFV(Float,INIT(XS,FLOT__UNDEF)); DEFV(Float,INIT(YS,FLOT__UNDEF)); DEFV(Float,INIT(ZS,FLOT__UNDEF)); /* Coordonnees des sommets {P,Q,R,S} du tetraedre courant. */ DEFV(Float,INIT(A_QRS,FLOT__UNDEF)); DEFV(Float,INIT(B_QRS,FLOT__UNDEF)); DEFV(Float,INIT(C_QRS,FLOT__UNDEF)); DEFV(Float,INIT(D_QRS,FLOT__UNDEF)); /* Definition du plan QRS. */ DEFV(Float,INIT(A_pQRS,FLOT__UNDEF)); DEFV(Float,INIT(B_pQRS,FLOT__UNDEF)); DEFV(Float,INIT(C_pQRS,FLOT__UNDEF)); DEFV(Float,INIT(diviseur,FLOT__UNDEF)); DEFV(Float,INIT(multiplicateur,FLOT__UNDEF)); /* Definition de la droite perpendiculaire au plan QRS et passant par P. */ DEFV(Float,INIT(XI,FLOT__UNDEF)); DEFV(Float,INIT(YI,FLOT__UNDEF)); DEFV(Float,INIT(ZI,FLOT__UNDEF)); /* Point d'intersection entre le plan QRS et sa perpendiculaire passant par P. */ DEFV(Float,INIT(sXP,FLOT__UNDEF)); DEFV(Float,INIT(sYP,FLOT__UNDEF)); DEFV(Float,INIT(sZP,FLOT__UNDEF)); /* Point symetrique du point P par rapport a QRS. */ EGAL(XP,ELEMENT_DU_FICHIER_LISTE_X(indexP)); EGAL(YP,ELEMENT_DU_FICHIER_LISTE_Y(indexP)); EGAL(ZP,ELEMENT_DU_FICHIER_LISTE_Z(indexP)); EGAL(XQ,ELEMENT_DU_FICHIER_LISTE_X(indexQ)); EGAL(YQ,ELEMENT_DU_FICHIER_LISTE_Y(indexQ)); EGAL(ZQ,ELEMENT_DU_FICHIER_LISTE_Z(indexQ)); EGAL(XR,ELEMENT_DU_FICHIER_LISTE_X(indexR)); EGAL(YR,ELEMENT_DU_FICHIER_LISTE_Y(indexR)); EGAL(ZR,ELEMENT_DU_FICHIER_LISTE_Z(indexR)); EGAL(XS,ELEMENT_DU_FICHIER_LISTE_X(indexS)); EGAL(YS,ELEMENT_DU_FICHIER_LISTE_Y(indexS)); EGAL(ZS,ELEMENT_DU_FICHIER_LISTE_Z(indexS)); /* Recuperation des coordonnees des sommets {P,Q,R,S} du tetraedre courant. */ EGAL(A_QRS ,NEUT(DET2(SOUS(YR,YQ),SOUS(ZR,ZQ) ,SOUS(YS,YQ),SOUS(ZS,ZQ) ) ) ); EGAL(B_QRS ,NEGA(DET2(SOUS(XR,XQ),SOUS(ZR,ZQ) ,SOUS(XS,XQ),SOUS(ZS,ZQ) ) ) ); EGAL(C_QRS ,NEUT(DET2(SOUS(XR,XQ),SOUS(YR,YQ) ,SOUS(XS,XQ),SOUS(YS,YQ) ) ) ); EGAL(D_QRS ,NEGA(LIZ3(A_QRS,XQ ,B_QRS,YQ ,C_QRS,ZQ ) ) ); /* Equation du plan QRS : */ /* */ /* | x - XQ y - YQ z - ZQ | */ /* | XR - XQ YR - YQ ZR - ZQ | = 0 */ /* | XS - XQ YS - YQ ZS - ZQ | */ /* */ /* soit : */ /* */ /* A.x + B.y + C.z + D = 0 */ /* */ EGAL(A_pQRS,A_QRS); EGAL(B_pQRS,B_QRS); EGAL(C_pQRS,C_QRS); /* Equation de la droite perpendiculaire au plan QRS et passant par P : */ /* */ /* x - XP y - YP z - ZP */ /* -------- = -------- = -------- */ /* A B C */ /* */ EGAL(diviseur ,LIZ3(A_QRS,A_pQRS ,B_QRS,B_pQRS ,C_QRS,C_pQRS ) ); Test(IZEQ(diviseur)) Bblock PRINT_ERREUR("le plan QRS est indetermine"); Eblock ATes Bblock Eblock ETes EGAL(multiplicateur ,DIVZ(LIN3(A_QRS,XP ,B_QRS,YP ,C_QRS,ZP ,D_QRS ) ,diviseur ) ); EGAL(XI,SOUS(XP,MUL2(multiplicateur,A_pQRS))); EGAL(YI,SOUS(YP,MUL2(multiplicateur,B_pQRS))); EGAL(ZI,SOUS(ZP,MUL2(multiplicateur,C_pQRS))); /* Point d'intersection entre le plan QRS et sa perpendiculaire passant par P. */ EGAL(sXP,AMOY(XI,XP)); EGAL(sYP,AMOY(YI,YP)); EGAL(sZP,AMOY(ZI,ZP)); /* Point symetrique du point P par rapport a QRS. */ EGAL(ELEMENT_DU_FICHIER_INTERMEDIAIRE_LISTE_X(index),sXP); EGAL(ELEMENT_DU_FICHIER_INTERMEDIAIRE_LISTE_Y(index),sYP); EGAL(ELEMENT_DU_FICHIER_INTERMEDIAIRE_LISTE_Z(index),sZP); Eblock EDoI DoIn(index ,PREMIER_ELEMENT_D_UN_FICHIER ,DERNIER_ELEMENT_D_UN_FICHIER ,I ) Bblock EGAL(ELEMENT_DU_FICHIER_LISTE_X(index),ELEMENT_DU_FICHIER_INTERMEDIAIRE_LISTE_X(index)); EGAL(ELEMENT_DU_FICHIER_LISTE_Y(index),ELEMENT_DU_FICHIER_INTERMEDIAIRE_LISTE_Y(index)); EGAL(ELEMENT_DU_FICHIER_LISTE_Z(index),ELEMENT_DU_FICHIER_INTERMEDIAIRE_LISTE_Z(index)); Eblock EDoI Eblock ERep DoIn(index ,PREMIER_ELEMENT_D_UN_FICHIER ,DERNIER_ELEMENT_D_UN_FICHIER ,I ) Bblock EDITION_DANS_gOPERATION_SUR_LES_FICHIERS_AVEC_SAUT_DE_LIGNE(LIZ3(ponderation_X,ELEMENT_DU_FICHIER_LISTE_X(index) ,ponderation_Y,ELEMENT_DU_FICHIER_LISTE_Y(index) ,ponderation_Z,ELEMENT_DU_FICHIER_LISTE_Z(index) ) ); /* Introduit sous cette forme le 20160804093448... */ Eblock EDoI lGENERATION_D_UN_FICHIER(liste_intermediaire_des_Z,Z_IMPLICITE); lGENERATION_D_UN_FICHIER(liste_intermediaire_des_Y,Y_IMPLICITE); lGENERATION_D_UN_FICHIER(liste_intermediaire_des_X,X_IMPLICITE); Eblock ATes Bblock PRINT_ERREUR("rien n'est fait car il faut au moins 4 elements dans chaque fichier"); Eblock ETes 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