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