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