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