/*************************************************************************************************************************************/
/* */
/* C O N V E R S I O N D E C O O R D O N N E E S E N I N D E X D E S P I R A L E */
/* E T I N V E R S E M E N T : */
/* */
/* */
/* Author of '$xci/spirale.11$K' : */
/* */
/* Jean-Francois COLONNA (LACTAMME, 1997??????????). */
/* */
/*************************************************************************************************************************************/
/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/* */
/* 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 : */
/* */
/*************************************************************************************************************************************/
#define COORDONNEE_X \
Xmin
#define COORDONNEE_Y \
Ymin
/* Coordonnees cartesiennes. */
#define INDEX_DE_LA_SPIRALE \
PREMIER_POINT
#define PAS_MOINS_1_DE_LA_SPIRALE \
NOMBRE_DE_POINTS_SAUTES_SUR_LA_SPIRALE
/* Index sur la spirale. */
#define CONVERTIR_DE_CARTESIENNES_EN_INDEX_DE_SPIRALE \
VRAI \
/* Indique si l'on convertit de cartesiennes en index de spirale ('VRAI') ou bien d'index */ \
/* de spirale en cartesiennes ('FAUX'). */
#define EDITER_COORDONNEE_X \
VRAI
#define EDITER_COORDONNEE_Y \
VRAI
#define EDITER_L_INDEX_DE_LA_SPIRALE \
VRAI
/* Controle de l'edition. */
/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/* */
/* M A C R O S U T I L E S : */
/* */
/*************************************************************************************************************************************/
#define EDITER(valeur,editer,message) \
Bblock \
Test(IL_FAUT(editer)) \
Bblock \
CAL2(Prin2("%s=%d\n",message,valeur)); \
Eblock \
ATes \
Bblock \
Eblock \
ETes \
Eblock \
/* Procedure d'edition conditionnelle. */
/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/* */
/* C O N V E R S I O N D E C O O R D O N N E E S E N I N D E X D E S P I R A L E */
/* E T I N V E R S E M E N T : */
/* */
/*************************************************************************************************************************************/
BCommande(nombre_d_arguments,arguments)
/*-----------------------------------------------------------------------------------------------------------------------------------*/
Bblock
DEFV(Int,INIT(coordonnee_X,COORDONNEE_X));
DEFV(Int,INIT(coordonnee_Y,COORDONNEE_Y));
/* Coordonnees cartesiennes. */
DEFV(Int,INIT(pas_moins_1_de_la_spirale,PAS_MOINS_1_DE_LA_SPIRALE));
DEFV(Int,INIT(index_de_la_spirale,INDEX_DE_LA_SPIRALE));
/* Index sur la spirale. */
DEFV(Logical,INIT(convertir_de_cartesiennes_en_index_de_spirale,CONVERTIR_DE_CARTESIENNES_EN_INDEX_DE_SPIRALE));
/* Indique si l'on convertit de cartesiennes en index de spirale ('VRAI') ou bien d'index */
/* de spirale en cartesiennes ('FAUX'). */
DEFV(Logical,INIT(editer_coordonnee_X,EDITER_COORDONNEE_X));
DEFV(Logical,INIT(editer_coordonnee_Y,EDITER_COORDONNEE_Y));
DEFV(Logical,INIT(editer_l_index_de_la_spirale,EDITER_L_INDEX_DE_LA_SPIRALE));
/* Controle de l'edition. */
/*..............................................................................................................................*/
GET_ARGUMENTS_(nombre_d_arguments
,BLOC(GET_ARGUMENT_I("x=""X=",coordonnee_X);
GET_ARGUMENT_I("y=""Y=",coordonnee_Y);
GET_ARGUMENT_I("index=",index_de_la_spirale);
GET_ARGUMENT_I("pas=",pas_moins_1_de_la_spirale);
GET_ARGUMENT_L("spirale=",convertir_de_cartesiennes_en_index_de_spirale);
GET_ARGUMENT_L("ex=""eX=",editer_coordonnee_X);
GET_ARGUMENT_L("ey=""eY=",editer_coordonnee_Y);
GET_ARGUMENT_L("espirale=""eS=""eI=",editer_l_index_de_la_spirale);
)
);
Test(IL_FAUT(convertir_de_cartesiennes_en_index_de_spirale))
Bblock
SPIRALE_DEFINITION
/* Donnees de generation d'une spirale de parcours d'une image. */
DEFV(pointI_2D,point_courant);
/* Point courant sur la spirale. */
DEFV(Int,INIT(nombre_de_points,ZERO));
/* Donne le nombre courant de points de la spirale. */
DEFV(Logical,INIT(parcourir_la_spirale,VRAI));
/* Afin d'eviter des bouclages trop longs sur la spirale. */
INITIALISATION_POINT_2D(point_courant,Xmin,Ymin);
/* Initialisation du point courant sur la spirale. */
SPIRALE_VALIDATION;
/* Validation des pas de parcours (pasX,pasY) des images. */
Tant(IL_FAUT(parcourir_la_spirale))
Bblock
INCR(nombre_de_points,I);
/* Et on calcule le nombre de points que l'on a traite. */
Test(IFET(IFEQ(coordonnee_X,ASD1(point_courant,x)),IFEQ(coordonnee_Y,ASD1(point_courant,y))))
Bblock
EGAL(parcourir_la_spirale,FAUX);
/* On a trouve : on peut donc s'arreter et editer... */
EDITER(coordonnee_X,editer_coordonnee_X,"x");
EDITER(coordonnee_Y,editer_coordonnee_Y,"y");
EDITER(index_de_la_spirale,editer_l_index_de_la_spirale,"index");
Eblock
ATes
Bblock
INCR(index_de_la_spirale,I);
/* Et on met a jour l'index sur la spirale... */
Test(IFGE(nombre_de_points,GRO4(dimXY)))
/* On notera que ce test est relativement arbitraire et n'est pas lie a au test */
/* 'TEST_DANS_L_IMAGE(...)' de 'point_courant' puisque l'initialisation de celui-ci */
/* est faite avec {Xmin,Ymin} et qu'ainsi les trois-quarts de la spirale sont en dehors */
/* du format d'image courant, d'ou le 'GRO4(...)'. */
Bblock
EGAL(parcourir_la_spirale,FAUX);
/* Lorsqu'on a traite trop de points on force l'arret. */
PRINT_ERREUR("le point n'a pas ete trouve sur la spirale courante, changer '$formatI'");
Eblock
ATes
Bblock
Eblock
ETes
Eblock
ETes
SPIRALE_DEPLACEMENT_ET_PARCOURS(ASD1(point_courant,x),ASD1(point_courant,y),pas_moins_1_de_la_spirale);
/* Deplacement du point courant de la spirale... */
Eblock
ETan
Eblock
ATes
Bblock
EDITER(iSPIRALE_X(index_de_la_spirale,pas_moins_1_de_la_spirale),editer_coordonnee_X,"x");
EDITER(iSPIRALE_Y(index_de_la_spirale,pas_moins_1_de_la_spirale),editer_coordonnee_Y,"y");
EDITER(index_de_la_spirale,editer_l_index_de_la_spirale,"index");
Eblock
ETes
RETU_Commande;
Eblock
ECommande