/*************************************************************************************************************************************/ /* */ /* G E N E R A T I O N D E R E C T A N G L E S D ' O R : */ /* */ /* */ /* Author of '$xci/valeurs_RectangleOr$K' : */ /* */ /* Jean-Francois COLONNA (LACTAMME, 20171212140008). */ /* */ /*************************************************************************************************************************************/ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* 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 /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* P A R A M E T R E S : */ /* */ /*************************************************************************************************************************************/ #include xci/sequence.01.I" #define INVERSER_L_AXE_OX \ FAUX #define INVERSER_L_AXE_OY \ FAUX /* Afin de permettre d'inverser les axes 'OX' et 'OY' (introduit le 20171213110412). */ #define TRANSLATION_OX \ FZERO #define TRANSLATION_OY \ FZERO /* Afin de permettre de translater les axes 'OX' et 'OY' (introduit le 20171213114417). */ #define CENTRER_LE_PREMIER_RECTANGLE \ VRAI #define X_SOMMET_BAS_GAUCHE \ FXmin #define Y_SOMMET_BAS_GAUCHE \ FYmin /* Definition du sommet en bas et a gauche. */ #define COTE_HORIZONTAL \ NOMBRE_D_OR #define COTE_VERTICAL__ \ FU /* Definition des deux cotes d'un rectangle. */ #define RAPPORT_DE_REDUCTION \ NOMBRE_D_OR \ /* Definition du rapport de reduction. */ #define EDITER_LES_COTES \ VRAI #define EDITER_LES_SOMMETS \ VRAI /* Controle des editions... */ #include xci/valeurs.01.I" /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* M A C R O S U T I L E S : */ /* */ /*************************************************************************************************************************************/ #include xci/valeurs.02.I" #define INVERSER_EVENTUELLEMENT_OX(deplacement) \ MUL2(COND(IL_FAUT(inverser_l_axe_OX),NEGA(FU),NEUT(FU)),deplacement) #define INVERSER_EVENTUELLEMENT_OY(deplacement) \ MUL2(COND(IL_FAUT(inverser_l_axe_OY),NEGA(FU),NEUT(FU)),deplacement) /* Introduit le 20171213110412 pour permettre l'inversion eventuelle des axes. Etant */ /* donne qu'il y a quatre possibilites, on peut ainsi simuler 'v $xci/tapisserie$K' comme */ /* le montre l'image 'v $xiirv/REOR.21'... */ #define EDITION_DES_COTES(editer,format_coordonnees_normalisees,cote) \ Bblock \ Test(IL_FAUT(editer_les_cotes)) \ Bblock \ Test(IL_FAUT(editer)) \ Bblock \ CAL2(Prin1(format_coordonnees_normalisees \ ,cote \ ) \ ); \ CAL2(Prin0("\n")); \ Eblock \ ATes \ Bblock \ Eblock \ ETes \ Eblock \ ATes \ Bblock \ Eblock \ ETes \ Eblock \ /* Edition des coordonnees des segments. */ #define EDITION_DES_COORDONNEES_DES_SOMMETS(editer,format_coordonnees_normalisees,X,Y) \ Bblock \ Test(IL_FAUT(editer_les_sommets)) \ Bblock \ Test(IL_FAUT(editer)) \ Bblock \ CAL2(Prin2(format_coordonnees_normalisees \ ,X \ ,Y \ ) \ ); \ CAL2(Prin0("\n")); \ Eblock \ ATes \ Bblock \ Eblock \ ETes \ Eblock \ ATes \ Bblock \ Eblock \ ETes \ Eblock \ /* Edition des coordonnees des segments. */ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* G E N E R A T I O N D E R E C T A N G L E S D ' O R : */ /* */ /*************************************************************************************************************************************/ BCommande(nombre_d_arguments,arguments) /*-----------------------------------------------------------------------------------------------------------------------------------*/ Bblock DEFV(Int,INIT(premiere_image,PREMIERE_IMAGE)); /* Numero de la premiere image, */ DEFV(Int,INIT(derniere_image,DERNIERE_IMAGE)); /* Numero de la derniere image. */ DEFV(Int,INIT(numero_d_image,UNDEF)); /* Numero de l'image courante. */ DEFV(Int,INIT(pas_des_images,PAS_DES_IMAGES)); /* Pas de passage d'un numero d'image a une autre. */ DEFV(Logical,INIT(inverser_l_axe_OX,INVERSER_L_AXE_OX)); DEFV(Logical,INIT(inverser_l_axe_OY,INVERSER_L_AXE_OY)); /* Afin de permettre d'inverser les axes 'OX' et 'OY' (introduit le 20171213110412). */ DEFV(Float,INIT(translation_OX,TRANSLATION_OX)); DEFV(Float,INIT(translation_OY,TRANSLATION_OY)); /* Afin de permettre de translater les axes 'OX' et 'OY' (introduit le 20171213114417). */ DEFV(Logical,INIT(centrer_le_premier_rectangle,CENTRER_LE_PREMIER_RECTANGLE)); DEFV(Float,INIT(X_sommet_bas_gauche,X_SOMMET_BAS_GAUCHE)); DEFV(Float,INIT(Y_sommet_bas_gauche,Y_SOMMET_BAS_GAUCHE)); /* Definition du sommet en bas et a gauche. */ DEFV(Float,INIT(cote_horizontal,COTE_HORIZONTAL)); DEFV(Float,INIT(cote_vertical__,COTE_VERTICAL__)); /* Definition des deux cotes d'un rectangle. */ DEFV(Float,INIT(rapport_de_reduction,RAPPORT_DE_REDUCTION)); /* Rapport de passage d'un nombre au suivant. */ DEFV(Local,DEFV(Logical,INIT(editer_les_cotes,EDITER_LES_COTES))); DEFV(Local,DEFV(Logical,INIT(editer_les_sommets,EDITER_LES_SOMMETS))); /* Controle des editions... */ #include xci/valeurs.03.I" /*..............................................................................................................................*/ GET_ARGUMENTS_(nombre_d_arguments ,BLOC(GET_ARGUMENT_I("premiere=""p=""D=",premiere_image); GET_ARGUMENT_I("derniere=""d=""A=",derniere_image); GET_ARGUMENT_I("pas=",pas_des_images); GET_ARGUMENT_L("inverserX=""iX=",inverser_l_axe_OX); GET_ARGUMENT_L("inverserY=""iY=",inverser_l_axe_OY); /* Arguments introduits le 20171213110412... */ GET_ARGUMENT_F("translationX=""tX=",translation_OX); GET_ARGUMENT_F("translationY=""tY=",translation_OY); /* Arguments introduits le 20171213114417... */ GET_ARGUMENT_L("centrer=",centrer_le_premier_rectangle); GET_ARGUMENT_F("X_sommet_bas_gauche=""Xsbg=",X_sommet_bas_gauche); GET_ARGUMENT_F("Y_sommet_bas_gauche=""Ysbg=",Y_sommet_bas_gauche); GET_ARGUMENT_F("cote_horizontal=""ch=",cote_horizontal); GET_ARGUMENT_F("cote_vertical=""cv=",cote_vertical__); GET_ARGUMENT_F("rapport=""r=",rapport_de_reduction); GET_ARGUMENT_L("editer_cotes=""cotes=",editer_les_cotes); GET_ARGUMENT_L("editer_sommets=""sommets=",editer_les_sommets); ) ); Test(IL_FAUT(centrer_le_premier_rectangle)) Bblock EGAL(X_sommet_bas_gauche,ADD2(SOUS(FXmilieu,INVERSER_EVENTUELLEMENT_OX(MOIT(cote_horizontal))),translation_OX)); EGAL(Y_sommet_bas_gauche,ADD2(SOUS(FYmilieu,INVERSER_EVENTUELLEMENT_OY(MOIT(cote_vertical__))),translation_OY)); Eblock ATes Bblock Eblock ETes begin_nouveau_block Bblock DEFV(Float,INIT(cote_horizontal_courant,cote_horizontal)); DEFV(Float,INIT(cote_vertical___courant,cote_vertical__)); /* Definition des deux cotes d'un rectangle. */ DEFV(pointF_2D,sommet_A); DEFV(pointF_2D,sommet_B); DEFV(pointF_2D,sommet_C); DEFV(pointF_2D,sommet_D); /* Definition des sommets du rectangle. */ INITIALISATION_POINT_2D(sommet_A,NEUT(X_sommet_bas_gauche),NEUT(Y_sommet_bas_gauche)); /* Initialisation du sommet 'A' qui ne changera pas au cours des iterations... */ Test(IFLE(premiere_image,derniere_image)) Bblock DoIn(numero_d_image,premiere_image,derniere_image,pas_des_images) Bblock INITIALISATION_POINT_2D(sommet_B ,ADD2(ASD1(sommet_A,x),INVERSER_EVENTUELLEMENT_OX(cote_horizontal_courant)) ,NEUT(ASD1(sommet_A,y)) ); INITIALISATION_POINT_2D(sommet_C ,NEUT(ASD1(sommet_B,x)) ,ADD2(ASD1(sommet_B,y),INVERSER_EVENTUELLEMENT_OY(cote_vertical___courant)) ); INITIALISATION_POINT_2D(sommet_D ,SOUS(ASD1(sommet_C,x),INVERSER_EVENTUELLEMENT_OX(cote_horizontal_courant)) ,NEUT(ASD1(sommet_C,y)) ); /* Calcul des sommets 'B', 'C' et 'D' qui se deplacent au cours des iterations... */ EDITION_DES_COTES(VRAI,"CoteHorizontal=%+.^^^",cote_horizontal_courant); EDITION_DES_COTES(VRAI,"CoteVertical=%+.^^^",cote_vertical___courant); EDITION_DES_COORDONNEES_DES_SOMMETS(VRAI,"xA=%+.^^^ yA=%+.^^^",ASD1(sommet_A,x),ASD1(sommet_A,y)); EDITION_DES_COORDONNEES_DES_SOMMETS(VRAI,"xB=%+.^^^ yB=%+.^^^",ASD1(sommet_B,x),ASD1(sommet_B,y)); EDITION_DES_COORDONNEES_DES_SOMMETS(VRAI,"xB=%+.^^^ yB=%+.^^^",ASD1(sommet_B,x),ASD1(sommet_B,y)); EDITION_DES_COORDONNEES_DES_SOMMETS(VRAI,"xC=%+.^^^ yC=%+.^^^",ASD1(sommet_C,x),ASD1(sommet_C,y)); EDITION_DES_COORDONNEES_DES_SOMMETS(VRAI,"xC=%+.^^^ yC=%+.^^^",ASD1(sommet_C,x),ASD1(sommet_C,y)); EDITION_DES_COORDONNEES_DES_SOMMETS(VRAI,"xD=%+.^^^ yD=%+.^^^",ASD1(sommet_D,x),ASD1(sommet_D,y)); EDITION_DES_COORDONNEES_DES_SOMMETS(VRAI,"xD=%+.^^^ yD=%+.^^^",ASD1(sommet_D,x),ASD1(sommet_D,y)); EDITION_DES_COORDONNEES_DES_SOMMETS(VRAI,"xA=%+.^^^ yA=%+.^^^",ASD1(sommet_A,x),ASD1(sommet_A,y)); fSWAP(cote_horizontal_courant,cote_vertical___courant); EGAL(cote_horizontal_courant,DIVI(cote_horizontal_courant,rapport_de_reduction)); EGAL(cote_vertical___courant,DIVI(cote_vertical___courant,rapport_de_reduction)); /* Rotation et reduction... */ Eblock EDoI Eblock ATes Bblock PRINT_ERREUR("la relation d'ordre stricte ('premier < dernier') n'est pas respectee"); Eblock ETes Eblock end_nouveau_block RETU_Commande; Eblock ECommande