/*************************************************************************************************************************************/
/* */
/* P L A C E M E N T D E R E C T A N G L E 1 x 2 D A N S L E P L A N : */
/* */
/* */
/* Nota : */
/* */
/* Ce programme '$K' est issu du */
/* programme 'v $xtc/dominos.11$vv$c'. */
/* */
/* */
/* Author of '$xrk/dominos.01$K' : */
/* */
/* Jean-Francois COLONNA (LACTAMME, 20230807125812). */
/* */
/*************************************************************************************************************************************/
/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/* */
/* 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 NOMBRE_MAXIMAL_DE_RECTANGLES \
INFINI
#define NOMBRE_DE_CARRES_UNITES_1 \
UN
#define NOMBRE_DE_CARRES_UNITES_2 \
DEUX
#define DIMENSION_X \
HUIT
#define DIMENSION_Y \
HUIT
#define GRAINE_DU_GENERATEUR_ALEATOIRE \
PARE(1789)
#define SEUIL_CHOIX_ORIENTATION \
FDU
#define NIVEAU_INTERDIT__ \
GRIS_0
#define NIVEAU_VIDE \
GRIS_0
#define NIVEAU_HORIZONTAL \
GRIS_8
#define NIVEAU_VERTICAL__ \
GRIS_4
#define NIVEAU_GRILLE_HORIZONTAL \
GRIS_2
#define NIVEAU_GRILLE_VERTICAL__ \
GRIS_2
Denumer06(INIS(Mode_LigneLigne_HV,UN)
,Mode_LigneLigne_VH
,Mode_ColonneColonne_HV
,Mode_ColonneColonne_VH
,Mode_SpiraleCarree
,Mode_Aleatoire
,Mode_ModesDisponibles
);
#define FACTEUR_ALEATOIRE \
100
#define EDITER_LES_STATISTIQUES \
VRAI
#define EDITER_LES_MESSAGES_DE_DIMENSIONNEMENT \
VRAI \
/* Introduit le 20240626183115... */
/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/* */
/* M A C R O S U T I L E S : */
/* */
/*************************************************************************************************************************************/
#define dimX_reduite \
DIVI(dimX,dimension_X)
#define dimY_reduite \
DIVI(dimY,dimension_Y)
#define TEST_IMAGE(x,y) \
load_point_valide(ImageR,x,y)
#define DEFINITION_DES_SOMMETS_D_UN_RECTANGLE(x,y,nx,ny) \
DEFV(Int,INIT(Xcm,x)); \
DEFV(Int,INIT(Ycm,y)); \
DEFV(Int,INIT(XcM,PRED(ADD2(x,MUL2(nx,dimension_X))))); \
DEFV(Int,INIT(YcM,PRED(ADD2(y,MUL2(ny,dimension_Y)))));
#define PEUT_ON_TRACER_UN_RECTANGLE(on_peut_tracer_un_rectangle,x,y,nx,ny) \
Bblock \
DEFINITION_DES_SOMMETS_D_UN_RECTANGLE(x,y,nx,ny); \
\
EGAL(on_peut_tracer_un_rectangle,VRAI); \
/* A priori... */ \
begin_ligneQ(DoIn,Xcm,XcM,PasX) \
Bblock \
begin_colonneQ(DoIn,Ycm,YcM,PasY) \
Bblock \
Test(TEST_DANS_L_IMAGE(X,Y)) \
Bblock \
Test(IFNE(TEST_IMAGE(X,Y),niveau_vide)) \
Bblock \
EGAL(on_peut_tracer_un_rectangle,FAUX); \
/* Le point {X,Y} est deja marque... */ \
Eblock \
ATes \
Bblock \
Eblock \
ETes \
Eblock \
ATes \
Bblock \
EGAL(on_peut_tracer_un_rectangle,FAUX); \
/* Le point {X,Y} est en dehors du domaine... */ \
Eblock \
ETes \
Eblock \
end_colonneQ(EDoI) \
Eblock \
end_ligneQ(EDoI) \
Eblock
#define TRACE_RECTANGLE(x,y,nx,ny,niveau_rectangle) \
Bblock \
Test(IFEQ(load_point_valide(ImageA,x,y),niveau_autorise__)) \
Bblock \
INCR(nombre_courant_de_rectangles,I); \
\
Test(IFLE(nombre_courant_de_rectangles,nombre_maximal_de_rectangles)) \
Bblock \
DEFINITION_DES_SOMMETS_D_UN_RECTANGLE(x,y,nx,ny); \
\
DEFV(genere_p,INIT(niveau_grille \
,COND(IFEQ(niveau_rectangle,niveau_horizontal) \
,niveau_grille_horizontal \
,COND(IFEQ(niveau_rectangle,niveau_vertical__) \
,niveau_grille_vertical__ \
,MOYE(niveau_grille_horizontal,niveau_grille_vertical__) \
) \
) \
) \
); \
\
begin_ligneQ(DoIn,Xcm,XcM,PasX) \
Bblock \
begin_colonneQ(DoIn,Ycm,YcM,PasY) \
Bblock \
store_point_valide(COND(IFOU(IFOU(IFEQ(X,Xcm),IFEQ(X,XcM)) \
,IFOU(IFEQ(Y,Ycm),IFEQ(Y,YcM)) \
) \
,niveau_grille \
,niveau_rectangle \
) \
,ImageR \
,X,Y \
,FVARIABLE \
); \
Eblock \
end_colonneQ(EDoI) \
Eblock \
end_ligneQ(EDoI) \
\
Test(IFEQ(niveau_rectangle,niveau_horizontal)) \
Bblock \
INCR(CompteurRectanglesHorizontaux,I); \
Eblock \
ATes \
Bblock \
Test(IFEQ(niveau_rectangle,niveau_vertical__)) \
Bblock \
INCR(CompteurRectanglesVerticaux__,I); \
Eblock \
ATes \
Bblock \
CAL1(Prer1("le niveau %d n'est pas reconnu\n",niveau_rectangle)); \
Eblock \
ETes \
Eblock \
ETes \
Eblock \
ATes \
Bblock \
Eblock \
ETes \
Eblock \
ATes \
Bblock \
Eblock \
ETes \
Eblock
#define TENTATIVE_HORIZONTALE(x,y) \
Bblock \
DEFV(Logical,INIT(on_peut_tracer_un_rectangle,LUNDEF)); \
PEUT_ON_TRACER_UN_RECTANGLE(on_peut_tracer_un_rectangle \
,x,y \
,nombre_de_carres_unites_2 \
,nombre_de_carres_unites_1 \
); \
\
Test(EST_VRAI(on_peut_tracer_un_rectangle)) \
Bblock \
TRACE_RECTANGLE(x,y,nombre_de_carres_unites_2,nombre_de_carres_unites_1,niveau_horizontal); \
/* Trace d'un rectangle horizontal 2x1. */ \
Eblock \
ATes \
Bblock \
DEFV(Logical,INIT(on_peut_tracer_un_rectangle,LUNDEF)); \
PEUT_ON_TRACER_UN_RECTANGLE(on_peut_tracer_un_rectangle \
,x,y \
,nombre_de_carres_unites_1 \
,nombre_de_carres_unites_2 \
); \
\
Test(EST_VRAI(on_peut_tracer_un_rectangle)) \
Bblock \
TRACE_RECTANGLE(x,y,nombre_de_carres_unites_1,nombre_de_carres_unites_2,niveau_vertical__); \
/* Trace d'un rectangle vertical 1x1. */ \
Eblock \
ATes \
Bblock \
Eblock \
ETes \
Eblock \
ETes \
Eblock
#define TENTATIVE_VERTICALE__(x,y) \
Bblock \
DEFV(Logical,INIT(on_peut_tracer_un_rectangle,LUNDEF)); \
PEUT_ON_TRACER_UN_RECTANGLE(on_peut_tracer_un_rectangle \
,x,y \
,nombre_de_carres_unites_1 \
,nombre_de_carres_unites_2 \
); \
\
Test(EST_VRAI(on_peut_tracer_un_rectangle)) \
Bblock \
TRACE_RECTANGLE(x,y,nombre_de_carres_unites_1,nombre_de_carres_unites_2,niveau_vertical__); \
/* Trace d'un rectangle vertical 1x1. */ \
Eblock \
ATes \
Bblock \
DEFV(Logical,INIT(on_peut_tracer_un_rectangle,LUNDEF)); \
PEUT_ON_TRACER_UN_RECTANGLE(on_peut_tracer_un_rectangle \
,x,y \
,nombre_de_carres_unites_2 \
,nombre_de_carres_unites_1 \
); \
\
Test(EST_VRAI(on_peut_tracer_un_rectangle)) \
Bblock \
TRACE_RECTANGLE(x,y,nombre_de_carres_unites_2,nombre_de_carres_unites_1,niveau_horizontal); \
/* Trace d'un rectangle horizontal 2x1. */ \
Eblock \
ATes \
Bblock \
Eblock \
ETes \
Eblock \
ETes \
Eblock
#define DEFINITION_TUILE_1x2(x,y,test,tentative_1,tentative_2) \
Bblock \
Test(IFEQ(TEST_IMAGE(x,y),niveau_vide)) \
Bblock \
DEFV(Float,INIT(random,GENERE_VALEUR_ALEATOIRE)); \
\
Test(test) \
Bblock \
BLOC(tentative_1); \
Eblock \
ATes \
Bblock \
BLOC(tentative_2); \
Eblock \
ETes \
Eblock \
ATes \
Bblock \
Eblock \
ETes \
Eblock
#define PARCOURS_SEQUENTIEL(boucle1,boucle2,Eboucle2,Eboucle1,test,tentative_1,tentative_2) \
Bblock \
boucle1 \
Bblock \
boucle2 \
Bblock \
DEFINITION_TUILE_1x2(X,Y,test,tentative_1,tentative_2); \
Eblock \
Eboucle2 \
Eblock \
Eboucle1 \
Eblock
/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/* */
/* F O N C T I O N U T I L E S : */
/* */
/*************************************************************************************************************************************/
#define GENERE_VALEUR_ALEATOIRE \
RDN_STANDARD
/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/* */
/* P L A C E M E N T D E R E C T A N G L E 1 x 2 D A N S L E P L A N : */
/* */
/*************************************************************************************************************************************/
BCommande(nombre_d_arguments,arguments)
/*-----------------------------------------------------------------------------------------------------------------------------------*/
Bblock
DEFV(CHAR,INIC(POINTERc(nom_imageA),NOM_PIPE));
DEFV(CHAR,INIC(POINTERc(nom_imageR),NOM_PIPE));
DEFV(Int,INIT(nombre_maximal_de_rectangles,NOMBRE_MAXIMAL_DE_RECTANGLES));
DEFV(Int,INIT(nombre_courant_de_rectangles,ZERO));
DEFV(Int,INIT(CompteurRectanglesHorizontaux,ZERO));
DEFV(Int,INIT(CompteurRectanglesVerticaux__,ZERO));
DEFV(Int,INIT(graine_du_generateur_aleatoire,GRAINE_DU_GENERATEUR_ALEATOIRE));
DEFV(Float,INIT(seuil_choix_orientation,SEUIL_CHOIX_ORIENTATION));
DEFV(genere_p,INIT(niveau_autorise__,NIVEAU_INTERDIT__));
DEFV(genere_p,INIT(niveau_vide,NIVEAU_VIDE));
DEFV(genere_p,INIT(niveau_horizontal,NIVEAU_HORIZONTAL));
DEFV(genere_p,INIT(niveau_vertical__,NIVEAU_VERTICAL__));
DEFV(genere_p,INIT(niveau_grille_horizontal,NIVEAU_GRILLE_HORIZONTAL));
DEFV(genere_p,INIT(niveau_grille_vertical__,NIVEAU_GRILLE_VERTICAL__));
/* Le 20230811095026, il a ete introduit un niveau de grille par type de rectangles ('H' */
/* ou 'V') et ce afin de pouvoir faire disparaitre la grille en faisant : */
/* */
/* niveau_grille_horizontal = niveau_horizontal */
/* niveau_grille_vertical__ = niveau_vertical__ */
/* */
/* et ainsi, par exemple, faire des tests de percolation... */
DEFV(Int,INIT(nombre_de_carres_unites_1,NOMBRE_DE_CARRES_UNITES_1));
DEFV(Int,INIT(nombre_de_carres_unites_2,NOMBRE_DE_CARRES_UNITES_2));
DEFV(Int,INIT(dimension_X,DIMENSION_X));
DEFV(Int,INIT(dimension_Y,DIMENSION_Y));
DEFV(Int,INIT(mode_de_placement_des_rectangles,Mode_LigneLigne_HV));
/* Definition du mode de parcours du domaine : */
/* */
/* mode=1 : Ligne apres ligne (HV), */
/* mode=2 : Ligne apres ligne (VH), */
/* mode=3 : Colonne apres colonne (HV), */
/* mode=4 : Colonne apres colonne (VH), */
/* mode=5 : Suivant une spirale "carree", */
/* mode=6 : Mode aleatoire. */
/* */
DEFV(Logical,INIT(editer_les_statistiques,EDITER_LES_STATISTIQUES));
DEFV(Int,INIT(facteur_aleatoire,FACTEUR_ALEATOIRE));
DEFV(Logical,INIT(editer_les_messages_de_dimensionnement,EDITER_LES_MESSAGES_DE_DIMENSIONNEMENT));
/* Introduit le 20240626183115... */
/*..............................................................................................................................*/
GET_ARGUMENTSi(nombre_d_arguments
,BLOC(GET_ARGUMENT_C("imageA=""A=",nom_imageA);
GET_ARGUMENT_C("imageR=""R=",nom_imageR);
GET_ARGUMENT_P("niveau_autorise=""na=",niveau_autorise__);
GET_ARGUMENT_P("niveau_vide=""nv=",niveau_vide);
GET_ARGUMENT_P("niveau_horizontal=""nH=",niveau_horizontal);
GET_ARGUMENT_P("niveau_vertical=""nV=",niveau_vertical__);
GET_ARGUMENT_P("niveau_grille_horizontal=""nGH=",niveau_grille_horizontal);
GET_ARGUMENT_P("niveau_grille_vertical=""nGV=",niveau_grille_vertical__);
GET_ARGUMENT_I("nombre_rectangles=""nr=",nombre_maximal_de_rectangles);
GET_ARGUMENT_I("graine=",graine_du_generateur_aleatoire);
GET_ARGUMENT_F("seuil=",seuil_choix_orientation);
GET_ARGUMENT_I("nombre_carres_1=""nc1=",nombre_de_carres_unites_1);
GET_ARGUMENT_I("nombre_carres_2=""nc2=",nombre_de_carres_unites_2);
/* Arguments introduits le 20230814093106... */
GET_ARGUMENT_I("dimensionX=""dX=""dx=",dimension_X);
GET_ARGUMENT_I("dimensionY=""dY=""dy=",dimension_Y);
GET_ARGUMENT_I("mode=",mode_de_placement_des_rectangles);
GET_ARGUMENT_I("facteur=""fa=",facteur_aleatoire);
GET_ARGUMENT_L("editer=""statistiques=""es=",editer_les_statistiques);
GET_ARGUMENT_L("messages_dimensionnement=""md=",editer_les_messages_de_dimensionnement);
/* Argument introduit le 20240626183115... */
)
);
Test(IFOU(IFOU(NON_DIVISIBLE(dimX,MUL2(nombre_de_carres_unites_1,dimension_X))
,NON_DIVISIBLE(dimX,MUL2(nombre_de_carres_unites_2,dimension_X))
)
,IFOU(NON_DIVISIBLE(dimY,MUL2(nombre_de_carres_unites_1,dimension_Y))
,NON_DIVISIBLE(dimY,MUL2(nombre_de_carres_unites_2,dimension_Y))
)
)
)
Bblock
Test(IL_FAUT(editer_les_messages_de_dimensionnement))
/* Test introduit le 20240626183115... */
Bblock
PRINT_ATTENTION("les dimensions de l'image ne sont pas divisibles par les dimensions des rectangles");
Eblock
ATes
Bblock
Eblock
ETes
Eblock
ATes
Bblock
Eblock
ETes
Test(IFOU(DIVISIBLE(nombre_de_carres_unites_1,nombre_de_carres_unites_2)
,DIVISIBLE(nombre_de_carres_unites_2,nombre_de_carres_unites_1)
)
)
Bblock
Eblock
ATes
Bblock
PRINT_ATTENTION("les dimensions des rectangles ne sont pas multiples l'une de l'autre, on reinitialise donc");
/* Ceci est une condition sine qua non si l'on veut que les emboitements se fassent bien... */
EGAL(nombre_de_carres_unites_1,NOMBRE_DE_CARRES_UNITES_1);
EGAL(nombre_de_carres_unites_2,NOMBRE_DE_CARRES_UNITES_2);
Eblock
ETes
CALi(Iload_image_si_present(ImageA,nom_imageA,NOM_PIPE_Local,niveau_autorise__));
CALi(Iinitialisation(ImageR,niveau_vide));
INITIALISATION_RDN_STANDARD(GRAINE_DU_GENERATEUR_ALEATOIRE);
Choi(mode_de_placement_des_rectangles)
Bblock
Ca1e(Mode_LigneLigne_HV)
/* Mode ligne par ligne (HORIZONTALE,VERTICALE__) : */
Bblock
PARCOURS_SEQUENTIEL(begin_colonneQ(DoIn,Ymin,Ymax,dimension_Y)
,begin_ligneQ(DoIn,Xmin,Xmax,dimension_X)
,end_ligneQ(EDoI)
,end_colonneQ(EDoI)
,IFLT(random,seuil_choix_orientation)
,TENTATIVE_HORIZONTALE(X,Y)
,TENTATIVE_VERTICALE__(X,Y)
);
Eblock
ECa1
Ca1e(Mode_LigneLigne_VH)
/* Mode ligne par ligne (VERTICALE__,HORIZONTALE) : */
Bblock
PARCOURS_SEQUENTIEL(begin_colonneQ(DoIn,Ymin,Ymax,dimension_Y)
,begin_ligneQ(DoIn,Xmin,Xmax,dimension_X)
,end_ligneQ(EDoI)
,end_colonneQ(EDoI)
,IFLT(random,seuil_choix_orientation)
,TENTATIVE_VERTICALE__(X,Y)
,TENTATIVE_HORIZONTALE(X,Y)
);
Eblock
ECa1
Ca1e(Mode_ColonneColonne_HV)
/* Mode colonne par colonne (HORIZONTALE,VERTICALE__) : */
Bblock
PARCOURS_SEQUENTIEL(begin_ligneQ(DoIn,Xmin,Xmax,dimension_X)
,begin_colonneQ(DoIn,Ymin,Ymax,dimension_Y)
,end_colonneQ(EDoI)
,end_ligneQ(EDoI)
,IFLT(random,seuil_choix_orientation)
,TENTATIVE_HORIZONTALE(X,Y)
,TENTATIVE_VERTICALE__(X,Y)
);
Eblock
ECa1
Ca1e(Mode_ColonneColonne_VH)
/* Mode colonne par colonne (VERTICALE__,HORIZONTALE) : */
Bblock
PARCOURS_SEQUENTIEL(begin_ligneQ(DoIn,Xmin,Xmax,dimension_X)
,begin_colonneQ(DoIn,Ymin,Ymax,dimension_Y)
,end_colonneQ(EDoI)
,end_ligneQ(EDoI)
,IFLT(random,seuil_choix_orientation)
,TENTATIVE_VERTICALE__(X,Y)
,TENTATIVE_HORIZONTALE(X,Y)
);
Eblock
ECa1
Ca1e(Mode_SpiraleCarree)
/* Mode spirale "carre" : */
Bblock
DEFV(Int,INIT(X,COXA(iMULTIPLE(COXR(Xcentre),dimension_X))));
DEFV(Int,INIT(Y,COYA(iMULTIPLE(COYR(Ycentre),dimension_Y))));
DEFV(Int,INIT(index,UNDEF));
SPIRALE_DEFINITION
/* Donnees de generation d'une spirale de parcours d'une image. */
SPIRALE_VALIDATION;
DoIn(index,UN,ADD2(MUL2(dimX_reduite,dimY_reduite),DOUB((ADD2(dimX_reduite,dimY_reduite)))),I)
Bblock
Test(TEST_DANS_L_IMAGE(X,Y))
Bblock
DEFINITION_TUILE_1x2(X
,Y
,IFLT(random,seuil_choix_orientation)
,TENTATIVE_HORIZONTALE(X,Y)
,TENTATIVE_VERTICALE__(X,Y)
);
Eblock
ATes
Bblock
Eblock
ETes
SPIRALE_INITIALISATION;
INCR(X,MUL2(dimension_X,spirale_delta_horizontal));
INCR(Y,MUL2(dimension_Y,spirale_delta_vertical));
SPIRALE_PARCOURS;
Eblock
EDoI
Eblock
ECa1
Ca1e(Mode_Aleatoire)
/* Mode aleatoire : */
Bblock
DEFV(Int,INIT(index,UNDEF));
DoIn(index,UN,INTE(MUL2(facteur_aleatoire,MUL2(dimX_reduite,dimY_reduite))),I)
Bblock
DEFV(Int,INIT(X,COXA(MULTIPLE(INTE(MUL2(COXR(Xmax),GENERE_VALEUR_ALEATOIRE))
,MUL2(MIN2(nombre_de_carres_unites_1,nombre_de_carres_unites_2),dimension_X)
)
)
)
);
DEFV(Int,INIT(Y,COYA(MULTIPLE(INTE(MUL2(COXR(Ymax),GENERE_VALEUR_ALEATOIRE))
,MUL2(MIN2(nombre_de_carres_unites_1,nombre_de_carres_unites_2),dimension_Y)
)
)
)
);
/* Le 20230814104624, j'hesite entre 'MIN2(...)' et 'MAX2(...)' plus logique, mais je */
/* retiens la premiere solution pour conserver 'v $xiirv/DOMI.11.6'... */
Test(TEST_DANS_L_IMAGE(X,Y))
Bblock
DEFINITION_TUILE_1x2(X
,Y
,IFLT(random,seuil_choix_orientation)
,TENTATIVE_HORIZONTALE(X,Y)
,TENTATIVE_VERTICALE__(X,Y)
);
Eblock
ATes
Bblock
Eblock
ETes
Eblock
EDoI
Eblock
ECa1
Defo
Bblock
CAL1(Prer1("le mode %d n'est pas reconnu\n",mode_de_placement_des_rectangles));
Eblock
EDef
Eblock
ECho
Test(IL_FAUT(editer_les_statistiques))
Bblock
DEFV(Int,INIT(NombreTotalRectangles,ADD2(CompteurRectanglesHorizontaux,CompteurRectanglesVerticaux__)));
CAL3(Prme1("NombreRectangles.=%d\n",NombreTotalRectangles));
CAL3(Prme2("NombreRectanglesH=%d (%.2f%%)\n"
,CompteurRectanglesHorizontaux
,CONVERTIR_EN_UN_POURCENTAGE(CompteurRectanglesHorizontaux,NombreTotalRectangles)
)
);
CAL3(Prme2("NombreRectanglesV=%d (%.2f%%)\n"
,CompteurRectanglesVerticaux__
,CONVERTIR_EN_UN_POURCENTAGE(CompteurRectanglesVerticaux__,NombreTotalRectangles)
)
);
Test(IFET(IFET(DIVISIBLE(dimX,MUL2(nombre_de_carres_unites_1,dimension_X))
,DIVISIBLE(dimX,MUL2(nombre_de_carres_unites_2,dimension_X))
)
,IFET(DIVISIBLE(dimY,MUL2(nombre_de_carres_unites_1,dimension_Y))
,DIVISIBLE(dimY,MUL2(nombre_de_carres_unites_2,dimension_Y))
)
)
)
Bblock
CAL3(Prme1("NombreSitesInaccessibles=%d\n"
,SOUS(MUL2(dimX_reduite,dimY_reduite)
,DOUB(NombreTotalRectangles)
)
)
);
Eblock
ATes
Bblock
Eblock
ETes
Eblock
ATes
Bblock
Eblock
ETes
CALi(Iupdate_image(nom_imageR,ImageR));
RETU_Commande;
Eblock
ECommande