/*************************************************************************************************************************************/
/* */
/* G E N E R A T I O N D ' U N E S P I R A L E C E N T R E E : */
/* */
/* */
/* Author of '$xci/spirale.02$K' : */
/* */
/* Jean-Francois COLONNA (LACTAMME, 1994??????????). */
/* */
/*************************************************************************************************************************************/
/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/* */
/* 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 LA_SPIRALE_EST_CARREE \
VRAI \
/* Est-ce une spirale carree ('VRAI') ou circulaire ('FAUX'). */
#define NOMBRE_DE_POINTS_A_GENERER \
UN \
/* Nombre de points de la spirale. */
#define FACTEUR_D_APPROXIMATION_DU_RAYON_D_UNE_SPIRALE_CIRCULAIRE \
FRA1(FRA10(FU)) \
/* Facteur d'approximation du rayon d'une spirale circulaire. */
/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/* */
/* M A C R O S U T I L E S : */
/* */
/*************************************************************************************************************************************/
#define INITIALISATION_D_UNE_SPIRALE_CIRCULAIRE \
Bblock \
EGAL(X_courant,Xcentre); \
EGAL(Y_courant,Ycentre); \
/* Definition du point courant sur la spirale initialise au centre. */ \
SPIRALE_REINITIALISATION_BRAS_ET_DELTAS; \
SPIRALE_REINITIALISATION_COMPTAGE; \
/* (re-)initialisation de la spirale. */ \
CLIR(nombre_de_points_deja_generes); \
/* Nombre de points de la spirale deja generes... */ \
Eblock \
/* Nombre de points de la spirale. */
/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/* */
/* G E N E R A T I O N D ' U N E S P I R A L E C E N T R E E : */
/* */
/*************************************************************************************************************************************/
BCommande(nombre_d_arguments,arguments)
/*-----------------------------------------------------------------------------------------------------------------------------------*/
Bblock
DEFV(CHAR,INIC(POINTERc(nom_imageR),NOM_PIPE));
DEFV(Logical,INIT(la_spirale_est_carree,LA_SPIRALE_EST_CARREE));
/* Est-ce une spirale carree ('VRAI') ou circulaire ('FAUX'). */
DEFV(Positive,INIT(nombre_de_points_a_generer,NOMBRE_DE_POINTS_A_GENERER));
/* Nombre de points de la spirale a generer. */
DEFV(Float,INIT(facteur_d_approximation_du_rayon_d_une_spirale_circulaire
,FACTEUR_D_APPROXIMATION_DU_RAYON_D_UNE_SPIRALE_CIRCULAIRE
)
);
/* Facteur d'approximation du rayon d'une spirale circulaire. */
DEFV(Positive,INIT(nombre_de_points_deja_generes,ZERO));
/* Nombre de points de la spirale deja traces. */
DEFV(Int,INIT(X_courant,Xcentre));
DEFV(Int,INIT(Y_courant,Ycentre));
/* Definition du point courant sur la spirale initialise au centre. Cette initialisation */
/* est utilisee lors de la generation d'une spirale carree (pour une spirale circulaire, */
/* cela est fait dynamiquement...). */
DEFV(Float,INIT(rayon_de_la_spirale,FLOT__UNDEF));
/* Rayon de la spirale quant elle est circulaire... */
SPIRALE_DEFINITION
/* Donnees de generation d'une spirale de parcours d'une image. */
/*..............................................................................................................................*/
GET_ARGUMENTSi(nombre_d_arguments
,BLOC(GET_ARGUMENT_C("imageR=""R=",nom_imageR);
GET_ARGUMENT_L("spirale_carree=""scarree=",la_spirale_est_carree);
/* Le 20060118093222, "carree=" a ete remplace par "spirale_carree=" et "scarree=" */
/* (risque de double definition...). */
GET_ARGUMENT_I("points=",nombre_de_points_a_generer);
GET_ARGUMENT_F("facteur=",facteur_d_approximation_du_rayon_d_une_spirale_circulaire);
)
);
CALi(Inoir(ImageR));
/* Initialisation de l'image Resultat. */
SPIRALE_VALIDATION;
/* Validation des pas de parcours (pasX,pasY) des images. */
Test(EST_FAUX(la_spirale_est_carree))
Bblock
DEFV(Logical,INIT(ajuster_le_rayon_de_la_spirale,VRAI));
/* A priori, il faut ajuster le rayon de la spirale. */
EGAL(rayon_de_la_spirale,RACX(DIVI(FLOT(nombre_de_points_a_generer),PI)));
/* Valeur a priori du rayon de la spirale quant elle est circulaire. Cette valeur sera */
/* peut-etre reajustee par la suite... */
Tant(IL_FAUT(ajuster_le_rayon_de_la_spirale))
Bblock
DEFV(Logical,INIT(poursuivre_le_parcours_de_la_spirale,VRAI));
/* A priori, il faut parcourir la spirale... */
INITIALISATION_D_UNE_SPIRALE_CIRCULAIRE;
/* (re-)initialisation de la spirale... */
Tant(IFET(IL_FAUT(poursuivre_le_parcours_de_la_spirale)
,IFLT(nombre_de_points_deja_generes,nombre_de_points_a_generer)
)
)
Bblock
/* Le nombre de points a generer n'a pas encore ete atteint : */
Test(IFLE(RdisI2D(X_courant,Y_courant,Xcentre,Ycentre),rayon_de_la_spirale))
Bblock
/* Le point courant est a l'interieur du cercle 'rayon_de_la_spirale' : */
INCR(nombre_de_points_deja_generes,I);
/* Comptabilisation des points deja generes a l'interieur du cercle 'rayon_de_la_spirale'. */
Eblock
ATes
Bblock
/* Le point courant est a l'exterieur du cercle 'rayon_de_la_spirale' : */
Test(IFGT(nombre_de_points_sur_la_spirale,EXP2(DOUB(rayon_de_la_spirale))))
/* Le carre qui est "exterieur" a la spirale circulaire a generer a ete entierement rempli */
/* par la spirale carree "de base" : */
Bblock
EGAL(poursuivre_le_parcours_de_la_spirale,FAUX);
/* Il faut arreter de parcourir la spirale... */
INCR(rayon_de_la_spirale
,MUL2(FLOT(MAX2(pasX,pasY)),facteur_d_approximation_du_rayon_d_une_spirale_circulaire)
);
/* Le rayon de la spirale circulaire semble insuffisant, on l'augmente (mais legerement). */
Eblock
ATes
Bblock
/* Le carre qui est "exterieur" a la spirale circulaire a generer n'a pas encore ete */
/* entierement rempli par la spirale carree "de base" : */
Eblock
ETes
Eblock
ETes
SPIRALE_DEPLACEMENT_ET_PARCOURS(X_courant,Y_courant,NOMBRE_DE_POINTS_SAUTES_SUR_LA_SPIRALE);
SPIRALE_COMPTAGE;
Eblock
ETan
Test(IFEQ(nombre_de_points_deja_generes,nombre_de_points_a_generer))
Bblock
EGAL(ajuster_le_rayon_de_la_spirale,FAUX);
/* Ca y est, le rayon de la spirale circulaire est suffisant... */
Eblock
ATes
Bblock
Eblock
ETes
Eblock
ETan
INITIALISATION_D_UNE_SPIRALE_CIRCULAIRE;
/* Re-initialisation de la spirale... */
Eblock
ATes
Bblock
Eblock
ETes
Tant(IFLT(nombre_de_points_deja_generes,nombre_de_points_a_generer))
Bblock
Test(IFOU(EST_VRAI(la_spirale_est_carree)
,IFET(EST_FAUX(la_spirale_est_carree)
,IFLE(RdisI2D(X_courant,Y_courant,Xcentre,Ycentre),rayon_de_la_spirale)
)
)
)
Bblock
store_point_valide(BLANC
,ImageR
,X_courant,Y_courant
,FVARIABLE
);
/* Et on trace la spirale... */
INCR(nombre_de_points_deja_generes,I);
/* Comptabilisation des points deja generes. */
Eblock
ATes
Bblock
Test(EST_FAUX(la_spirale_est_carree))
Bblock
Test(IFGT(nombre_de_points_sur_la_spirale,EXP2(DOUB(rayon_de_la_spirale))))
/* On compare ainsi le nombre de points courants sur la spirale avec le nombre de points */
/* contenus dans le carre qui est "exterieur" a la spirale circulaire a generer... */
Bblock
PRINT_ERREUR("la rayon d'une spirale circulaire a ete mal evalue");
INCR(nombre_de_points_deja_generes,I);
/* Et ce afin de ne pas se bloquer... */
Eblock
ATes
Bblock
Eblock
ETes
Eblock
ATes
Bblock
Eblock
ETes
Eblock
ETes
SPIRALE_DEPLACEMENT_ET_PARCOURS(X_courant,Y_courant,NOMBRE_DE_POINTS_SAUTES_SUR_LA_SPIRALE);
SPIRALE_COMPTAGE;
Eblock
ETan
CALi(Iupdate_image(nom_imageR,ImageR));
RETU_Commande;
Eblock
ECommande