/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        R E M P L I S S A G E   D E   T O U S   L E S   C O N T O U R S  :                                                         */
/*                                                                                                                                   */
/*                                                                                                                                   */
/*        Definition :                                                                                                               */
/*                                                                                                                                   */
/*                    Cette commande permet d'extraire                                                                               */
/*                  tous les contours contenus dans une image                                                                        */
/*                  Argument et de les remplir.                                                                                      */
/*                                                                                                                                   */
/*                                                                                                                                   */
/*        Author of '$xci/contours.22$K' :                                                                                           */
/*                                                                                                                                   */
/*                    Jean-Francois COLONNA (LACTAMME, 20161027172653).                                                              */
/*                                                                                                                                   */
/*************************************************************************************************************************************/

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        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   COMPLEMENTER_L_IMAGE                                                                                                          \
                    FAUX                                                                                                                \
                                        /* Faut-il complementer l'image dont on veut remplir tous les contours (introduit            */ \
                                        /* le 20231128092920) ?                                                                      */

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

#define   CHOISIR_LE_NIVEAU_DE_REMPLISSAGE_DANS_UNE_IMAGE_DE_TEXTURAGE                                                                  \
                    FAUX                                                                                                                \
                                        /* Afin de pouvoir remplir chaque contour avec un niveau preleve dans une image auxiliaire   */ \
                                        /* de "Texturage" au point correspondant au point de depart (introduit le 20220121141035).   */ \
                                        /* La valeur 'FAUX' par defaut garantit la compatibilite anterieure...                       */

#define   UTILISER_LA_TAILLE_DES_CONTOURS_COMME_NIVEAU_DE_REMPLISSAGE                                                                   \
                    FAUX
#define   A_FACTEUR_DE_LA_TAILLE_DES_CONTOURS                                                                                           \
                    GRO2(FRA10(FRA10(FU)))
#define   B_FACTEUR_DE_LA_TAILLE_DES_CONTOURS                                                                                           \
                    FLOT(GRIS_3)
                                        /* Afin de pouvoir remplir chaque contour avec sa taille (introduit le 20170530150522).      */

#define   UTILISER_LE_NIVEAU_MAJORITAIRE_AU_BORD_COMME_NIVEAU_DE_REMPLISSAGE                                                            \
                    FAUX                                                                                                                \
                                        /* Afin de pouvoir remplir chaque contour avec la niveau le plus represente sur son 'bord'   */ \
                                        /* (introduit le 20230823133343).                                                            */

#define   UTILISER_LA_MATRICE_D_INERTIE_POUR_DEFINIR_LE_NIVEAU_DE_REMPLISSAGE                                                           \
                    FAUX
#define   FACTEUR_____VECTEUR_PROPRE                                                                                                    \
                    SOUS(DIVI(FLOT(COULEURS),CERCLE_TRIGONOMETRIQUE),FHUIT)
#define   TRANSLATION_VECTEUR_PROPRE                                                                                                    \
                    FU
                                        /* Afin de pouvoir remplir chaque contour a partir des vecteurs propres de la matrice        */
                                        /* d'inertie (introduit le 20230825115100).                                                  */

#define   UTILISER_LE_NIVEAU_MAXIMAL_D_UN_POINT_ISOLE_COMME_NIVEAU_DE_REMPLISSAGE                                                       \
                    FAUX                                                                                                                \
                                        /* Afin de pouvoir remplir chaque contour avec la niveau maximal d'un point isole du fond    */ \
                                        /* (introduit le 20230827094130).                                                            */

#define   NIVEAU_INITIAL_DE_REMPLISSAGE_DES_CONTOURS                                                                                    \
                    NOIR_PLANCHER
#define   INCREMENT_DU_NIVEAU_DE_REMPLISSAGE_DES_CONTOURS                                                                               \
                    FU
                                        /* Definition incrementale des niveaux de remplissage...                                     */
#define   LE_NIVEAU_DE_REMPLISSAGE_DES_CONTOURS_EST_ALEATOIRE                                                                           \
                    FAUX
#define   GRAINE_DU_NIVEAU_DE_REMPLISSAGE_DES_CONTOURS_ALEATOIRE                                                                        \
                    PARE(1789)
#define   LE_NIVEAU_DE_REMPLISSAGE_DES_CONTOURS_EST_ALEATOIRE_ET_MULTIPLE_DE                                                            \
                    FU
                                        /* Definition incrementale des niveaux de remplissage dans le cas ou cela est aleatoire      */
                                        /* (introduit le 20181225173548 et complete le 20231010093951...).                           */

#define   AVERTIR_LORSQU_IL_N_Y_A_PAS_ASSEZ_DE_COULEURS                                                                                 \
                    FAUX                                                                                                                \
                                        /* Faut-il avertir lorsqu'il n'y a pas assez de couleurs (moins que de contours...)          */ \
                                        /* (introduit le 20170530133136) ?                                                           */

#define   EDITER_LES_INFORMATIONS_RELATIVES_A_CHAQUE_CONTOUR_REMPLI                                                                     \
                    FAUX                                                                                                                \
                                        /* Faut-il editer les informations relatives a chaque contour rempli (introduit le           */ \
                                        /* 20230814113953) ?                                                                         */

#define   EDITER_LE_NOMBRE_DE_CONTOURS_REMPLIS_ET_L_INCREMENT_OPTIMAL                                                                   \
                    FAUX                                                                                                                \
                                        /* Faut-il editer le nombre de contours remplis (introduit le 20161101095640) ?              */
#define   OPTIMISER_AUTOMATIQUEMENT_L_INCREMENT                                                                                         \
                    FAUX                                                                                                                \
                                        /* Faut-il calculer l'increment optimal (introduit le 20161114130029) ?                      */

#define   COMPATIBILITE_20180711                                                                                                        \
                    FAUX                                                                                                                \
                                        /* Permet de proceder a des calculs compatibles a ceux qui furent effectues anterieurement   */ \
                                        /* au 20180711115638.                                                                        */
#define   COMPATIBILITE_20231121                                                                                                        \
                    FAUX                                                                                                                \
                                        /* Permet de proceder a des calculs compatibles a ceux qui furent effectues anterieurement   */ \
                                        /* au 20231121152154.                                                                        */ \
                                        /*                                                                                           */ \
                                        /* Je rappelle le 20240103111425 que c'est cette option de compatibilite qui permet de       */ \
                                        /* forcer le premier niveau aleatoire et donc de refaire, par exemple, 'v $xiirv/SMIT.91'    */ \
                                        /* qui possede un fond NOIR (via la palette 'v $xiio/MIRE p=$xiP/random.E5')...              */
#define   COMPATIBILITE_2023112810                                                                                                      \
                    FAUX                                                                                                                \
                                        /* Permet de proceder a des calculs compatibles a ceux qui furent effectues anterieurement   */ \
                                        /* au 20231128101918.                                                                        */
#define   COMPATIBILITE_2023112811                                                                                                      \
                    FAUX                                                                                                                \
                                        /* Permet de proceder a des calculs compatibles a ceux qui furent effectues anterieurement   */ \
                                        /* au 20231128111230.                                                                        */

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        M A C R O S   U T I L E S  :                                                                                               */
/*                                                                                                                                   */
/*************************************************************************************************************************************/
#define   ImageArgument                                                                                                                 \
                    ImageA
