/*************************************************************************************************************************************/ /* */ /* R E C H E R C H E B I D I M E N S I O N N E L L E D E P O I N T S V O I S I N S D A N S U N E I M A G E : */ /* */ /* */ /* Author of '$xrv/PointsVoisins_2D.01$K' : */ /* */ /* Jean-Francois COLONNA (LACTAMME, 20150703102402). */ /* */ /*************************************************************************************************************************************/ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* 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 #include image_image_IMAGESF_EXT /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* V A L E U R S I M P L I C I T E S D E S P A R A M E T R E S : */ /* */ /*************************************************************************************************************************************/ #define NIVEAU_DES_POINTS \ BLANC \ /* Niveau des points a etudier... */ #define COORDONNEE_Z \ FZERO \ /* Coordonnee 'Z' par defaut (dans le cas bidimensionnel). */ #define NOMBRE_DE_VOISINS_CHERCHES \ SIX \ /* Nombre de voisins recherches. */ #define NOMBRE_MAXIMAL_DE_POINTS_A_TESTER \ MILLE \ /* Nombre maximal de points a tester autour de chaque point de 'niveau_des_points'. */ #define DISTANCE_MINIMALE_ENTRE_DEUX_POINTS \ FZERO #define DISTANCE_MAXIMALE_ENTRE_DEUX_POINTS \ F_INFINI /* Distances extremales entre deux points voisins (le minimum a ete introduit */ /* 20150812093721). */ #define TRIER_LES_DEUX_POINTS_DANS_UN_COUPLE \ VRAI \ /* Faut-il trier les deux points d'un couple {A,B} de facon a ce que {B,A} apparaissent */ /* sous la forme {A,B} ('VRAI') ou pas ('FAUX') ? */ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* D E F I N I T I O N D E S F I C H I E R S : */ /* */ /*************************************************************************************************************************************/ #include xrv/ARITHMET.1d.I" #include xrv/ARITHMET.21.I" #include xrv/champs_5.41.I" /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* M A C R O S U T I L E S : */ /* */ /*************************************************************************************************************************************/ #define IMAGE_Z \ IFmageA1 \ /* Image donnant la troisieme dimension... */ #define IMAGE_V \ IFmageA2 \ /* Image donnant le nombre de voisins (introduite le 20150704095038). */ #define IMAGE_Dm \ IFmageA3 #define IMAGE_DM \ IFmageA4 /* Images donnant les distances extremales (introduite le 20150704095038 et complete */ /* le 20150812093721 par le minimum). */ #define CHARGEMENT_IMAGE(image,nom_image,valeur_par_defaut) \ Bblock \ Test(IFEQ_chaine(nom_image,NOM_PIPE_Local)) \ Bblock \ CALi(IFinitialisation(image,valeur_par_defaut)); \ /* On notera que 'IFinitialisation(...)' ne peut etre fait a priori avant le 'Test(...)' */ \ /* precedent a cause du cas ou 'nom_image' serait en fait une valeur flottante destinee */ \ /* a initialiser l'image, ce que ce 'IFinitialisation(...)' execute ensuite "annulerait"... */ \ Eblock \ ATes \ Bblock \ Test(PAS_D_ERREUR(CODE_ERROR(IloadF_image(image,nom_image)))) \ Bblock \ Eblock \ ATes \ Bblock \ CALi(IFinitialisation(image,valeur_par_defaut)); \ /* On lira la remarque relative a 'IFinitialisation(...)' ci-dessus... */ \ Test__CODE_ERREUR__ERREUR07; \ Eblock \ ETes \ Eblock \ ETes \ Eblock \ /* Procedure de chargement et/ou initialisation d'une image (introduite le 20150704094141). */ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* R E C H E R C H E B I D I M E N S I O N N E L L E D E P O I N T S V O I S I N S D A N S U N E I M A G E : */ /* */ /*************************************************************************************************************************************/ BCommande(nombre_d_arguments,arguments) /*-----------------------------------------------------------------------------------------------------------------------------------*/ Bblock #include xrv/ARITHMET.22.I" #include xci/valeurs.03.I" DEFV(CHAR,INIT(POINTERc(nom_imageA),NOM_PIPE_Local)); DEFV(CHAR,INIT(POINTERc(nom_imageZ),NOM_PIPE_Local)); DEFV(CHAR,INIT(POINTERc(nom_imageV),NOM_PIPE_Local)); DEFV(CHAR,INIT(POINTERc(nom_imageDm),NOM_PIPE_Local)); DEFV(CHAR,INIT(POINTERc(nom_imageDM),NOM_PIPE_Local)); /* Nom des images. */ DEFV(genere_p,INIT(niveau_des_points,NIVEAU_DES_POINTS)); /* Niveau des points a etudier... */ DEFV(Float,INIT(coordonnee_Z,COORDONNEE_Z)); /* Coordonnee 'Z' par defaut (dans le cas bidimensionnel). */ DEFV(Positive,INIT(nombre_de_voisins_cherches,NOMBRE_DE_VOISINS_CHERCHES)); /* Nombre de voisins recherches. */ DEFV(Positive,INIT(nombre_maximal_de_points_a_tester,NOMBRE_MAXIMAL_DE_POINTS_A_TESTER)); /* Nombre maximal de points a tester autour de chaque point de 'niveau_des_points'. */ DEFV(Float,INIT(distance_minimale_entre_deux_points,DISTANCE_MINIMALE_ENTRE_DEUX_POINTS)); DEFV(Float,INIT(distance_maximale_entre_deux_points,DISTANCE_MAXIMALE_ENTRE_DEUX_POINTS)); /* Distances extremales entre deux points voisins (le minimum a ete introduit */ /* 20150812093721). */ DEFV(Logical,INIT(trier_les_deux_points_dans_un_couple,TRIER_LES_DEUX_POINTS_DANS_UN_COUPLE)); /* Faut-il trier les deux points d'un couple {A,B} de facon a ce que {B,A} apparaissent */ /* sous la forme {A,B} ('VRAI') ou pas ('FAUX') ? */ /*..............................................................................................................................*/ GET_ARGUMENTSi(nombre_d_arguments ,BLOC(PROCESS_ARGUMENT_I("nombre_elements=""ne=",nombre_d_elements ,BLOC(VIDE;) ,BLOC(Bblock PRINT_AVERTISSEMENT("'ne=' doit etre defini avant toute entree de fichiers"); Eblock ) ); PROCESS_ARGUMENTS_DE_DEFINITION_DES_FICHIERS_01; GET_ARGUMENT_C("imageA=""A=",nom_imageA); GET_ARGUMENT_C("imageZ=""Z=",nom_imageZ); GET_ARGUMENT_C("imageV=""V=",nom_imageV); GET_ARGUMENT_C("imageDm=""Dm=",nom_imageDm); GET_ARGUMENT_C("imageDM=""DM=",nom_imageDM); GET_ARGUMENT_P("niveau=""n=",niveau_des_points); GET_ARGUMENT_F("coordonnee_Z=""cZ=",coordonnee_Z); GET_ARGUMENT_I("nombre_voisins=""nv=",nombre_de_voisins_cherches); GET_ARGUMENT_I("nombre_points=""np=",nombre_maximal_de_points_a_tester); GET_ARGUMENT_F("distance_minimale=""dm=",distance_minimale_entre_deux_points); GET_ARGUMENT_F("distance_maximale=""dM=",distance_maximale_entre_deux_points); GET_ARGUMENT_L("trier_couple=""trier=""tc=",trier_les_deux_points_dans_un_couple); ) ); CHARGEMENT_IMAGE(IMAGE_Z,nom_imageZ,coordonnee_Z); CHARGEMENT_IMAGE(IMAGE_V,nom_imageV,nombre_de_voisins_cherches); CHARGEMENT_IMAGE(IMAGE_Dm,nom_imageDm,distance_minimale_entre_deux_points); CHARGEMENT_IMAGE(IMAGE_DM,nom_imageDM,distance_maximale_entre_deux_points); Test(PAS_D_ERREUR(CODE_ERROR(Iload_image(ImageA,nom_imageA)))) Bblock begin_image Bblock Test(IFEQ(load_point(ImageA,X,Y),niveau_des_points)) Bblock DEFV(Float,INIT(coordonnee_Z1,loadF_point(IMAGE_Z,X,Y))); DEFV(Float,INIT(nombre_local_de_voisins_cherches,loadF_point(IMAGE_V,X,Y))); DEFV(Float,INIT(distance_minimale_locale_entre_deux_points,loadF_point(IMAGE_Dm,X,Y))); DEFV(Float,INIT(distance_maximale_locale_entre_deux_points,loadF_point(IMAGE_DM,X,Y))); /* Definition des donnees locales au point courant {X,Y}... */ DEFV(pointI_2D,point_courant); SPIRALE_DEFINITION /* Donnees de generation d'une spirale de parcours d'une image. */ DEFV(Int,INIT(nombre_de_voisins_trouves,ZERO)); DEFV(Int,INIT(nombre_de_points_testes,ZERO)); /* Compteurs divers... */ SPIRALE_VALIDATION; INITIALISATION_POINT_2D(point_courant,X,Y); Tant(IFET(IFLT(nombre_de_points_testes,nombre_maximal_de_points_a_tester) ,IFLT(nombre_de_voisins_trouves,nombre_local_de_voisins_cherches) ) ) Bblock Test(IFET(IFEQ(ASD1(point_courant,x),X),IFEQ(ASD1(point_courant,y),Y))) Bblock /* Cas ou l'on est sur le point de depart {X,Y} qui ne peut donc etre son propre voisin... */ Eblock ATes Bblock Test(TEST_DANS_L_IMAGE(ASD1(point_courant,x),ASD1(point_courant,y))) Bblock Test(IFEQ(load_point(ImageA,ASD1(point_courant,x),ASD1(point_courant,y)),niveau_des_points)) Bblock /* Cas ou le point courant de la spirale est un "bon" voisin du point courant {X,Y} de */ /* l'image : */ DEFV(Float,INIT(coordonnee_X1,_____cNORMALISE_OX(X))); DEFV(Float,INIT(coordonnee_Y1,_____cNORMALISE_OY(Y))); DEFV(Float,INIT(coordonnee_X2,_____cNORMALISE_OX(ASD1(point_courant,x)))); DEFV(Float,INIT(coordonnee_Y2,_____cNORMALISE_OY(ASD1(point_courant,y)))); DEFV(Float,INIT(coordonnee_Z2 ,loadF_point(IMAGE_Z,ASD1(point_courant,x),ASD1(point_courant,y)) ) ); #include xrv/PointsVoisins_2D.01.I" EDITION_D_UN_POINT_VOISIN; /* Introduit le 20150809091459 sous cette forme... */ Eblock ATes Bblock Eblock ETes Eblock ATes Bblock Eblock ETes Eblock ETes SPIRALE_INITIALISATION; /* Initialisation dynamique de 'spirale_nombre_de_points_a_traiter'. */ SPIRALE_DEPLACEMENT(ASD1(point_courant,x),ASD1(point_courant,y)); /* Deplacement du point courant de la spirale... */ /* ATTENTION : on n'utilise pas 'SPIRALE_DEPLACEMENT_ET_PARCOURS(...)' afin de garantir la */ /* terminaison du processus 'Tant(...)'. */ SPIRALE_PARCOURS; /* Parcours de la spirale avec rotation eventuelle de PI/2 du bras courant... */ INCR(nombre_de_points_testes,I); /* Comptage des points testes (meme ceux qui sont hors album et ce afin de ne pas creer */ /* d'effets de bord...). */ Eblock ETan Eblock ATes Bblock Eblock ETes Eblock end_image Eblock ATes Bblock Test__CODE_ERREUR__ERREUR07; Eblock ETes RETU_Commande; Eblock ECommande