/*************************************************************************************************************************************/
/* */
/* R E M P L I S S A G E D ' U N C O N T O U R : */
/* */
/* */
/* Definition : */
/* */
/* Cette commande permet d'extraire */
/* un contour contenu dans une image */
/* Argument et de le remplir. */
/* */
/* */
/* Author of '$xci/contours.12$K' : */
/* */
/* Jean-Francois COLONNA (LACTAMME, 19990603133319). */
/* */
/*************************************************************************************************************************************/
/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/* */
/* 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_CONTOURS_EXT
/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/* */
/* P A R A M E T R E S : */
/* */
/*************************************************************************************************************************************/
#define SEUIL_DE_LIMITE_ENTRE_L_INTERIEUR_ET_L_EXTERIEUR \
GRIS \
/* Seuil de limite entre l'interieur et l'exterieur des contours. */
#define X_POINT_DE_DEPART_DU_CONTOUR \
_____cNORMALISE_OX(Xmin)
#define Y_POINT_DE_DEPART_DU_CONTOUR \
_____cNORMALISE_OY(Ymin)
/* Point de depart de l'extraction du contours. */
#define PARCOURS___EST \
VRAI
#define PARCOURS__NORD \
VRAI
#define PARCOURS_OUEST \
VRAI
#define PARCOURS___SUD \
VRAI
#define PARCOURS__NORD___EST \
VRAI
#define PARCOURS__NORD_OUEST \
VRAI
#define PARCOURS___SUD_OUEST \
VRAI
#define PARCOURS___SUD___EST \
VRAI
/* Pour choisir les directions de parcours (introduit le 20070213121905)... */
#define NIVEAU_DE_REMPLISSAGE_DU_CONTOUR \
BLANC \
/* Niveau de remplissage du contour. */
/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/* */
/* M A C R O S U T I L E S : */
/* */
/*************************************************************************************************************************************/
#define DEFINE_CONTOUR(logique1,logique2) \
Bblock \
BoIn(niveau,NOIR,seuil_de_limite_entre_l_interieur_et_l_exterieur,PAS_COULEURS) \
Bblock \
EGAL(ITb1(fond,INDX(niveau,NOIR)),logique1); \
EGAL(ITb1(bord,INDX(niveau,NOIR)),logique2); \
Eblock \
EBoI \
\
BoIn(niveau,SUCN(seuil_de_limite_entre_l_interieur_et_l_exterieur),BLANC,PAS_COULEURS) \
Bblock \
EGAL(ITb1(fond,INDX(niveau,NOIR)),logique2); \
EGAL(ITb1(bord,INDX(niveau,NOIR)),logique1); \
Eblock \
EBoI \
Eblock \
/* Definition de l'interieur et de l'exterieur d'un contour. */
/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/* */
/* R E M P L I S S A G E D ' U N C O N T O U R : */
/* */
/*************************************************************************************************************************************/
BCommande(nombre_d_arguments,arguments)
/*-----------------------------------------------------------------------------------------------------------------------------------*/
Bblock
DEFV(CHAR,INIC(POINTERc(nom_imageR),NOM_PIPE));
DEFV(CHAR,INIC(POINTERc(nom_imageA),NOM_PIPE));
DEFV(genere_p,INIT(seuil_de_limite_entre_l_interieur_et_l_exterieur,SEUIL_DE_LIMITE_ENTRE_L_INTERIEUR_ET_L_EXTERIEUR));
/* Seuil de limite entre l'interieur et l'exterieur des contours. */
DEFV(Logical,DTb1(fond,COULEURS));
/* Definition du fond (ce que l'on doit remplir). */
DEFV(Logical,DTb1(bord,COULEURS));
/* Et du bord (ce qui definit le contour et son exterieur). */
DEFV(pointF_2D,point_de_depart);
/* Point de depart de l'extraction de contour. */
DEFV(genere_p,INIT(niveau_de_remplissage_du_contour,NIVEAU_DE_REMPLISSAGE_DU_CONTOUR));
/* Niveau de remplissage du contour. */
DEFV(Logical,INIT(parcours___est,PARCOURS___EST));
DEFV(Logical,INIT(parcours__nord,PARCOURS__NORD));
DEFV(Logical,INIT(parcours_ouest,PARCOURS_OUEST));
DEFV(Logical,INIT(parcours___sud,PARCOURS___SUD));
DEFV(Logical,INIT(parcours__nord___est,PARCOURS__NORD___EST));
DEFV(Logical,INIT(parcours__nord_ouest,PARCOURS__NORD_OUEST));
DEFV(Logical,INIT(parcours___sud_ouest,PARCOURS___SUD_OUEST));
DEFV(Logical,INIT(parcours___sud___est,PARCOURS___SUD___EST));
/* Pour choisir les directions de parcours (introduit le 20070213121905)... */
/*..............................................................................................................................*/
INITIALISATION_POINT_2D(point_de_depart,X_POINT_DE_DEPART_DU_CONTOUR,Y_POINT_DE_DEPART_DU_CONTOUR);
/* Introduit le 20050310160202 pour eviter de voir "n'importe quoi" lorsque l'option */
/* "Parametres=VRAI" est active... */
GET_ARGUMENTSv(nombre_d_arguments
,BLOC(GET_ARGUMENT_C("imageA=""A=",nom_imageA);
GET_ARGUMENT_C("imageR=""R=",nom_imageR);
GET_ARGUMENT_P("seuil=""s=",seuil_de_limite_entre_l_interieur_et_l_exterieur);
GET_ARGUMENT_P("niveau=",niveau_de_remplissage_du_contour);
GIT_ARGUMENT_F("x=""XI=""X=",ASD1(point_de_depart,x),X_POINT_DE_DEPART_DU_CONTOUR);
/* 'XI' a ete introduit le 20051207141742 suite a la modification effectuee dans */
/* 'v $xci/contours.11$K XI='. */
GIT_ARGUMENT_F("y=""YI=""Y=",ASD1(point_de_depart,y),Y_POINT_DE_DEPART_DU_CONTOUR);
/* 'YI' a ete introduit le 20051207141742 suite a la modification effectuee dans */
/* 'v $xci/contours.11$K YI='. */
GET_ARGUMENT_L("est=""dc1=",parcours___est);
GET_ARGUMENT_L("nord=""dc2=",parcours__nord);
GET_ARGUMENT_L("ouest=""dc3=",parcours_ouest);
GET_ARGUMENT_L("sud=""dc4=",parcours___sud);
GET_ARGUMENT_L("nord___est=""dc12=",parcours__nord___est);
GET_ARGUMENT_L("nord_ouest=""dc23=",parcours__nord_ouest);
GET_ARGUMENT_L("sud_ouest=""dc34=",parcours___sud_ouest);
GET_ARGUMENT_L("sud___est=""dc41=",parcours___sud___est);
/* Pour choisir les directions de parcours (introduit le 20070213121905)... */
/* */
/* Les Directions Cardinales de type 'v $xiii/vecteurs$DEF Rappel.sur.les.orientations' */
/* ont ete introduites le 20231201094206 dans l'idee d'une extension tridimensionnelle... */
GET_ARGUMENT_L("editer_centre_gravite=""ecg="
,Iremplissage_____editer_le_centre_de_gravite
);
/* Parametres introduits le 20161105105953... */
GET_ARGUMENT_L("editer_matrice_intertie=""emi="
,Iremplissage_____editer_la_matrice_d_inertie
);
/* Parametres introduits le 20230825102403... */
)
);
CALi(Inoir(ImageR));
/* Initialisation de l'image Resultat. */
Test(IFGE(seuil_de_limite_entre_l_interieur_et_l_exterieur,BLANC))
Bblock
PRINT_ERREUR("le seuil de limite entre l'interieur et l'exterieur doit etre inferieur au niveau maximal");
EGAL(seuil_de_limite_entre_l_interieur_et_l_exterieur,PREN(BLANC));
Eblock
ATes
Bblock
Eblock
ETes
Test(PAS_D_ERREUR(CODE_ERROR(Iload_image(ImageA,nom_imageA))))
Bblock
DEFV(pointF_2D,coin_inferieur_gauche);
/* Coin inferieur gauche de la zone de remplissage, */
DEFV(pointF_2D,coin_superieur_droite);
/* Coin superieur droite de la zone de remplissage. */
INITIALISATION_POINT_2D(coin_inferieur_gauche,CADRE_GAUCHE,CADRE_INFERIEUR);
/* Definition du coin inferieur gauche de remplissage, */
INITIALISATION_POINT_2D(coin_superieur_droite,CADRE_DROITE,CADRE_SUPERIEUR);
/* Definition du coin superieur droite de remplissage. */
DEFINE_CONTOUR(VRAI,FAUX);
/* Definition de l'interieur et de l'exterieur du contour... */
CALS(Iremplissage(ImageR
,ImageA
,ADRESSE(point_de_depart)
,ADRESSE(coin_inferieur_gauche)
,ADRESSE(coin_superieur_droite)
,fond,bord
,parcours___est,parcours__nord,parcours_ouest,parcours___sud
,parcours__nord___est,parcours__nord_ouest,parcours___sud_ouest,parcours___sud___est
,niveau_de_remplissage_du_contour
)
);
/* Remplissage du contour... */
CALi(Iupdate_image(nom_imageR,ImageR));
/* Memorisation du resultat. */
Eblock
ATes
Bblock
Test__CODE_ERREUR__ERREUR07;
Eblock
ETes
RETU_Commande;
Eblock
ECommande