#define   ImageContours                                                                                                                 \
                    ImageA1
#define   ImageTemporaire1                                                                                                              \
                    ImageA2
#define   ImageTemporaire2                                                                                                              \
                    ImageA3
#define   ImageMarqueur                                                                                                                 \
                    ImageA4
#define   ImageTexture                                                                                                                  \
                    ImageA5

#define   ImageRemplissage                                                                                                              \
                    ImageR

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

#define   GENERATION_NIVEAU_ALEATOIRE_DE_REMPLISSAGE(niveau_aleatoire_de_remplissage)                                                   \
                    Bblock                                                                                                              \
                    EGAL(niveau_aleatoire_de_remplissage                                                                                \
                        ,rdnF2D(ADRESSE(point_courant_de_l_espace_de_parametrage)                                                       \
                               ,graine_du_niveau_de_remplissage_des_contours_aleatoire                                                  \
                               ,RDN_INIT_AND_GENERE                                                                                     \
                               ,FLOT(NOIR_PLANCHER),FLOT__BLANC                                                                         \
                                )                                                                                                       \
                         );                                                                                                             \
                                        /* Generation d'un niveau aleatoire dans [NOIR_PLANCHER,BLANC] et parametre par le point     */ \
                                        /* courant de l'espace de parametrage.                                                       */ \
                                                                                                                                        \
                    SPIRALE_INITIALISATION;                                                                                             \
                                        /* Initialisation dynamique de 'spirale_nombre_de_points_a_traiter'.                         */ \
                    SPIRALE_DEPLACEMENT(ASD1(point_courant_de_l_espace_de_parametrage,x)                                                \
                                       ,ASD1(point_courant_de_l_espace_de_parametrage,y)                                                \
                                        );                                                                                              \
                                        /* Deplacement du point courant de la spirale de l'espace de parametrage.                    */ \
                    SPIRALE_PARCOURS;                                                                                                   \
                                        /* Parcours de la spirale avec rotation eventuelle de PI/2 du bras courant...                */ \
                    Eblock                                                                                                              \
                                        /* Generation d'un niveau aleatoire de remplissage (introduit le 20231121152154)...          */

#define   MARQUEUR_D_INTERIEUR_DE_CONTOURS                                                                                              \
                    BLANC                                                                                                               \
                                        /* Niveau a utiliser pour reperer l'interieur des contours si besoin est (introduit le       */ \
                                        /* 20161118100552)...                                                                        */

#define   REMPLISSAGE_DU_CONTOUR_COURANT(niveau_de_remplissage)                                                                         \
                    Bblock                                                                                                              \
                    CALi(Inoir(ImageTemporaire2));                                                                                      \
                                                                                                                                        \
                    CALS(Iremplissage(ImageTemporaire2                                                                                  \
                                     ,ImageTemporaire1                                                                                  \
                                     ,ADRESSE(point_courant)                                                                            \
                                     ,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               \
                                     ,GENP(niveau_de_remplissage)                                                                       \
                                      )                                                                                                 \
                         );                                                                                                             \
                    Eblock                                                                                                              \
                                        /* Remplissage d'un contour (introduit sous cette forme le 20170530150522...).               */

#define   Ixx                                                                                                                           \
                    ASD2(Iremplissage_voisinage_____matrice_d_inertie_du__fond,cx,cx)
#define   Ixy                                                                                                                           \
                    ASD2(Iremplissage_voisinage_____matrice_d_inertie_du__fond,cx,cy)
#define   Iyx                                                                                                                           \
                    ASD2(Iremplissage_voisinage_____matrice_d_inertie_du__fond,cy,cx)
#define   Iyy                                                                                                                           \
                    ASD2(Iremplissage_voisinage_____matrice_d_inertie_du__fond,cy,cy)
                                        /* Definition des quatre moments d'inertie.                                                  */

#define   cA                                                                                                                            \
                    FU
#define   cB                                                                                                                            \
                    NEGA(ADD2(Ixx,Iyy))
