/*************************************************************************************************************************************/
/* */
/* R E F L E X I O N D ' U N T R I A N G L E : */
/* */
/* */
/* Definition : */
/* */
/* Pour chaque triplet de points {P,Q,R} */
/* (forme par trois coordonnees successives */
/* {X,Y} dans les deux fichiers Arguments) */
/* on calcule le symetrique de P par rapport */
/* a QR. Puis ensuite on se deplace dans les */
/* fichiers de facon a traiter le triplet */
/* suivant {Q,R,S} 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 Triangle" ne demande */
/* que trois points (un seul triangle) dans */
/* les fichiers... */
/* */
/* */
/* Author of '$xrv/ReflexionTriangle.01$K' : */
/* */
/* Jean-Francois COLONNA (LACTAMME, 20160722120508). */
/* */
/*************************************************************************************************************************************/
/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/* */
/* 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 (introduit le 20160723101911). */
#define PONDERATION_X \
FZERO
#define PONDERATION_Y \
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
gGENERATION_D_UN_FICHIER(fichier_LISTE_X,liste_initiale_des_X);
gGENERATION_D_UN_FICHIER(fichier_LISTE_Y,liste_initiale_des_Y);
/* 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)
/* 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);
/* 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)
/* 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 R I A N G L 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 (introduit le 20160723101911). */
DEFV(Float,INIT(ponderation_X,PONDERATION_X));
DEFV(Float,INIT(ponderation_Y,PONDERATION_Y));
/* 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
);
GET_ARGUMENT_I("passes=""iterations=",nombre_d_iterations_de_reflexion);
/* Arguments introduits le 20160723101911... */
GET_ARGUMENT_F("pX=""Pond1=",ponderation_X);
GET_ARGUMENT_F("pY=""Pond2=",ponderation_Y);
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 20211005104946... */
)
);
Test(IFGE(nombre_d_elements,TROIS))
Bblock
/* Test de validation introduit le 20160724111923... */
iGENERATION_D_UN_FICHIER(liste_intermediaire_des_X,X_IMPLICITE);
iGENERATION_D_UN_FICHIER(liste_intermediaire_des_Y,Y_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(index))));
DEFV(Int,INIT(indexQ
,MODS(NEUT(SUCC(index))
,PREMIER_ELEMENT_D_UN_FICHIER
,DERNIER_ELEMENT_D_UN_FICHIER
)
)
);
DEFV(Int,INIT(indexR
,MODS(SUCC(SUCC(index))
,PREMIER_ELEMENT_D_UN_FICHIER
,DERNIER_ELEMENT_D_UN_FICHIER
)
)
);
/* Index des sommets {P,Q,R} du triangle courant. */
DEFV(Float,INIT(XP,FLOT__UNDEF));
DEFV(Float,INIT(YP,FLOT__UNDEF));
DEFV(Float,INIT(XQ,FLOT__UNDEF));
DEFV(Float,INIT(YQ,FLOT__UNDEF));
DEFV(Float,INIT(XR,FLOT__UNDEF));
DEFV(Float,INIT(YR,FLOT__UNDEF));
/* Coordonnees des sommets {P,Q,R} du triangle courant. */
DEFV(Float,INIT(A_QR,FLOT__UNDEF));
DEFV(Float,INIT(B_QR,FLOT__UNDEF));
DEFV(complexe,AB_QR);
DEFV(Float,INIT(C_QR,FLOT__UNDEF));
/* Definition de la droite QR. */
DEFV(Float,INIT(A_pQR,FLOT__UNDEF));
DEFV(Float,INIT(B_pQR,FLOT__UNDEF));
DEFV(complexe,AB_pQR);
DEFV(Float,INIT(C_pQR,FLOT__UNDEF));
/* Definition de la droite perpendiculaire a la droite QR et passant par P. */
DEFV(Float,INIT(XI,FLOT__UNDEF));
DEFV(Float,INIT(YI,FLOT__UNDEF));
DEFV(Float,INIT(diviseur,FLOT__UNDEF));
/* Point d'intersection entre le droite QR et sa perpendiculaire passant par P. */
DEFV(Float,INIT(sXP,FLOT__UNDEF));
DEFV(Float,INIT(sYP,FLOT__UNDEF));
/* Point symetrique du point P par rapport a QR. */
EGAL(XP,ELEMENT_DU_FICHIER_LISTE_X(indexP));
EGAL(YP,ELEMENT_DU_FICHIER_LISTE_Y(indexP));
EGAL(XQ,ELEMENT_DU_FICHIER_LISTE_X(indexQ));
EGAL(YQ,ELEMENT_DU_FICHIER_LISTE_Y(indexQ));
EGAL(XR,ELEMENT_DU_FICHIER_LISTE_X(indexR));
EGAL(YR,ELEMENT_DU_FICHIER_LISTE_Y(indexR));
/* Recuperation des coordonnees des sommets {P,Q,R} du triangle courant. */
EGAL(A_QR,NEGA(SOUS(YR,YQ)));
EGAL(B_QR,NEUT(SOUS(XR,XQ)));
EGAL(C_QR
,DET2(NEUT(XQ),SOUS(XR,XQ)
,NEUT(YQ),SOUS(YR,YQ)
)
);
/* Equation de la droite QR (droite 1) : */
/* */
/* A1.x + B1.y + C1 = 0 */
/* */
/* -(YR-YQ).x + (XR-XQ).y + [XQ(YR-YQ) - YQ(XR-XQ)] = 0 */
/* */
Cinitialisation(AB_QR,A_QR,B_QR);
Cproduit(AB_pQR,AB_QR,C_____nombre_complexe__0_p1);
EGAL(A_pQR,Reelle(AB_pQR));
EGAL(B_pQR,Imaginaire(AB_pQR));
/* Jusqu'au 20160723100312, il y avait ici : */
/* */
/* EGAL(A_pQR,NEUT(B_QR)); */
/* EGAL(B_pQR,NEGA(A_QR)); */
/* */
/* qui est peut-etre plus rapide que ce qui le remplace a cette date et qui est beaucoup */
/* plus elegant en utilisant une rotation de +pi/2 via une multiplication par (0,1)... */
EGAL(C_pQR,NEGA(ADD2(MUL2(A_pQR,XP),MUL2(B_pQR,YP))));
/* Equation de la droite perpendiculaire a la droite QR et passant par P (droite 2) : */
/* */
/* A2.x + B2.y + C2 = 0 */
/* */
/* avec : */
/* */
/* A2.XP + B2.YP + C2 = 0 */
/* et : */
/* */
/* A2 = +B1 */
/* B2 = -A1 */
/* */
EGAL(diviseur,DET2(A_QR,B_QR,A_pQR,B_pQR));
Test(IZEQ(diviseur))
Bblock
PRINT_ERREUR("un determinant est nul");
/* En fait cela ne peut se produire que si : */
/* */
/* A_QRxB_pQR - B_QRxA_pQR = 0 */
/* */
/* soit : */
/* */
/* A_QRx(-A_QR) - B_QRxB_QR = 0 */
/* */
/* ou encore : */
/* */
/* 2 2 */
/* A_QR + B_QR = 0 */
/* */
/* ce qui ne peut donc se produire que si : */
/* */
/* A_QR = B_QR = 0 */
/* */
/* ou encore : */
/* */
/* XQ = XR */
/* YQ = YR */
/* */
/* ce qui veut dire que les points Q et R sont confondus... */
Eblock
ATes
Bblock
Eblock
ETes
EGAL(XI,DIVZ(DET2(B_QR,C_QR,B_pQR,C_pQR),diviseur));
EGAL(YI,DIVZ(DET2(C_QR,A_QR,C_pQR,A_pQR),diviseur));
/* Point d'intersection entre le droite QR et sa perpendiculaire passant par P. */
EGAL(sXP,AMOY(XI,XP));
EGAL(sYP,AMOY(YI,YP));
/* Point symetrique du point P par rapport a QR. */
EGAL(ELEMENT_DU_FICHIER_INTERMEDIAIRE_LISTE_X(index),sXP);
EGAL(ELEMENT_DU_FICHIER_INTERMEDIAIRE_LISTE_Y(index),sYP);
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));
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(LIZ2(ponderation_X,ELEMENT_DU_FICHIER_LISTE_X(index)
,ponderation_Y,ELEMENT_DU_FICHIER_LISTE_Y(index)
)
);
/* Introduit sous cette forme le 20160804093557... */
Eblock
EDoI
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 3 elements dans chaque fichier");
Eblock
ETes
lGENERATION_D_UN_FICHIER(liste_initiale_des_Y,Y_IMPLICITE);
lGENERATION_D_UN_FICHIER(liste_initiale_des_X,X_IMPLICITE);
RETU_Commande;
Eblock
ECommande