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