#define   cC                                                                                                                            \
                    SOUS(MUL2(Ixx,Iyy),MUL2(Ixy,Iyx))
                                        /* Definition de l'equation du second degre donnant les valeurs propres de la matrice        */
                                        /* d'inertie...                                                                              */

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        R E M P L I S S A G E   D E   T O U S   L E S   C O N T O U R S  :                                                         */
/*                                                                                                                                   */
/*************************************************************************************************************************************/
BCommande(nombre_d_arguments,arguments)
/*-----------------------------------------------------------------------------------------------------------------------------------*/
     Bblock
     DEFV(CHAR,INIC(POINTERc(nom_imageR),NOM_PIPE));
     DEFV(CHAR,INIC(POINTERc(nom_imageA),NOM_PIPE));
     DEFV(CHAR,INIC(POINTERc(nom_imageM),NOM_PIPE));
     DEFV(CHAR,INIC(POINTERc(nom_imageT),NOM_PIPE));
                                        /* Afin de pouvoir remplir chaque contour avec un niveau preleve dans une image auxiliaire   */
                                        /* de "Texturage" au point correspondant au point de depart (introduit le 20220121141035).   */

     DEFV(Logical,INIT(complementer_l_image,COMPLEMENTER_L_IMAGE));
                                        /* Faut-il complementer l'image dont on veut remplir tous les contours (introduit            */
                                        /* le 20231128092920) ?                                                                      */

     DEFV(genere_p,INIT(seuil_de_limite_entre_l_interieur_et_l_exterieur,NIVEAU_UNDEF));
                                        /* 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(genere_p,INIT(marqueur_d_interieur_de_contours,MARQUEUR_D_INTERIEUR_DE_CONTOURS));
                                        /* Niveau a utiliser pour reperer l'interieur des contours si besoin est (introduit le       */
                                        /* 20190713132526 sous cette forme...).                                                      */

     DEFV(Logical,INIT(choisir_le_niveau_de_remplissage_dans_une_image_de_texturage
                      ,CHOISIR_LE_NIVEAU_DE_REMPLISSAGE_DANS_UNE_IMAGE_DE_TEXTURAGE
                       )
          );
                                        /* Afin de pouvoir remplir chaque contour avec un niveau preleve dans une image auxiliaire   */
                                        /* de "Texturage" au point correspondant au point de depart (introduit le 20220121141035).   */
                                        /* La valeur 'FAUX' par defaut garantit la compatibilite anterieure...                       */

     DEFV(Logical,INIT(utiliser_la_taille_des_contours_comme_niveau_de_remplissage
                      ,UTILISER_LA_TAILLE_DES_CONTOURS_COMME_NIVEAU_DE_REMPLISSAGE
                       )
          );
     DEFV(Float,INIT(A_facteur_de_la_taille_des_contours,A_FACTEUR_DE_LA_TAILLE_DES_CONTOURS));
     DEFV(Float,INIT(B_facteur_de_la_taille_des_contours,B_FACTEUR_DE_LA_TAILLE_DES_CONTOURS));
                                        /* Afin de pouvoir remplir chaque contour avec sa taille (introduit le 20170530150522).      */
     DEFV(Logical,INIT(utiliser_le_niveau_majoritaire_au_bord_comme_niveau_de_remplissage
                      ,UTILISER_LE_NIVEAU_MAJORITAIRE_AU_BORD_COMME_NIVEAU_DE_REMPLISSAGE
                       )
          );
                                        /* Afin de pouvoir remplir chaque contour avec la niveau le plus represente sur son 'bord'   */
                                        /* (introduit le 20230823133343).                                                            */
     DEFV(Logical,INIT(utiliser_la_matrice_d_inertie_pour_definir_le_niveau_de_remplissage
                      ,UTILISER_LA_MATRICE_D_INERTIE_POUR_DEFINIR_LE_NIVEAU_DE_REMPLISSAGE
                       )
          );
     DEFV(Float,INIT(facteur_____vecteur_propre,FACTEUR_____VECTEUR_PROPRE));
     DEFV(Float,INIT(translation_vecteur_propre,TRANSLATION_VECTEUR_PROPRE));
                                        /* Afin de pouvoir remplir chaque contour a partir des vecteurs propres de la matrice        */
                                        /* d'inertie (introduit le 20230825115100).                                                  */

     DEFV(Logical,INIT(utiliser_le_niveau_maximal_d_un_point_isole_comme_niveau_de_remplissage
                      ,UTILISER_LE_NIVEAU_MAXIMAL_D_UN_POINT_ISOLE_COMME_NIVEAU_DE_REMPLISSAGE
                       )
          );
                                        /* Afin de pouvoir remplir chaque contour avec la niveau maximal d'un point isole du fond    */
                                        /* (introduit le 20230827094130).                                                            */

     DEFV(Float,INIT(niveau_courant_de_remplissage_des_contours,FLOT__UNDEF));
     DEFV(genere_p,INIT(niveau_initial_de_remplissage_des_contours,NIVEAU_INITIAL_DE_REMPLISSAGE_DES_CONTOURS));
     DEFV(Float,INIT(increment_du_niveau_de_remplissage_des_contours,INCREMENT_DU_NIVEAU_DE_REMPLISSAGE_DES_CONTOURS));
                                        /* Definition incrementale des niveaux de remplissage...                                     */
                                        /*                                                                                           */
                                        /* Le 20161028101211, le niveau courant et son increment sont passes en 'Float' de facon     */
                                        /* a disposer, si besoin est, de suffisamment de niveaux dans [NOIR_PLANCHER,BLANC]...       */
     DEFV(Logical,INIT(le_niveau_de_remplissage_des_contours_est_aleatoire,LE_NIVEAU_DE_REMPLISSAGE_DES_CONTOURS_EST_ALEATOIRE));
     DEFV(Int,INIT(graine_du_niveau_de_remplissage_des_contours_aleatoire,GRAINE_DU_NIVEAU_DE_REMPLISSAGE_DES_CONTOURS_ALEATOIRE));
     DEFV(Float,INIT(le_niveau_de_remplissage_des_contours_est_aleatoire_et_multiple_de
                    ,LE_NIVEAU_DE_REMPLISSAGE_DES_CONTOURS_EST_ALEATOIRE_ET_MULTIPLE_DE
                     )
          );
     DEFV(pointF_2D,point_courant_de_l_espace_de_parametrage);
     SPIRALE_DEFINITION_GENERALE(SPIRALE_DELTA_HORIZONTAL_GLOBAL,SPIRALE_DELTA_VERTICAL_GLOBAL)
                                        /* Definition incrementale des niveaux de remplissage dans le cas ou cela est aleatoire      */
                                        /* (introduit le 20181225173548)...                                                          */

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

     DEFV(Logical,INIT(avertir_lorsqu_il_n_y_a_pas_assez_de_couleurs,AVERTIR_LORSQU_IL_N_Y_A_PAS_ASSEZ_DE_COULEURS));
                                        /* Faut-il avertir lorsqu'il n'y a pas assez de couleurs (moins que de contours...)          */
                                        /* (introduit le 20170530133136) ?                                                           */

     DEFV(Logical,INIT(editer_les_informations_relatives_a_chaque_contour_rempli
                      ,EDITER_LES_INFORMATIONS_RELATIVES_A_CHAQUE_CONTOUR_REMPLI
                       )
          );
                                        /* Faut-il editer les informations relatives a chaque contour rempli (introduit le           */
                                        /* 20230814113953) ?                                                                         */

     DEFV(Logical,INIT(editer_le_nombre_de_contours_remplis_et_l_increment_optimal
                      ,EDITER_LE_NOMBRE_DE_CONTOURS_REMPLIS_ET_L_INCREMENT_OPTIMAL
                       )
          );
                                        /* Faut-il editer le nombre de contours remplis (introduit le 20161101095640) ?              */
     DEFV(Logical,INIT(remplir_les_contours,VRAI));
     DEFV(Logical,INIT(c_est_la_passe_d_optimisation_de_l_increment,LUNDEF));
     DEFV(Logical,INIT(optimiser_automatiquement_l_increment,OPTIMISER_AUTOMATIQUEMENT_L_INCREMENT));
                                        /* Faut-il calculer l'increment optimal (introduit le 20161114130029) ?                      */

     DEFV(Logical,INIT(compatibilite_20180711,COMPATIBILITE_20180711));
                                        /* Permet de proceder a des calculs compatibles a ceux qui furent effectues anterieurement   */
                                        /* au 20180711115638.                                                                        */
     DEFV(Logical,INIT(compatibilite_20231121,COMPATIBILITE_20231121));
                                        /* Permet de proceder a des calculs compatibles a ceux qui furent effectues anterieurement   */
                                        /* au 20231121152154.                                                                        */
                                        /*                                                                                           */
                                        /* Je rappelle le 20240103111425 que c'est cette option de compatibilite qui permet de       */
                                        /* forcer le premier niveau aleatoire et donc de refaire, par exemple, 'v $xiirv/SMIT.91'    */
                                        /* qui possede un fond NOIR (via la palette 'v $xiio/MIRE p=$xiP/random.E5')...              */
     DEFV(Logical,INIT(compatibilite_2023112810,COMPATIBILITE_2023112810));
                                        /* Permet de proceder a des calculs compatibles a ceux qui furent effectues anterieurement   */
                                        /* au 20231128101918.                                                                        */
     DEFV(Logical,INIT(compatibilite_2023112811,COMPATIBILITE_2023112811));
                                        /* Permet de proceder a des calculs compatibles a ceux qui furent effectues anterieurement   */
                                        /* au 20231128111230.                                                                        */
     /*..............................................................................................................................*/
     GET_ARGUMENTSv(nombre_d_arguments
                   ,BLOC(GET_ARGUMENT_L("compatibilite_20180711=",compatibilite_20180711);
                         GET_ARGUMENT_L("compatibilite_20231121=",compatibilite_20231121);
                         GET_ARGUMENT_L("compatibilite_2023112810=",compatibilite_2023112810);
                         GET_ARGUMENT_L("compatibilite_2023112811=",compatibilite_2023112811);

                         GET_ARGUMENT_C("imageA=""A=",nom_imageA);
                         GET_ARGUMENT_C("imageM=""M=",nom_imageM);
                         GET_ARGUMENT_C("imageT=""T=",nom_imageT);
                                        /* Parametre introduit le 20220121141035...                                                  */
                         GET_ARGUMENT_C("imageR=""R=",nom_imageR);

                                        /* Le 20230823124532, a ete supprime :                                                       */
                                        /*                                                                                           */
                                        /*        GET_ARGUMENT_P("seuil=""s=",seuil_de_limite_entre_l_interieur_et_l_exterieur);     */
                                        /*                                                                                           */
                                        /* qui ne sert a rien et provient en fait, historiquement, de 'v $xci/contours.01$K',        */
                                        /* 'v $xci/contours.11$K' ou encore de 'v $xci/contours.12$K'...                             */

                         GET_ARGUMENT_L("complementer=""comp=",complementer_l_image);
                                        /* Parametre introduit le 20231128092920...                                                  */

                         GET_ARGUMENT_P("marqueur_interieur_contours=""marqueur=""mic=",marqueur_d_interieur_de_contours);
                                        /* Parametres introduits le 20190713132526...                                                */

                         GET_ARGUMENT_L("utiliser_taille=""taille=",utiliser_la_taille_des_contours_comme_niveau_de_remplissage);
                         GET_ARGUMENT_F("Afacteur_taille=""Afacteur=""Af=",A_facteur_de_la_taille_des_contours);
                         GET_ARGUMENT_F("Bfacteur_taille=""Bfacteur=""Bf=",B_facteur_de_la_taille_des_contours);
                                        /* Parametres introduits le 20170530150522...                                                */

                         GET_ARGUMENT_L("utiliser_bord_majoritaire=""majoritaire="
                                       ,utiliser_le_niveau_majoritaire_au_bord_comme_niveau_de_remplissage
                                        );
                                        /* Parametre introduit le 20230823133343...                                                  */

                         GET_ARGUMENT_L("matrice_inertie=""inertie="
                                       ,utiliser_la_matrice_d_inertie_pour_definir_le_niveau_de_remplissage
                                        );
                         GET_ARGUMENT_F("facteur_vecteur_propre=""fvp=",facteur_____vecteur_propre);
                         GET_ARGUMENT_F("translation_vecteur_propre=""tvp=",translation_vecteur_propre);
                                        /* Parametres introduits le 20230825115100...                                                */

                         GET_ARGUMENT_L("utiliser_niveau_maximal_point_isole=""point_isole="
                                       ,utiliser_le_niveau_maximal_d_un_point_isole_comme_niveau_de_remplissage
                                        );
                                        /* Parametre introduit le 20230827094130...                                                  */

                         GET_ARGUMENT_P("niveau_initial=""ni=",niveau_initial_de_remplissage_des_contours);
                         GET_ARGUMENT_F("increment_niveau=""in=",increment_du_niveau_de_remplissage_des_contours);

                         GET_ARGUMENT_L("niveau_aleatoire=""na=",le_niveau_de_remplissage_des_contours_est_aleatoire);
                         GET_ARGUMENT_I("graine_niveau_aleatoire=""graine=",graine_du_niveau_de_remplissage_des_contours_aleatoire);
                         GET_ARGUMENT_F("niveau_aleatoire_multiple=""nam="
                                       ,le_niveau_de_remplissage_des_contours_est_aleatoire_et_multiple_de
                                        );
                                        /* Parametres completes par l'aleatoire le 20181225173548 et completes le 20231010093951...  */

                         GET_ARGUMENT_I("methode=",gen_ft_____methode_standard);
                                        /* Parametre introduit le 20231010115303...                                                  */

                         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);
                                        /* Les Directions Cardinales de type 'v $xiii/vecteurs$DEF Rappel.sur.les.orientations'      */
                                        /* ont ete introduites le 20231201093838 dans l'idee d'une extension tridimensionnelle...    */

                         GET_ARGUMENT_L("avertir_couleurs=""avertir=",avertir_lorsqu_il_n_y_a_pas_assez_de_couleurs);
                                        /* Parametres introduits le 20161101095640...                                                */

                         GET_ARGUMENT_L("editer_informations=""informations="
                                       ,editer_les_informations_relatives_a_chaque_contour_rempli
                                        );
                                        /* Parametres introduits le 20230814113953...                                                */
                                        /*                                                                                           */
                                        /* Jusqu'au 20231129101526, il y avait ici par erreur :                                      */
                                        /*                                                                                           */
                                        /*                  "editer__informations="                                                  */
                                        /*                                                                                           */
                                        /* qui a ete corrige a cette date...                                                         */

                         GET_ARGUMENT_L("editer_nombre_contours_remplis=""editer="
                                       ,editer_le_nombre_de_contours_remplis_et_l_increment_optimal
                                        );
                                        /* Parametres introduits le 20161101095640...                                                */
                         GET_ARGUMENT_L("optimiser_increment=""optimiser=""oi=",optimiser_automatiquement_l_increment);
                                        /* Parametres introduits le 20161114130029...                                                */

                         GET_ARGUMENT_L("editer_centres_gravite=""editer_centre_gravite=""ecg="
                                       ,Iremplissage_____editer_le_centre_de_gravite
                                        );
                                        /* Parametres introduits le 20161105105948 et complete le 20161106091321 avec le pluriel...  */
                         GET_ARGUMENT_L("editer_matrices_inertie=""editer_matrice_inertie=""emi="
                                       ,Iremplissage_____editer_la_matrice_d_inertie
                                        );
                                        /* Parametres introduits le 20230825102403...                                                */
                         )
                    );

     Test(IL_FAUT(utiliser_la_taille_des_contours_comme_niveau_de_remplissage))
                                        /* Test introduit le 20170530152733...                                                       */
          Bblock
          Eblock
     ATes
          Bblock
          Test(IFEQ(niveau_initial_de_remplissage_des_contours,NOIR))
               Bblock
               PRINT_ERREUR("le niveau initial de remplissage ne peut etre le NOIR");
               EGAL(niveau_initial_de_remplissage_des_contours,SUCN(niveau_initial_de_remplissage_des_contours));
               Eblock
          ATes
               Bblock
               Eblock
          ETes
          Eblock
     ETes

     Test(IFET(IL_FAUT(choisir_le_niveau_de_remplissage_dans_une_image_de_texturage)
              ,I4OU(IL_FAUT(utiliser_la_taille_des_contours_comme_niveau_de_remplissage)
                   ,IL_FAUT(utiliser_le_niveau_majoritaire_au_bord_comme_niveau_de_remplissage)
                   ,IL_FAUT(utiliser_la_matrice_d_inertie_pour_definir_le_niveau_de_remplissage)
                   ,IL_FAUT(utiliser_le_niveau_maximal_d_un_point_isole_comme_niveau_de_remplissage)
                    )
               )
          )
                                        /* Test introduit le 20230823133343...                                                       */
          Bblock
          PRINT_ATTENTION("le remplissage avec une image de texturage l'emporte sur les autres methodes");

          EGAL(utiliser_la_taille_des_contours_comme_niveau_de_remplissage,FAUX);
          EGAL(utiliser_le_niveau_majoritaire_au_bord_comme_niveau_de_remplissage,FAUX);
          EGAL(utiliser_la_matrice_d_inertie_pour_definir_le_niveau_de_remplissage,FAUX);
          EGAL(utiliser_le_niveau_maximal_d_un_point_isole_comme_niveau_de_remplissage,FAUX);
          Eblock
     ATes
          Bblock
          Eblock
     ETes

     Test(IFET(IL_FAUT(utiliser_la_taille_des_contours_comme_niveau_de_remplissage)
              ,I3OU(IL_FAUT(utiliser_le_niveau_majoritaire_au_bord_comme_niveau_de_remplissage)
                   ,IL_FAUT(utiliser_la_matrice_d_inertie_pour_definir_le_niveau_de_remplissage)
                   ,IL_FAUT(utiliser_le_niveau_maximal_d_un_point_isole_comme_niveau_de_remplissage)
                    )
               )
          )
                                        /* Test introduit le 20230823133343...                                                       */
          Bblock
          PRINT_ATTENTION("la taille des contours l'emporte sur les autres methodes");

          EGAL(utiliser_le_niveau_majoritaire_au_bord_comme_niveau_de_remplissage,FAUX);
          EGAL(utiliser_la_matrice_d_inertie_pour_definir_le_niveau_de_remplissage,FAUX);
          EGAL(utiliser_le_niveau_maximal_d_un_point_isole_comme_niveau_de_remplissage,FAUX);
          Eblock
     ATes
          Bblock
          Eblock
     ETes

     Test(IFET(IL_FAUT(utiliser_le_niveau_majoritaire_au_bord_comme_niveau_de_remplissage)
              ,IFOU(IL_FAUT(utiliser_la_matrice_d_inertie_pour_definir_le_niveau_de_remplissage)
                   ,IL_FAUT(utiliser_le_niveau_maximal_d_un_point_isole_comme_niveau_de_remplissage)
                    )
               )
          )
                                        /* Test introduit le 20230825115536...                                                       */
          Bblock
          PRINT_ATTENTION("la recherche du niveau majoritaire du bord l'emporte sur les autres methodes");

          EGAL(utiliser_la_matrice_d_inertie_pour_definir_le_niveau_de_remplissage,FAUX);
          EGAL(utiliser_le_niveau_maximal_d_un_point_isole_comme_niveau_de_remplissage,FAUX);
          Eblock
     ATes
          Bblock
          Eblock
     ETes

     Test(IFET(IL_FAUT(utiliser_la_matrice_d_inertie_pour_definir_le_niveau_de_remplissage)
              ,IL_FAUT(utiliser_le_niveau_maximal_d_un_point_isole_comme_niveau_de_remplissage)
               )
          )
                                        /* Test introduit le 20230827094130...                                                       */
          Bblock
          PRINT_ATTENTION("la recherche de la matrice d'inertie l'emporte sur les autres methodes");

          EGAL(utiliser_le_niveau_maximal_d_un_point_isole_comme_niveau_de_remplissage,FAUX);
          Eblock
     ATes
          Bblock
          Eblock
     ETes

     EGAL(seuil_de_limite_entre_l_interieur_et_l_exterieur,PREN(niveau_initial_de_remplissage_des_contours));
                                        /* Seuil de limite entre l'interieur et l'exterieur des contours.                            */

     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

     EGAL(choisir_le_niveau_de_remplissage_dans_une_image_de_texturage,FAUX);
                                        /* Par defaut...                                                                             */

     Test(IFEQ_chaine(nom_imageT,NOM_PIPE))
                                        /* Tout ceci fut introduit le 20220121141035...                                              */
          Bblock
          CALi(Iinitialisation(ImageTexture,marqueur_d_interieur_de_contours));
                                        /* Initialisation inutile, mais c'est quand meme plus propre...                              */
          Eblock
     ATes
          Bblock
          Test(PAS_D_ERREUR(CODE_ERROR(Iload_image(ImageTexture,nom_imageT))))
               Bblock
               EGAL(choisir_le_niveau_de_remplissage_dans_une_image_de_texturage,VRAI);
               Eblock
          ATes
               Bblock
               CALi(Iinitialisation(ImageTexture,marqueur_d_interieur_de_contours));
                                        /* Initialisation inutile, mais c'est quand meme plus propre...                              */
               Test__CODE_ERREUR__ERREUR07;
               Eblock
          ETes
          Eblock
     ETes

     Test(IFEQ_chaine(nom_imageM,NOM_PIPE))
                                        /* Tout ceci fut introduit le 20161118100552...                                              */
          Bblock
          CALi(Iinitialisation(ImageMarqueur,marqueur_d_interieur_de_contours));
          Eblock
     ATes
          Bblock
          Test(PAS_D_ERREUR(CODE_ERROR(Iload_image(ImageMarqueur,nom_imageM))))
               Bblock
               Eblock
          ATes
               Bblock
               CALi(Iinitialisation(ImageMarqueur,marqueur_d_interieur_de_contours));
               Test__CODE_ERREUR__ERREUR07;
               Eblock
          ETes
          Eblock
     ETes

     Test(PAS_D_ERREUR(CODE_ERROR(Iload_image(ImageArgument,nom_imageA))))
          Bblock
          DEFV(Int,INIT(compteur_des_contours,ZERO));
                                        /* Compteur des contours remplis introduit le 20161101094836. On notera que l'on ne connait  */
                                        /* pas a priori le nombre de contours a extraire...                                          */

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

          Test(IL_FAUT(complementer_l_image))
               Bblock
               CALS(Icomplementation(ImageContours,ImageArgument));
                                        /* Possibilite introduite le 20231128092920...                                               */
               Eblock
          ATes
               Bblock
               CALS(Imove(ImageContours,ImageArgument));
               Eblock
          ETes

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

          Test(IL_FAUT(optimiser_automatiquement_l_increment))
               Bblock
               EGAL(c_est_la_passe_d_optimisation_de_l_increment,VRAI);
               Eblock
          ATes
               Bblock
               Eblock
          ETes

          Tant(IL_FAUT(remplir_les_contours))
                                        /* Boucle introduite le 20161114130029...                                                    */
               Bblock
               CLIR(compteur_des_contours);

               Test(EST_VRAI(le_niveau_de_remplissage_des_contours_est_aleatoire))
                                        /* Test introduit le 20181225173548 et deplace ici le 20231121152154...                      */
                    Bblock
                    SPIRALE_VALIDATION;
                    INITIALISATION_POINT_2D(point_courant_de_l_espace_de_parametrage,FLOT(Xmin),FLOT(Ymin));

                    Test(IL_FAUT(compatibilite_20231121))
                         Bblock
                         Eblock
                    ATes
                         Bblock
                         DEFV(Float,INIT(niveau_initial_aleatoire_de_remplissage_des_contours,FLOT__UNDEF));

                         GENERATION_NIVEAU_ALEATOIRE_DE_REMPLISSAGE(niveau_initial_aleatoire_de_remplissage_des_contours);
                         EGAL(niveau_initial_de_remplissage_des_contours,GENP(niveau_initial_aleatoire_de_remplissage_des_contours));
                         Eblock
                    ETes
                    Eblock
               ATes
                    Bblock
                    Eblock
               ETes

               EGAL(niveau_courant_de_remplissage_des_contours,FLOT(niveau_initial_de_remplissage_des_contours));

               CALi(Inoir(ImageRemplissage));
               CALi(Imove(ImageTemporaire1,ImageContours));

               begin_image
                    Bblock
                    DEFV(genere_p,INIT(niveau_courant,load_point(ImageTemporaire1,X,Y)));
                    DEFV(genere_p,INIT(marqueur_courant,load_point(ImageMarqueur,X,Y)));
                    DEFV(pointF_2D,point_courant);
                                        /* Point de depart de l'extraction de contour.                                               */
                    Test(IFET(IFET(EST_VRAI(ITb1(fond,INDX(niveau_courant,NOIR)))
                                  ,EST_FAUX(ITb1(bord,INDX(niveau_courant,NOIR)))
                                   )
                             ,IFEQ(marqueur_courant,marqueur_d_interieur_de_contours)
                              )
                         )
                                        /* Ainsi, on se place sur le premier point {X,Y} qui appartient au fond et qui est           */
                                        /* eventuellement marque...                                                                  */
                                        /*                                                                                           */
                                        /* Le 20161118100552 a ete introduite la possibilite d'etre beaucoup plus selectif en        */
                                        /* n'etant plus exhaustif (via une image 'ImageMarqueur')...                                 */
                         Bblock
                         DEFV(Float,INIT(prochain_niveau_courant_de_remplissage_des_contours,FLOT__UNDEF));

                         INITIALISATION_POINT_2D(point_courant,_____cNORMALISE_OX(X),_____cNORMALISE_OY(Y));

                         Test(IL_FAUT(choisir_le_niveau_de_remplissage_dans_une_image_de_texturage))
                                        /* Possibilite introduite le 20220121141035...                                               */
                              Bblock
                              EGAL(niveau_courant_de_remplissage_des_contours,load_point(ImageTexture,X,Y));
                              Eblock
                         ATes
                              Bblock
                              Test(IL_FAUT(utiliser_la_taille_des_contours_comme_niveau_de_remplissage))
                                        /* Possibilite introduite le 20170530150522...                                               */
                                   Bblock
                                   REMPLISSAGE_DU_CONTOUR_COURANT(niveau_courant_de_remplissage_des_contours);

                                   EGAL(niveau_courant_de_remplissage_des_contours
                                       ,AXPB(A_facteur_de_la_taille_des_contours
                                            ,Iremplissage_voisinage_____nombre_de_points_du__fond
                                            ,B_facteur_de_la_taille_des_contours
                                             )
                                        );
                                        /* Ainsi lors du "vrai" remplissage (celui qui suit), le niveau de remplissage sera          */
                                        /* fonction du nombre de points de ce contour. On notera malgre tout un petit probleme :     */
                                        /* celui des contours partiellement hors de l'image...                                       */

                                   Test(IFLT(niveau_courant_de_remplissage_des_contours,SUCN(FLOT__BLANC)))
                                        Bblock
                                        Eblock
                                   ATes
                                        Bblock
                                        EGAL(niveau_courant_de_remplissage_des_contours,FLOT__BLANC);
                                        /* Introduit le 20170601154435 car, en effet, ce seuillage manquait et faisait donc          */
                                        /* que le niveau de marquage "effectif" (apres le 'GENP(...)') pouvait etre egal a 'NOIR'.   */
                                        Eblock
                                   ETes
                                   Eblock
                              ATes
                                   Bblock
                                   Eblock
                              ETes

                              Test(IL_FAUT(utiliser_le_niveau_majoritaire_au_bord_comme_niveau_de_remplissage))
                                        /* Possibilite introduite le 20230823133343...                                               */
                                   Bblock
                                   BSaveModifyVariable(Logical
                                                      ,Iremplissage_____calculer_l_histogramme_du__bord
                                                      ,utiliser_le_niveau_majoritaire_au_bord_comme_niveau_de_remplissage
                                                       );

                                   REMPLISSAGE_DU_CONTOUR_COURANT(niveau_courant_de_remplissage_des_contours);

                                   begin_nouveau_block
                                        Bblock
                                        DEFV(Int,INIT(compteur_maximal,ZERO));
                                        DEFV(genere_p,INIT(niveau_maximal,NIVEAU_UNDEF));
                                        /* Afin de rechercher le niveau qui correspond au compteur maximal...                        */

                                        BoIn(niveau,NOIR,BLANC,PAS_COULEURS)
                                             Bblock
                                             Test(IFGE(ACCES_HISTOGRAMME(niveau),compteur_maximal))
                                                  Bblock
                                                  EGAL(compteur_maximal,ACCES_HISTOGRAMME(niveau));
                                                  EGAL(niveau_maximal,niveau);
                                                  Eblock
                                             ATes
                                                  Bblock
                                                  Eblock
                                             ETes
                                             Eblock
                                        EBoI

                                        EGAL(niveau_courant_de_remplissage_des_contours,FLOT(niveau_maximal));
                                        Eblock
                                   end_nouveau_block

                                   ESaveModifyVariable(Logical
                                                      ,Iremplissage_____calculer_l_histogramme_du__bord
                                                       );
                                   Eblock
                              ATes
                                   Bblock
                                   Eblock
                              ETes

                              Test(IL_FAUT(utiliser_la_matrice_d_inertie_pour_definir_le_niveau_de_remplissage))
                                        /* Possibilite introduite le 20230825115536...                                               */
                                   Bblock
                                   REMPLISSAGE_DU_CONTOUR_COURANT(niveau_courant_de_remplissage_des_contours);
                                        /* Calcul du centre de gravite...                                                            */

                                   begin_nouveau_block
                                        Bblock
                                        BSaveModifyVariable(Logical
                                                           ,Iremplissage_voisinage_____calculer_la_matrice_d_inertie_du__fond
                                                           ,utiliser_la_matrice_d_inertie_pour_definir_le_niveau_de_remplissage
                                                            );

                                        REMPLISSAGE_DU_CONTOUR_COURANT(niveau_courant_de_remplissage_des_contours);
                                        /* Calcul de la matrice d'inertie...                                                         */

                                        begin_nouveau_block
                                             Bblock
                                             DEFV(deltaF_2D,vecteur_propre_1);
                                             DEFV(deltaF_2D,vecteur_propre_2);
                                        /* Definition des deux vecteurs propres...                                                   */

                                             Test(IFET(IZEQ(Ixy),IZEQ(Iyx)))
                                                  Bblock
                                                  INITIALISATION_ACCROISSEMENT_2D(vecteur_propre_1,FU,FZERO);
                                                  INITIALISATION_ACCROISSEMENT_2D(vecteur_propre_2,FZERO,FU);
                                        /* On choisit arbitraiement la base {{1,0},{0,1}}...                                         */
                                                  Eblock
                                             ATes
                                                  Bblock
                                                  DEFV(Float,INIT(s1,FLOT__UNDEF));
                                                  DEFV(Float,INIT(s2,FLOT__UNDEF));
                                        /* Definition des deux valeurs propres...                                                    */

                                                  EGAL(s1,RACINE_REELLE_p_DE_L_EQUATION_DU_SECOND_DEGRE(cA,cB,cC));
                                                  EGAL(s2,RACINE_REELLE_n_DE_L_EQUATION_DU_SECOND_DEGRE(cA,cB,cC));
                                        /* Calcul des valeurs propres 's1' et 's2'...                                                */
                                        /*                                                                                           */
                                        /* Soit 'M' la matrice d'inertie :                                                           */
                                        /*                                                                                           */
                                        /*                      |                     |                                              */
                                        /*                      |    Ixx       Ixy    |                                              */
                                        /*                  M = |                     |                                              */
                                        /*                      |    Iyx       Iyy    |                                              */
                                        /*                      |                     |                                              */
                                        /*                                                                                           */
                                        /* ses valeurs propres s'obtiennent en resolvant l'equation :                                */
                                        /*                                                                                           */
                                        /*                  det(M - s.I) = 0                                                         */
                                        /*                                                                                           */
                                        /* (ou 's' represente les valeurs propres) soit :                                            */
                                        /*                                                                                           */
                                        /*                  (Ixx-s).(Iyy-s) - Ixy.Iyx = 0                                            */
                                        /*                                                                                           */
                                        /* ou encore :                                                                               */
                                        /*                                                                                           */
                                        /*                   2                                                                       */
                                        /*                  s  -(Ixx+Iyy).s + (Ixx.Iyy - Ixy.Iyx) = 0.                               */
                                        /*                                                                                           */
                                        /* Les vecteurs propres 'V' s'obtiennent en resolvant l'equation :                           */
                                        /*                                                                                           */
                                        /*                  M.V = s.I.V                                                              */
                                        /*                                                                                           */
                                        /* soit :                                                                                    */
                                        /*                                                                                           */
                                        /*                  Ixx.Vx + Ixy.Vy = s.Vx                                                   */
                                        /*                  Iyx.Vx + Iyy.Vy = s.Vy                                                   */
                                        /*                                                                                           */
                                        /* d'ou :                                                                                    */
                                        /*                                                                                           */
                                        /*                  (Ixx-s).Vx + Ixy.Vy     = 0                                              */
                                        /*                  Iyx.Vx     + (Iyy-s).Vy = 0                                              */
                                        /*                                                                                           */
                                        /* Le determinant de ce systeme etant nul, il y a indetermination ; on peut donc fixer       */
                                        /* arbitrairement l'une des deux composantes...                                              */

                                                  INITIALISATION_ACCROISSEMENT_2D(vecteur_propre_1,FU,NEGA(DIVI(SOUS(Ixx,s1),Ixy)));
                                                  NORMALISATION_ACCROISSEMENT_2D(vecteur_propre_1);
                                        /* Calcul du premier vecteur propre, en fixant arbitrairement a 1 la composante en 'X'.      */

                                                  INITIALISATION_ACCROISSEMENT_2D(vecteur_propre_2,FU,NEGA(DIVI(SOUS(Ixx,s2),Ixy)));
                                                  NORMALISATION_ACCROISSEMENT_2D(vecteur_propre_2);
                                        /* Calcul du deuxieme vecteur propre, en fixant arbitrairement a 1 la composante en 'X'.     */
                                                  Eblock
                                             ETes

                                             EGAL(niveau_courant_de_remplissage_des_contours
                                                 ,AXPB(facteur_____vecteur_propre
                                                      ,Theta_2D(ASD1(vecteur_propre_1,dx),ASD1(vecteur_propre_1,dy))
                                                      ,translation_vecteur_propre
                                                       )
                                                  );
                                        /* Le niveau de remplissage est choisi en fonction de l'angle polaire de l'un des deux       */
                                        /* vecteurs propres...                                                                       */

                                             Test(IL_FAUT(Iremplissage_____editer_la_matrice_d_inertie))
                                        /* Test introduit le 20230825172403...                                                       */
                                                  Bblock
                                                  CAL3(Prme2("VecteurPropre1={%+.^^^,%+.^^^}\n"
                                                            ,ASD1(vecteur_propre_1,dx),ASD1(vecteur_propre_1,dy)
                                                             )
                                                       );
                                                  CAL3(Prme2("VecteurPropre2={%+.^^^,%+.^^^}\n"
                                                            ,ASD1(vecteur_propre_2,dx),ASD1(vecteur_propre_2,dy)
                                                             )
                                                       );
                                                  Eblock
                                             ATes
                                                  Bblock
                                                  Eblock
                                             ETes
                                             Eblock
                                        end_nouveau_block

                                        ESaveModifyVariable(Logical
                                                           ,Iremplissage_voisinage_____calculer_la_matrice_d_inertie_du__fond
                                                            );
                                        Eblock
                                   end_nouveau_block
                                   Eblock
                              ATes
                                   Bblock
                                   Eblock
                              ETes

                              Test(IL_FAUT(utiliser_le_niveau_maximal_d_un_point_isole_comme_niveau_de_remplissage))
                                        /* Possibilite introduite le 20230827094130...                                               */
                                   Bblock
                                   begin_nouveau_block
                                        Bblock
                                        BSaveModifyVariable(Logical
                                                           ,Iremplissage_voisinage_____rechercher_le_niveau_maximal_d_un_point_isole
                                                           ,utiliser_le_niveau_maximal_d_un_point_isole_comme_niveau_de_remplissage
                                                            );

                                        REMPLISSAGE_DU_CONTOUR_COURANT(niveau_courant_de_remplissage_des_contours);

                                        EGAL(niveau_courant_de_remplissage_des_contours
                                            ,MAX2(Iremplissage_voisinage_____niveau_maximal_d_un_point_isole,FLOT(NOIR_PLANCHER))
                                             );

                                        ESaveModifyVariable(Logical
                                                           ,Iremplissage_voisinage_____rechercher_le_niveau_maximal_d_un_point_isole
                                                            );
                                        Eblock
                                   end_nouveau_block
                                   Eblock
                              ATes
                                   Bblock
                                   Eblock
                              ETes
                              Eblock
                         ETes

                         REMPLISSAGE_DU_CONTOUR_COURANT(niveau_courant_de_remplissage_des_contours);
                                        /* Remplissage du contour courant...                                                         */

                         INCR(compteur_des_contours,I);
                                        /* Comptage des contours...                                                                  */

                         Test(IL_FAUT(editer_les_informations_relatives_a_chaque_contour_rempli))
                                        /* Test introduit le 20230814113953...                                                       */
                              Bblock
                              CAL3(Prme1("NumeroContour=%d     ",compteur_des_contours));
                              CAL3(Prme1("NombrePoints=%d     ",Iremplissage_voisinage_____nombre_de_points_du__fond));
                              CAL3(Prme2("Niveau=%d (%f)    "
                                        ,GENP(niveau_courant_de_remplissage_des_contours)
                                        ,niveau_courant_de_remplissage_des_contours
                                         )
                                   );
                                        /* Edition introduite le 20230828150302...                                                   */
                              CAL3(Prme2("Point={%+.^^^,%+.^^^}",ASD1(point_courant,x),ASD1(point_courant,y)));
                              CAL3(Prme0("\n"));
                              Eblock
                         ATes
                              Bblock
                              Eblock
                         ETes

                         CALS(Ior(ImageTemporaire1,ImageTemporaire1,ImageTemporaire2));
                                        /* Ainsi, 'ImageTemporaire1' contient les contours initiaux a remplir plus au fur et a       */
                                        /* mesure tous les remplissages (et ce afin de pouvoir trouver le prochain point {X,Y} du    */
                                        /* fond).                                                                                    */
                         CALS(Ior(ImageRemplissage,ImageRemplissage,ImageTemporaire2));
                                        /* Cumul du remplissage courant en vue du Resultat...                                        */

                         Test(IL_FAUT(utiliser_la_taille_des_contours_comme_niveau_de_remplissage))
                                        /* Test introduit le 20170530152733...                                                       */
                              Bblock
                              Eblock
                         ATes
                              Bblock
                              Test(EST_VRAI(le_niveau_de_remplissage_des_contours_est_aleatoire))
                                        /* Test introduit le 20181225173548...                                                       */
                                   Bblock
                                   GENERATION_NIVEAU_ALEATOIRE_DE_REMPLISSAGE(prochain_niveau_courant_de_remplissage_des_contours);

                                   EGAL(prochain_niveau_courant_de_remplissage_des_contours
                                       ,MULTIPLE1(prochain_niveau_courant_de_remplissage_des_contours
                                                 ,le_niveau_de_remplissage_des_contours_est_aleatoire_et_multiple_de
                                                  )
                                        );
                                        /* Possibilite introduite le 20231010093951...                                               */
                                   Eblock
                              ATes
                                   Bblock
                                   EGAL(prochain_niveau_courant_de_remplissage_des_contours
                                       ,ADD2(niveau_courant_de_remplissage_des_contours
                                            ,increment_du_niveau_de_remplissage_des_contours
                                             )
                                        );
                                   Eblock
                              ETes

                              Test(IL_FAUT(optimiser_automatiquement_l_increment))
                                   Bblock
                                        /* La validation a suivre n'a pas d'interet dans ce cas...                                   */
                                   Eblock
                              ATes
                                   Bblock
                                   Test(IFLT(prochain_niveau_courant_de_remplissage_des_contours,SUCN(FLOT__BLANC)))
                                        Bblock
                                        Eblock
                                   ATes
                                        Bblock
                                        Test(IZNE(CALS(Icomptage_des_points_dans_un_intervalle
                                                           (ImageTemporaire1
                                                           ,PREN(niveau_initial_de_remplissage_des_contours)
                                                           ,PREN(niveau_initial_de_remplissage_des_contours)
                                                            )
                                                       )
                                                  )
                                             )
                                        /* Je note le 20161104095242 que ce cas peut se rencontrer tout en etant normal : c'est      */
                                        /* le cas lorsque il n'y a pas de prochain contour (tout a ete rempli). Ce fut le cas        */
                                        /* avec l'image 'v $xiirv/TROR.54' qui possede 752 contours...                               */
                                        /*                                                                                           */
                                        /* Le 20231128101918, j'ai du mal a comprendre ce test qui finalement a fait disparaitre     */
                                        /* la gestion "modulo" des niveaux. D'ou les modifications du 20231128101918...              */
                                             Bblock
                                             Test(IL_FAUT(avertir_lorsqu_il_n_y_a_pas_assez_de_couleurs))
                                        /* Test introduit le 20170530133136...                                                       */
                                                  Bblock
                                                  PRINT_ERREUR("il y a plus de contours que de couleurs disponibles");
                                                  CAL1(Prer1("(contour courant numero %d)\n",compteur_des_contours));
                                                  Eblock
                                             ATes
                                                  Bblock
                                                  Eblock
                                             ETes

                                             EGAL(prochain_niveau_courant_de_remplissage_des_contours
                                                 ,COND(IL_NE_FAUT_PAS(compatibilite_20180711)
                                                      ,NEUT(niveau_initial_de_remplissage_des_contours)
                                                      ,SUCN(niveau_initial_de_remplissage_des_contours)
                                                       )
                                                  );
                                        /* A compter du 20161102113914, les niveaux sont geres "modulo"...                           */
                                             Eblock
                                        ATes
                                             Bblock
                                             Test(IL_FAUT(compatibilite_2023112810))
                                        /* Test introduit le 20231128101918...                                                       */
                                                  Bblock
                                                  Eblock
                                             ATes
                                                  Bblock
                                                  EGAL(prochain_niveau_courant_de_remplissage_des_contours
                                                      ,niveau_initial_de_remplissage_des_contours
                                                       );
                                                  Eblock
                                             ETes
                                             Eblock
                                        ETes
                                        Eblock
                                   ETes
                                   Eblock
                              ETes

                              EGAL(niveau_courant_de_remplissage_des_contours,prochain_niveau_courant_de_remplissage_des_contours);
                              Eblock
                         ETes
                         Eblock
                    ATes
                         Bblock
                         Eblock
                    ETes
                    Eblock
               end_image

               Test(IL_FAUT(utiliser_la_taille_des_contours_comme_niveau_de_remplissage))
                                        /* Test introduit le 20170530152733...                                                       */
                    Bblock
                    EGAL(remplir_les_contours,FAUX);
                    Eblock
               ATes
                    Bblock
                    Test(IL_FAUT(optimiser_automatiquement_l_increment))
                         Bblock
                         Test(EST_VRAI(c_est_la_passe_d_optimisation_de_l_increment))
                              Bblock
                              Test(IL_FAUT(compatibilite_2023112811))
                                        /* Test introduit le 20231128111230...                                                       */
                                   Bblock
                                   EGAL(increment_du_niveau_de_remplissage_des_contours
                                       ,DIVI(FLOT(PREN(COULEURS)),FLOT(compteur_des_contours))
                                        );
                                   Eblock
                              ATes
                                   Bblock
                                   EGAL(increment_du_niveau_de_remplissage_des_contours
                                       ,DIVI(FLOT(SOUS(PREN(COULEURS)
                                                      ,SOUS(niveau_initial_de_remplissage_des_contours
                                                           ,NIVEAU_INITIAL_DE_REMPLISSAGE_DES_CONTOURS
                                                            )
                                                       )
                                                  )
                                            ,FLOT(compteur_des_contours)
                                             )
                                        );
                                   Eblock
                              ETes
                              EGAL(c_est_la_passe_d_optimisation_de_l_increment,FAUX);
                              Eblock
                         ATes
                              Bblock
                              EGAL(remplir_les_contours,FAUX);
                              Eblock
                         ETes
                         Eblock
                    ATes
                         Bblock
                         EGAL(remplir_les_contours,FAUX);
                         Eblock
                    ETes
                    Eblock
               ETes
               Eblock
          ETan

          Test(IL_FAUT(utiliser_la_taille_des_contours_comme_niveau_de_remplissage))
                                        /* Test introduit le 20170530152733...                                                       */
               Bblock
               Eblock
          ATes
               Bblock
               Test(IZGT(compteur_des_contours))
                                        /* Test introduit le 20220123123956...                                                       */
                    Bblock
                    Test(IL_FAUT(editer_le_nombre_de_contours_remplis_et_l_increment_optimal))
                         Bblock
                         CAL3(Prme1("NombreContoursRemplis=%d\n",compteur_des_contours));
                                        /* Fonctionnalite introduite le 20161101095640...                                            */
                         CAL3(Prme1("IncrementOptimal=%+.^^^\n",DIVI(FLOT(PREN(COULEURS)),FLOT(compteur_des_contours))));
                                        /* Fonctionnalite introduite le 20161101100623...                                            */
                         Eblock
                    ATes
                         Bblock
                         Eblock
                    ETes
                    Eblock
               ATes
                    Bblock
                    PRINT_ATTENTION("aucun contour n'a ete rempli");
                    Eblock
               ETes
               Eblock
          ETes

          CALi(Iupdate_image(nom_imageR,ImageRemplissage));
                                        /* Memorisation du resultat.                                                                 */
          Eblock
     ATes
          Bblock
          Test__CODE_ERREUR__ERREUR07;
          Eblock
     ETes

     RETU_Commande;
     Eblock
ECommande



Copyright © Jean-François COLONNA, 2019-2024.
Copyright © CMAP (Centre de Mathématiques APpliquées) UMR CNRS 7641 / École polytechnique, Institut Polytechnique de Paris, 2019-2024.