/*************************************************************************************************************************************/ /* */ /* G E N E R A T I O N D E V A L E U R S C O R R E S P O N D A N T */ /* A P A R C O U R S " T R I A N G U L A I R E " D ' U N E I M A G E : */ /* */ /* */ /* Definition : */ /* */ /* Cette commande donne comme resultat une */ /* liste des abscisses et des ordonnees {X,Y} */ /* decrivant les droites de pente -1. */ /* */ /* Elle permet, par exemple, de construire */ /* le tableau utilise pour demontrer que les */ /* rationnels sont denombrables, les coordonnees */ /* 'Y's donnant les numerateurs-1 et les coordonnees */ /* 'X's les denominateurs-1... */ /* */ /* */ /* Author of '$xci/valeurs_triangle$K' : */ /* */ /* Jean-Francois COLONNA (LACTAMME, 20140204154222). */ /* */ /*************************************************************************************************************************************/ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* 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" #include xci/coordonne.01.I" #define EDITER_DES_COORDONNEES_NORMALISEES \ VRAI \ /* Faut-il editer des coordonnees normalisees ('VRAI') ou denormalisees ('FAUX') ? */ #define PONDERATION_DE_X \ FU #define PONDERATION_DE_Y \ FZERO /* Ponderations respectives de 'X' et de 'Y'. */ #include xci/valeurs.01.I" /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* M A C R O S U T I L E S : */ /* */ /*************************************************************************************************************************************/ #include xci/valeurs.02.I" #define PENTE_DES_DROITES \ NEGA(FU) #define EQUATION_DES_DROITES(x) \ COYA(AXPB(PENTE_DES_DROITES,x,X_horizontal_courant)) /* Equation des droites paralleles a utiliser pour parcourir l'image... */ /* */ /* ^ */ /* Y| */ /* | */ /* |---------------------------- */ /* |\\\\\\\\\\\\\\\\\\\\\\\\\\\\| */ /* |\\\\\\\\\\\\\\\\\\\\\\\\\\\\| */ /* |\\\\\\\\\\\\\\\\\\\\\\\\\\\\| */ /* |\\\\\\\\\\\\\\\\\\\\\\\\\\\\| */ /* |\\\\\\\\\\\\\\\\\\\\\\\\\\\\| */ /* |\\\\\\\\\\\\\\\\\\\\\\\\\\\\| */ /* |\\\\\\\\\\\\\\\\\\\\\\\\\\\\| */ /* |\\\\\\\\\\\\\\\\\\\\\\\\\\\\| */ /* |\\\\\\\\\\\\\\\\\\\\\\\\\\\\| */ /* |\\\\\\\\\\\\\\\\\\\\\\\\\\\\| */ /* |\\\\\\\\\\\\\\\\\\\\\\\\\\\\| */ /* |\\\\\\\\\\\\\\\\\\\\\\\\\\\\| */ /* O--------------------------------------> */ /* X */ /* Les droites utilisees (et marquees ci-dessus) ont pour equation : */ /* */ /* Y = -X + N */ /* */ /* 'N' etant une variable qui balaye l'axe 'OX' vers la droite en partant de l'origine... */ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* G E N E R A T I O N D E V A L E U R S C O R R E S P O N D A N T */ /* A P A R C O U R S " T R I A N G U L A I R E " D ' U N E I M A G E : */ /* */ /*************************************************************************************************************************************/ BCommande(nombre_d_arguments,arguments) /*-----------------------------------------------------------------------------------------------------------------------------------*/ Bblock #include xci/coordonne.02.I" 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(editer_des_coordonnees_normalisees,EDITER_DES_COORDONNEES_NORMALISEES)); /* Faut-il editer des coordonnees normalisees ('VRAI') ou denormalisees ('FAUX') ? */ DEFV(Float,INIT(ponderation_de_X,PONDERATION_DE_X)); DEFV(Float,INIT(ponderation_de_Y,PONDERATION_DE_Y)); /* Ponderations respectives de 'X' et de 'Y'. */ #include xci/valeurs.03.I" /*..............................................................................................................................*/ #include xci/coordonne.04.I" GET_ARGUMENTSi(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("coordonnees_normalisees=""cn=",editer_des_coordonnees_normalisees); GET_ARGUMENT_N("coordonnees_denormalisees=""cdn=",editer_des_coordonnees_normalisees); GET_ARGUMENT_F("Px=""PX=",ponderation_de_X); GET_ARGUMENT_F("Py=""PY=",ponderation_de_Y); PROCESS_ARGUMENTS_DE_PARAMETRAGE_DE_LA_GENERATION_DE_SUITE_DE_VALEURS_1; ) ); Test(IFLE(premiere_image,derniere_image)) Bblock DEFV(Int,INIT(nombre_de_points_generes,ZERO)); /* Il est imperatif de compter les points car sinon, le processus boucle dans le cas */ /* ou les parametres {premiere_image,derniere_image,pas_des_images} impliqueraient plus */ /* de points que n'en contient l'image (soit 'dimXY'). */ DEFV(Int,INIT(X_horizontal_courant,Xmin)); DEFV(Int,INIT(X_courant,UNDEF)); DEFV(Int,INIT(Y_courant,UNDEF)); EGAL(X_courant,X_horizontal_courant); EGAL(Y_courant,EQUATION_DES_DROITES(X_courant)); #include xci/coordonne.03.I" DoIn(numero_d_image,premiere_image,derniere_image,pas_des_images) Bblock Test(IFLT(nombre_de_points_generes,dimXY)) Bblock DEFV(Logical,INIT(chercher_le_point_courant,VRAI)); Tant(IL_FAUT(chercher_le_point_courant)) Bblock Test(TEST_DANS_L_IMAGE(X_courant,Y_courant)) /* Evidemment, ne sont edites que les points situes dans l'image... */ Bblock Test(IL_FAUT(editer_des_coordonnees_normalisees)) Bblock CAL2(Prin2(Cara(chain_Aconcaten5(INTRODUCTION_FORMAT,valeurs_signees,".*",format_d_edition,"\n")) ,NOMBRE_DE_DECIMALES_EFFECTIF(nombre_de_decimales) ,MULTIPLE_DE(ENTIER_FLOTTANT(LIZ2(ponderation_de_X,SUPER_cNORMALISE_OX(X_courant) ,ponderation_de_Y,SUPER_cNORMALISE_OY(Y_courant) ) ) ) ) ); /* Et enfin, edition d'une combinaison lineaire des coordonnees du point courant. */ Eblock ATes Bblock CAL2(Prin1(Cara(chain_Aconcaten4(INTRODUCTION_FORMAT,valeurs_signees,"d","\n")) ,INTE(LIZ2(ponderation_de_X,FLOT(X_courant) ,ponderation_de_Y,FLOT(Y_courant) ) ) ) ); Eblock ETes INCR(nombre_de_points_generes,I); EGAL(chercher_le_point_courant,FAUX); /* Lorsqu'un point a ete edite, on peut passer au suivant... */ Eblock ATes Bblock /* Lorsque l'on est en presence d'un point qui est en dehors de l'image, celui-ci n'est */ /* evidemment pas compte... */ Eblock ETes Test(IFEQ(X_courant,Xmin)) Bblock EGAL(X_horizontal_courant,SUCX(X_horizontal_courant)); /* Cas ou l'on doit passer a la droite de pente -1 suivante (a droite). */ EGAL(X_courant,X_horizontal_courant); Eblock ATes Bblock EGAL(X_courant,PREX(X_courant)); /* Cas ou l'on peut encore se deplacer sur droite de pente -1 courante. */ Eblock ETes EGAL(Y_courant,EQUATION_DES_DROITES(X_courant)); /* Calcul du point courant {X_courant,Y_courant} de la droite grace a son equation... */ Eblock ETan Eblock ATes Bblock Eblock ETes Eblock EDoI Eblock ATes Bblock PRINT_ERREUR("la relation d'ordre stricte ('premier < dernier') n'est pas respectee"); Eblock ETes RETU_Commande; Eblock ECommande