/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        D E F I N I T I O N   D U   P A R C O U R S   D ' U N E   I M A G E  :                                                     */
/*                                                                                                                                   */
/*                                                                                                                                   */
/*        Author of '$xiii/begin_end$DEF' :                                                                                          */
/*                                                                                                                                   */
/*                    Jean-Francois COLONNA (LACTAMME, 19870000000000).                                                              */
/*                                                                                                                                   */
/*************************************************************************************************************************************/

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        V E R I F I C A T I O N S   D E   L ' I N D E X A T I O N  :                                                               */
/*                                                                                                                                   */
/*************************************************************************************************************************************/

#ifndef   __VERSION__INDEXATION_SIMPLIFIEE_A_PRIORI
#    define    VERIFICATIONS_DE_CONFLITS_POSSIBLES_AVEC__INDEXATION_SIMPLIFIEE                                                          \
                         Bblock                                                                                                         \
                         BLOC(VIDE;);                                                                                                   \
                         Eblock                                                                                                         \
                                        /* Procedure introduite le 20170713115708...                                                 */
#Aifndef  __VERSION__INDEXATION_SIMPLIFIEE_A_PRIORI
#    define    VERIFICATIONS_DE_CONFLITS_POSSIBLES_AVEC__INDEXATION_SIMPLIFIEE                                                          \
                         Bblock                                                                                                         \
                         Test(I3ET(IFEQ(translationX,TraX)                                                                              \
                                  ,IFEQ(translationY,TraY)                                                                              \
                                  ,IFEQ(translationZ,TraZ)                                                                              \
                                   )                                                                                                    \
                              )                                                                                                         \
                              Bblock                                                                                                    \
                              Eblock                                                                                                    \
                         ATes                                                                                                           \
                              Bblock                                                                                                    \
                              PRINT_ATTENTION("c'est l'INDEXATION SIMPLIFIEE qui est a priori utilisee ici (3)");                       \
                              CAL1(Prer3("les options ['%s','%s','%s'] sont donc ineffectives\n"                                        \
                                        ,ENTREE_ARGUMENT_translationX                                                                   \
                                        ,ENTREE_ARGUMENT_translationY                                                                   \
                                        ,ENTREE_ARGUMENT_translationZ                                                                   \
                                         )                                                                                              \
                                   );                                                                                                   \
                              Eblock                                                                                                    \
                         ETes                                                                                                           \
                         Eblock                                                                                                         \
                                        /* Procedure introduite le 20170713115708...                                                 */ \
                                        /*                                                                                           */ \
                                        /* On notera a cette date que certaines librairies ont pu etre generees en mode              */ \
                                        /* '__VERSION__INDEXATION_SIMPLIFIEE_A_PRIORI', alors que tous les '$K's utiles ne l'ont     */ \
                                        /* pas ete ainsi. Pour ces '$K's les arguments {ENTREE_ARGUMENT_translation?} existent       */ \
                                        /* donc, alors que les variables 'translation?' ne sont pas utilisees puisque les fonctions  */ \
                                        /* 'Findice_?(...)' ne seront pas referencees dans ces librairies. C'est pourquoi ces        */ \
                                        /* messages sont edites (alors qu'ils avaient ete supprimes pendant quelques heures...).     */
#Eifndef  __VERSION__INDEXATION_SIMPLIFIEE_A_PRIORI

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        F O N C T I O N S   G E N E R A L E S   D E   T E M P S   ( ' T ' )  :                                                     */
/*                                                                                                                                   */
/*************************************************************************************************************************************/

                                        /* Definitions introduites le 20171219103002...                                              */

#define   Gbegin_tempsQ(fonction_de_parcours,temps_minimal,temps_maximal,pas_temps,type_temps,select_pas)                               \
                                        /* ATTENTION, 'begin_tempsQ(...)' redefinit 'pasT' avec 'pas_temps'...                       */ \
                    Bblock                                                                                                              \
                    DEFV(type_temps,INIT(EnTete_de_sauvegardM ## T,T));                                                                 \
                                        /* Memorisation d'une eventuelle coordonnee 'T' anterieure (une coordonnee 'T' de niveau     */ \
                                        /* "bas" est donc a cause de cela definie dans '$xiii/Images$STR'). Ainsi, la procedure      */ \
                                        /* 'begin_tempsQ(...)' a un fonctionnement recursif...                                       */ \
                    DEFV(type_temps,INIT(pasT_global,pasT));                                                                            \
                                        /* Memorisation de 'pasT' tel qu'il etait avant (en particulier a cause de 'X-Window').      */ \
                    DEFV(type_temps,INIT(EnTete_de_sauvegardM ## pasT,select_pas(pas_temps,PasT)));                                     \
                                        /* Sauvegarde temporaire du pas demande pour la temps ; ce passage par une variable          */ \
                                        /* intermediaire est rendu necessaire par le fait que la variable locale que l'on va creer   */ \
                                        /* par la suite pour le pas de la temps porte le meme nom que le pas global ('pasT'),        */ \
                                        /* et donc pour initialiser cette variable locale proprement dans les cas frequents ou       */ \
                                        /* elle doit prendre la valeur globale 'pasT', et comme on ne pourrait ecrire pasT=pasT,     */ \
                                        /* on passe par l'intermediaire 'SavA_____pasT'...                                           */ \
                         Bblock                                                                                                         \
                         DEFV(type_temps,INIT(T,CAST(type_temps,UNDEF)));                                                               \
                                        /* Definition de la temps decrivant l'axe 'OT'.                                              */ \
                         DEFV(type_temps,INIT(Tmin_begin_tempsQ,temps_minimal));                                                        \
                         DEFV(type_temps,INIT(Tmax_begin_tempsQ,temps_maximal));                                                        \
                                        /* Definition de l'axe 'OT' courant.                                                         */ \
                         DEFV(type_temps,INIT(pasT,EnTete_de_sauvegardM ## pasT));                                                      \
                                        /* Definition du pas courant de la temps decrivant l'axe 'OT' ; on choisit le meme nom       */ \
                                        /* que la variable globale 'pasT' afin que les macros 'SUCT', 'PRET' et 'INTT' fonctionnent  */ \
                                        /* correctement meme a l'exterieur de 'begin_tempsQ'/'end_tempsQ'...                         */ \
                                                                                                                                        \
                         fonction_de_parcours(T                                                                                         \
                                             ,Tmin_begin_tempsQ                                                                         \
                                             ,Tmax_begin_tempsQ                                                                         \
                                             ,pasT                                                                                      \
                                              )                                                                                         \
                              Bblock
#define   Gend_tempsQ(fin_de_fonction_de_parcours,type_temps)                                                                           \
                              Eblock                                                                                                    \
                         fin_de_fonction_de_parcours                                                                                    \
                         Eblock                                                                                                         \
                    Eblock

#define   begin_tempsQ(fonction_de_parcours,temps_minimal,temps_maximal,pas_temps)                                                      \
                    Gbegin_tempsQ(fonction_de_parcours,temps_minimal,temps_maximal,pas_temps,Int,MAX2)
#define   end_tempsQ(fin_de_fonction_de_parcours)                                                                                       \
                    Gend_tempsQ(fin_de_fonction_de_parcours,Int)

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        F O N C T I O N S   G E N E R A L E S   D E   P R O F O N D E U R   ( ' Z ' )  :                                           */
/*                                                                                                                                   */
/*************************************************************************************************************************************/
#define   Gbegin_fuiteQ(fonction_de_parcours,profondeur_minimale,profondeur_maximale,pas_profondeur,type_profondeur,select_pas)         \
                                        /* ATTENTION, 'begin_fuiteQ(...)' redefinit 'pasZ' avec 'pas_profondeur'...                  */ \
                    Bblock                                                                                                              \
                    DEFV(type_profondeur,INIT(EnTete_de_sauvegardM ## Z,Z));                                                            \
                                        /* Memorisation d'une eventuelle coordonnee 'Z' anterieure (une coordonnee 'Z' de niveau     */ \
                                        /* "bas" est donc a cause de cela definie dans '$xiii/Images$STR'). Ainsi, la procedure      */ \
                                        /* 'begin_fuiteQ(...)' a un fonctionnement recursif...                                       */ \
                    DEFV(type_profondeur,INIT(pasZ_global,pasZ));                                                                       \
                                        /* Memorisation de 'pasZ' tel qu'il etait avant (en particulier a cause de 'X-Window').      */ \
                    DEFV(type_profondeur,INIT(EnTete_de_sauvegardM ## pasZ,select_pas(pas_profondeur,PasZ)));                           \
                                        /* Sauvegarde temporaire du pas demande pour la profondeur ; ce passage par une variable     */ \
                                        /* intermediaire est rendu necessaire par le fait que la variable locale que l'on va creer   */ \
                                        /* par la suite pour le pas de la profondeur porte le meme nom que le pas global ('pasZ'),   */ \
                                        /* et donc pour initialiser cette variable locale proprement dans les cas frequents ou       */ \
                                        /* elle doit prendre la valeur globale 'pasZ', et comme on ne pourrait ecrire pasZ=pasZ,     */ \
                                        /* on passe par l'intermediaire 'SavA_____pasZ'...                                           */ \
                         Bblock                                                                                                         \
                         DEFV(type_profondeur,INIT(Z,CAST(type_profondeur,UNDEF)));                                                     \
                                        /* Definition de la profondeur decrivant l'axe 'OZ'.                                         */ \
                         DEFV(type_profondeur,INIT(Zmin_begin_fuiteQ,profondeur_minimale));                                             \
                         DEFV(type_profondeur,INIT(Zmax_begin_fuiteQ,profondeur_maximale));                                             \
                                        /* Definition de l'axe 'OZ' courant.                                                         */ \
                         DEFV(type_profondeur,INIT(pasZ,EnTete_de_sauvegardM ## pasZ));                                                 \
                                        /* Definition du pas courant de la profondeur decrivant l'axe 'OZ' ; on choisit le meme nom  */ \
                                        /* que la variable globale 'pasZ' afin que les macros 'SUCZ', 'PREZ' et 'INTZ' fonctionnent  */ \
                                        /* correctement meme a l'exterieur de 'begin_fuiteQ'/'end_fuiteQ'...                         */ \
                                                                                                                                        \
                         fonction_de_parcours(Z                                                                                         \
                                             ,Zmin_begin_fuiteQ                                                                         \
                                             ,Zmax_begin_fuiteQ                                                                         \
                                             ,pasZ                                                                                      \
                                              )                                                                                         \
                              Bblock
#define   Gend_fuiteQ(fin_de_fonction_de_parcours,type_profondeur)                                                                      \
                              Eblock                                                                                                    \
                         fin_de_fonction_de_parcours                                                                                    \
                         Eblock                                                                                                         \
                    Eblock

#define   begin_fuiteQ(fonction_de_parcours,profondeur_minimale,profondeur_maximale,pas_profondeur)                                     \
                    Gbegin_fuiteQ(fonction_de_parcours,profondeur_minimale,profondeur_maximale,pas_profondeur,Int,MAX2)
#define   end_fuiteQ(fin_de_fonction_de_parcours)                                                                                       \
                    Gend_fuiteQ(fin_de_fonction_de_parcours,Int)

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        F O N C T I O N S   G E N E R A L E S   D E   C O L O N N E S   ( ' Y ' )  :                                               */
/*                                                                                                                                   */
/*************************************************************************************************************************************/
#define   Gbegin_colonneQ(fonction_de_parcours,ordonnee_minimale,ordonnee_maximale,pas_ordonnee,type_ordonnee,select_pas)               \
                                        /* ATTENTION, 'begin_colonneQ(...)' redefinit 'pasY' avec 'pas_ordonnee'...                  */ \
                         Bblock                                                                                                         \
                         DEFV(type_ordonnee,INIT(EnTete_de_sauvegardM ## Y,Y));                                                         \
                                        /* Memorisation d'une eventuelle coordonnee 'Y' anterieure (une coordonnee 'Y' de niveau     */ \
                                        /* "bas" est donc a cause de cela definie dans '$xiii/Images$STR'). Ainsi, la procedure      */ \
                                        /* 'begin_colonneQ(...)' a un fonctionnement recursif...                                     */ \
                         DEFV(type_ordonnee,INIT(pasY_global,pasY));                                                                    \
                                        /* Memorisation de 'pasY' tel qu'il etait avant (en particulier a cause de 'X-Window').      */ \
                         DEFV(type_ordonnee,INIT(EnTete_de_sauvegardM ## pasY,select_pas(pas_ordonnee,PasY)));                          \
                                        /* Sauvegarde temporaire du pas demande pour l'ordonnee ; ce passage par une variable        */ \
                                        /* intermediaire est rendu necessaire par le fait que la variable locale que l'on va creer   */ \
                                        /* par la suite pour le pas de l'ordonnee porte le meme nom que le pas global (soit 'pasY'), */ \
                                        /* et donc pour initialiser cette variable locale proprement dans les cas frequents ou       */ \
                                        /* elle doit prendre la valeur globale 'pasY', et comme on ne pourrait ecrire pasY=pasY,     */ \
                                        /* on passe par l'intermediaire 'SavA_____pasY'...                                           */ \
                              Bblock                                                                                                    \
                              DEFV(type_ordonnee,INIT(Y,CAST(type_ordonnee,UNDEF)));                                                    \
                                        /* Definition de l'ordonnee decrivant l'axe 'OY'.                                            */ \
                              DEFV(type_ordonnee,INIT(Ymin_begin_colonneQ,ordonnee_minimale));                                          \
                              DEFV(type_ordonnee,INIT(Ymax_begin_colonneQ,ordonnee_maximale));                                          \
                                        /* Definition de l'axe 'OY' courant.                                                         */ \
                              DEFV(type_ordonnee,INIT(pasY,EnTete_de_sauvegardM ## pasY));                                              \
                                        /* Definition du pas courant de l'ordonnee decrivant l'axe 'OY' ; on choisit le meme nom     */ \
                                        /* que la variable globale 'pasY' afin que les macros 'SUCY', 'PREY' et 'INTY' fonctionnent  */ \
                                        /* correctement meme a l'exterieur de 'begin_colonneQ'/'end_colonneQ'...                     */ \
                                                                                                                                        \
                              fonction_de_parcours(Y                                                                                    \
                                                  ,Ymin_begin_colonneQ                                                                  \
                                                  ,Ymax_begin_colonneQ                                                                  \
                                                  ,pasY                                                                                 \
                                                   )                                                                                    \
                                   Bblock
#define   Gend_colonneQ(fin_de_fonction_de_parcours,type_ordonnee)                                                                      \
                                   Eblock                                                                                               \
                              fin_de_fonction_de_parcours                                                                               \
                              Eblock                                                                                                    \
                         Eblock

#define   begin_colonneQ(fonction_de_parcours,ordonnee_minimale,ordonnee_maximale,pas_ordonnee)                                         \
                         Gbegin_colonneQ(fonction_de_parcours,ordonnee_minimale,ordonnee_maximale,pas_ordonnee,Int,MAX2)
#define   end_colonneQ(fin_de_fonction_de_parcours)                                                                                     \
                         Gend_colonneQ(fin_de_fonction_de_parcours,Int)

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        F O N C T I O N S   G E N E R A L E S   D E   L I G N E S   ( ' X ' )  :                                                   */
/*                                                                                                                                   */
/*************************************************************************************************************************************/

                                        /* ATTENTION, il est imperatif que 'begin_ligneQ' utilise la fonction 'DoIn(...)', ce qui    */
                                        /* signifie que les coordonnees sont traitees de facon croissante (de 'Xmin' a 'Xmax'), car  */
                                        /* en effet, certains algorithmes utilisent ce fait ; c'est en particulier le cas de la      */
                                        /* fonction 'Istereogramme(...)' de 'v $xiii/quad_image$FON' lorsqu'a lieu le decalage de la */
                                        /* texture du stereogramme.                                                                  */

#define   Gbegin_ligneQ(fonction_de_parcours,abscisse_minimale,abscisse_maximale,pas_abscisse,type_abscisse,select_pas)                 \
                                        /* ATTENTION, 'begin_ligneQ(...)' redefinit 'pasX' avec 'pas_abscisse'...                    */ \
                              Bblock                                                                                                    \
                              DEFV(type_abscisse,INIT(EnTete_de_sauvegardM ## X,X));                                                    \
                                        /* Memorisation d'une eventuelle coordonnee 'X' anterieure (une coordonnee 'X' de niveau     */ \
                                        /* "bas" est donc a cause de cela definie dans '$xiii/Images$STR'). Ainsi, la procedure      */ \
                                        /* 'begin_ligneQ(...)' a un fonctionnement recursif...                                       */ \
                              DEFV(type_abscisse,INIT(pasX_global,pasX));                                                               \
                                        /* Memorisation de 'pasX' tel qu'il etait avant (en particulier a cause de 'X-Window').      */ \
                              DEFV(type_abscisse,INIT(EnTete_de_sauvegardM ## pasX,select_pas(pas_abscisse,PasX)));                     \
                                        /* Sauvegarde temporaire du pas demande pour l'abscisse ; ce passage par une variable        */ \
                                        /* intermediaire est rendu necessaire par le fait que la variable locale que l'on va creer   */ \
                                        /* par la suite pour le pas de l'abscisse porte le meme nom que le pas global (soit 'pasX'), */ \
                                        /* et donc pour initialiser cette variable locale proprement dans les cas frequents ou       */ \
                                        /* elle doit prendre la valeur globale 'pasX', et comme on ne pourrait ecrire pasX=pasX,     */ \
                                        /* on passe par l'intermediaire 'SavA_____pasX'...                                           */ \
                                   Bblock                                                                                               \
                                   DEFV(type_abscisse,INIT(X,CAST(type_abscisse,UNDEF)));                                               \
                                        /* Definition de l'abscisse decrivant l'axe 'OX'.                                            */ \
                                   DEFV(type_abscisse,INIT(Xmin_begin_ligneQ,abscisse_minimale));                                       \
                                   DEFV(type_abscisse,INIT(Xmax_begin_ligneQ,abscisse_maximale));                                       \
                                        /* Definition de l'axe 'OX' courant.                                                         */ \
                                   DEFV(type_abscisse,INIT(pasX,EnTete_de_sauvegardM ## pasX));                                         \
                                        /* Definition du pas courant de l'abscisse decrivant l'axe 'OX' ; on choisit le meme nom     */ \
                                        /* que la variable globale 'pasX' afin que les macros 'SUCX', 'PREX' et 'INTX' fonctionnent  */ \
                                        /* correctement meme a l'exterieur de 'begin_ligneQ'/'end_ligneQ'...                         */ \
                                        /* definition du pas courant de l'abscisse decrivant l'axe 'OX'.                             */ \
                                                                                                                                        \
                                   fonction_de_parcours(X                                                                               \
                                                       ,Xmin_begin_ligneQ                                                               \
                                                       ,Xmax_begin_ligneQ                                                               \
                                                       ,pasX                                                                            \
                                                        )                                                                               \
                                        Bblock
#define   Gend_ligneQ(fin_de_fonction_de_parcours,type_abscisse)                                                                        \
                                        Eblock                                                                                          \
                                   fin_de_fonction_de_parcours                                                                          \
                                   Eblock                                                                                               \
                              Eblock

#define   begin_ligneQ(fonction_de_parcours,abscisse_minimale,abscisse_maximale,pas_abscisse)                                           \
                              Gbegin_ligneQ(fonction_de_parcours,abscisse_minimale,abscisse_maximale,pas_abscisse,Int,MAX2)
#define   end_ligneQ(fin_de_fonction_de_parcours)                                                                                       \
                              Gend_ligneQ(fin_de_fonction_de_parcours,Int)

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        F O N C T I O N S   G E N E R A L E S   D ' I M A G E S  :                                                                 */
/*                                                                                                                                   */
/*************************************************************************************************************************************/
#define   Gbegin_imageQ(DoY,DoYmin,DoYmax,DoYpas,typeY,sYpas,DoX,DoXmin,DoXmax,DoXpas,typeX,sXpas)                                      \
                         Gbegin_colonneQ(DoY,DoYmin,DoYmax,DoYpas,typeY,sYpas)                                                          \
                              Bblock                                                                                                    \
                                        /* ATTENTION, on ne peut mettre ici :                                                        */ \
                                        /*                                                                                           */ \
                                        /*                  B_PROGRESSION_DES_BEGIN_END(Y,DoYmin,DIMENSION(DoYmin,DoYmax));          */ \
                                        /*                                                                                           */ \
                                        /* car a priori rien n'est standard, et en particulier les dimensions. On verra a ce propos  */ \
                                        /* 'v $xiipf/fonction.3$FON Fparcours_circulaire_d_une_spirale_carree' ou le "pave"          */ \
                                        /* parcouru alors n'a rien a voir avec les images au format courant...                       */ \
                              Gbegin_ligneQ(DoX,DoXmin,DoXmax,DoXpas,typeX,sXpas)                                                       \
                                   Bblock
#define   Gend_imageQ(EDoY,typeY,EDoX,typeX)                                                                                            \
                                   Eblock                                                                                               \
                              Gend_ligneQ(EDoX,typeX)                                                                                   \
                              Eblock                                                                                                    \
                         Gend_colonneQ(EDoY,typeY)

#define   begin_imageQ(DoY,DoYmin,DoYmax,DoYpas,DoX,DoXmin,DoXmax,DoXpas)                                                               \
                         Gbegin_imageQ(DoY,DoYmin,DoYmax,DoYpas,Int,MAX2                                                                \
                                      ,DoX,DoXmin,DoXmax,DoXpas,Int,MAX2                                                                \
                                       )
#define   end_imageQ(EDoY,EDoX)                                                                                                         \
                         Gend_imageQ(EDoY,Int                                                                                           \
                                    ,EDoX,Int                                                                                           \
                                     )

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        F O N C T I O N S   G E N E R A L E S   D ' A L B U M  :                                                                   */
/*                                                                                                                                   */
/*************************************************************************************************************************************/
#define   Gbegin_albumQ(DoZ,DoZmin,DoZmax,DoZpas,typeZ,sZpas,DoY,DoYmin,DoYmax,DoYpas,typeY,sYpas,DoX,DoXmin,DoXmax,DoXpas,typeX,sXpas) \
                    Gbegin_fuiteQ(DoZ,DoZmin,DoZmax,DoZpas,typeZ,sZpas)                                                                 \
                         Bblock                                                                                                         \
                                        /* ATTENTION, on ne peut mettre ici :                                                        */ \
                                        /*                                                                                           */ \
                                        /*                  B_PROGRESSION_DES_BEGIN_END(Z,DoZmin,DIMENSION(DoZmin,DoZmax));          */ \
                                        /*                                                                                           */ \
                                        /* car a priori rien n'est standard, et en particulier les dimensions.                       */ \
                         Gbegin_colonneQ(DoY,DoYmin,DoYmax,DoYpas,typeY,sYpas)                                                          \
                              Bblock                                                                                                    \
                              Gbegin_ligneQ(DoX,DoXmin,DoXmax,DoXpas,typeX,sXpas)                                                       \
                                   Bblock
#define   Gend_albumQ(EDoZ,typeZ,EDoY,typeY,EDoX,typeX)                                                                                 \
                                   Eblock                                                                                               \
                              Gend_ligneQ(EDoX,typeX)                                                                                   \
                              Eblock                                                                                                    \
                         Gend_colonneQ(EDoY,typeY)                                                                                      \
                         Eblock                                                                                                         \
                    Gend_fuiteQ(EDoZ,typeZ)

#define   begin_albumQ(DoZ,DoZmin,DoZmax,DoZpas,DoY,DoYmin,DoYmax,DoYpas,DoX,DoXmin,DoXmax,DoXpas)                                      \
                    Gbegin_albumQ(DoZ,DoZmin,DoZmax,DoZpas,Int,MAX2                                                                     \
                                 ,DoY,DoYmin,DoYmax,DoYpas,Int,MAX2                                                                     \
                                 ,DoX,DoXmin,DoXmax,DoXpas,Int,MAX2                                                                     \
                                  )
#define   end_albumQ(EDoZ,EDoY,EDoX)                                                                                                    \
                    Gend_albumQ(EDoZ,Int                                                                                                \
                               ,EDoY,Int                                                                                                \
                               ,EDoX,Int                                                                                                \
                                )

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        F O N C T I O N S   G E N E R A L E S   D ' H Y P E R - A L B U M  :                                                       */
/*                                                                                                                                   */
/*************************************************************************************************************************************/

                                        /* Definitions introduites le 20171219103002...                                              */

#define   Gbegin_hyper_albumQ(DoT,DoTmin,DoTmax,DoTpas,typeT,sTpas                                                                      \
                             ,DoZ,DoZmin,DoZmax,DoZpas,typeZ,sZpas                                                                      \
                             ,DoY,DoYmin,DoYmax,DoYpas,typeY,sYpas                                                                      \
                             ,DoX,DoXmin,DoXmax,DoXpas,typeX,sXpas                                                                      \
                              )                                                                                                         \
                    Gbegin_tempsQ(DoT,DoTmin,DoTmax,DoTpas,typeT,sTpas)                                                                 \
                         Bblock                                                                                                         \
                         Gbegin_fuiteQ(DoZ,DoZmin,DoZmax,DoZpas,typeZ,sZpas)                                                            \
                              Bblock                                                                                                    \
                              Gbegin_colonneQ(DoY,DoYmin,DoYmax,DoYpas,typeY,sYpas)                                                     \
                                   Bblock                                                                                               \
                                   Gbegin_ligneQ(DoX,DoXmin,DoXmax,DoXpas,typeX,sXpas)                                                  \
                                        Bblock
#define   Gend_hyper_albumQ(EDoT,typeT,EDoZ,typeZ,EDoY,typeY,EDoX,typeX)                                                                \
                                        Eblock                                                                                          \
                                   Gend_ligneQ(EDoX,typeX)                                                                              \
                                   Eblock                                                                                               \
                              Gend_colonneQ(EDoY,typeY)                                                                                 \
                              Eblock                                                                                                    \
                         Gend_fuiteQ(EDoZ,typeZ)                                                                                        \
                         Eblock                                                                                                         \
                    Gend_tempsQ(EDoT,typeT)

#define   begin_hyper_albumQ(DoT,DoTmin,DoTmax,DoTpas,DoZ,DoZmin,DoZmax,DoZpas,DoY,DoYmin,DoYmax,DoYpas,DoX,DoXmin,DoXmax,DoXpas)       \
                    Gbegin_hyper_albumQ(DoT,DoTmin,DoTmax,DoTpas,Int,MAX2                                                               \
                                       ,DoZ,DoZmin,DoZmax,DoZpas,Int,MAX2                                                               \
                                       ,DoY,DoYmin,DoYmax,DoYpas,Int,MAX2                                                               \
                                       ,DoX,DoXmin,DoXmax,DoXpas,Int,MAX2                                                               \
                                        )
#define   end_hyper_albumQ(EDoT,EDoZ,EDoY,EDoX)                                                                                         \
                    Gend_hyper_albumQ(EDoT,Int                                                                                          \
                                     ,EDoZ,Int                                                                                          \
                                     ,EDoY,Int                                                                                          \
                                     ,EDoX,Int                                                                                          \
                                      )

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        F O N C T I O N S   S P E C I F I Q U E S   D E   T E M P S   ( ' T ' )  :                                                 */
/*                                                                                                                                   */
/*************************************************************************************************************************************/

                                        /* Definitions introduites le 20171219103002...                                              */

#define   begin_temps                                                                                                                   \
                    begin_tempsQ(DoIn,Tmin,NEUT(Tmax),pasT)
#define   end_temps                                                                                                                     \
                    end_tempsQ(EDoI)

#define   begin_temps_back                                                                                                              \
                    begin_tempsQ(DoDe,Tmin,INTT(Tmax),pasT)                                                                             \
                                        /* ATTENTION, il est imperatif de partir de 'INTZ(Zmax)' afin que 'begin_temps'              */ \
                                        /* et 'begin_temps_back' atteignent les memes points lorsque 'pasZ' ne vaut pas 'PasZ'...    */
#define   end_temps_back                                                                                                                \
                    end_tempsQ(EDoD)

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        F O N C T I O N S   S P E C I F I Q U E S   D E   P R O F O N D E U R   ( ' Z ' )  :                                       */
/*                                                                                                                                   */
/*************************************************************************************************************************************/
#define   begin_fuite                                                                                                                   \
                    begin_fuiteQ(DoIn,Zmin,NEUT(Zmax),pasZ)
#define   end_fuite                                                                                                                     \
                    end_fuiteQ(EDoI)

#define   begin_fuite_back                                                                                                              \
                    begin_fuiteQ(DoDe,Zmin,INTZ(Zmax),pasZ)                                                                             \
                                        /* ATTENTION, il est imperatif de partir de 'INTZ(Zmax)' afin que 'begin_fuite'              */ \
                                        /* et 'begin_fuite_back' atteignent les memes points lorsque 'pasZ' ne vaut pas 'PasZ'...    */
#define   end_fuite_back                                                                                                                \
                    end_fuiteQ(EDoD)

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        F O N C T I O N S   S P E C I F I Q U E S   D E   C O L O N N E   ( ' Y ' )  :                                             */
/*                                                                                                                                   */
/*************************************************************************************************************************************/
#define   begin_colonne                                                                                                                 \
                         begin_colonneQ(DoIn,Ymin,NEUT(Ymax),pasY)
#define   end_colonne                                                                                                                   \
                         end_colonneQ(EDoI)

#define   begin_colonne_back                                                                                                            \
                         begin_colonneQ(DoDe,Ymin,INTY(Ymax),pasY)                                                                      \
                                        /* ATTENTION, il est imperatif de partir de 'INTY(Ymax)' afin que 'begin_colonne'            */ \
                                        /* et 'begin_colonne_back' atteignent les memes points lorsque 'pasY' ne vaut pas 'PasY'...  */ \
                                        /*                                                                                           */ \
                                        /* L'introduction de 'INTY(...)' a ete faite le 19961211000000 a cause de la fonction        */ \
                                        /* 'Iliste_image(...)' ('v $xiida/fonction$FON Iliste_image') utilisee par la commande       */ \
                                        /* '$xci/liste$K' qui, lorsqu'il y a '__VERSION__INDEXATION_SIMPLIFIEE_A_PRIORI' (ce qui est */ \
                                        /* le cas a cette date sur '$LACT27' et sur '$LACT28'), ne fonctionnait plus correctement ;  */ \
                                        /* en effet, les fonctions 'Icomplementation(...)' et 'Imove(...)' ('v $xci/liste$K')        */ \
                                        /* utilisent 'begin_colonne' alors que 'Iliste_image(...)' utilisaient 'begin_colonne_back'. */ \
                                        /* Si '__VERSION__INDEXATION_SIMPLIFIEE_A_PRIORI' les procedures 'INDEXATION_OX(...)' et     */ \
                                        /* 'INDEXATION_OY(...)' ('v $xiii/Images$DEF INDEXATION_O.') sont "simplistes" et ne         */ \
                                        /* ramenent par les coordonnees sur le maillage defini par {pasX,pasY} (ce qui est fait      */ \
                                        /* dans le cas contraire par 'Findice_X(...)' et 'Findice_Y(...)'). Ainsi, les fonctions     */ \
                                        /* 'Icomplementation(...)' et 'Imove(...)' d'une part, et 'Iliste_image(...)' d'autre part,  */ \
                                        /* n'accedaient pas aux memes points...                                                      */
#define   end_colonne_back                                                                                                              \
                         end_colonneQ(EDoD)

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        F O N C T I O N S   S P E C I F I Q U E S   D E   L I G N E   ( ' X ' )  :                                                 */
/*                                                                                                                                   */
/*************************************************************************************************************************************/
#define   begin_ligne                                                                                                                   \
                              begin_ligneQ(DoIn,Xmin,NEUT(Xmax),pasX)
#define   end_ligne                                                                                                                     \
                              end_ligneQ(EDoI)

                                        /* ATTENTION, il est imperatif que 'begin_ligne' utilise la fonction 'DoIn(...)', ce qui     */
                                        /* signifie que les coordonnees sont traitees de facon croissante (de 'Xmin' a 'Xmax'), car  */
                                        /* en effet, certains algorithmes utilisent ce fait ; c'est en particulier le cas de la      */
                                        /* fonction 'Istereogramme(...)' de '$xiii/tri_image$FON' lorsqu'a lieu le decalage de la    */
                                        /* texture du stereogramme...                                                                */

#define   begin_ligne_back                                                                                                              \
                              begin_ligneQ(DoDe,Xmin,INTX(Xmax),pasX)                                                                   \
                                        /* ATTENTION, il est imperatif de partir de 'INTX(Xmax)' afin que 'begin_ligne'              */ \
                                        /* et 'begin_ligne_back' atteignent les memes points lorsque 'pasX' ne vaut pas 'PasX'...    */
#define   end_ligne_back                                                                                                                \
                              end_ligneQ(EDoD)

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        F O N C T I O N S   S P E C I F I Q U E S   D ' I M A G E   ( ' Y '   P U I S   ' X ' )  :                                 */
/*                                                                                                                                   */
/*************************************************************************************************************************************/

                                        /* ATTENTION, il est imperatif que 'begin_image' utilise la fonction 'DoIn(...)', ce qui     */
                                        /* signifie que les coordonnees sont traitees de facon croissante (de 'Xmin' a 'Xmax' et     */
                                        /* de 'Ymin' a 'Ymax'), car en effet, certains algorithmes utilisent ce fait. Depuis le      */
                                        /* 19961004093218, c'est le cas de toutes les fonctions qui utilisent 'Pconvolution(...)'    */
                                        /* dans 'v $xiii/di_image$FON'...                                                            */

#define   Pbegin_image(Bprogression)                                                                                                    \
                         VERIFICATIONS_DE_CONFLITS_POSSIBLES_AVEC__INDEXATION_SIMPLIFIEE;                                               \
                                        /* Verification introduite le 20170713121225...                                              */ \
                         begin_colonne                                                                                                  \
                              Bblock                                                                                                    \
                              BLOC(Bprogression);                                                                                       \
                                                                                                                                        \
                              begin_ligne                                                                                               \
                                   Bblock
#define   Pend_image(Eprogression)                                                                                                      \
                                   Eblock                                                                                               \
                              end_ligne                                                                                                 \
                                                                                                                                        \
                              BLOC(Eprogression);                                                                                       \
                              Eblock                                                                                                    \
                         end_colonne
                                        /* Introduit sous cette forme le 20170520092906 afin de faire que l'edition de la            */
                                        /* progression des {begin,end} ne soit disponible que pour les cas exceptionnels             */
                                        /* (via "_AvecEditionProgression") ou cela est justifie (par exemple : convolution,...       */
                                        /* Voir a ce propos 'v $xiii/di_image$FON _AvecEditionProgression').                         */

#define   begin_image                                                                                                                   \
                    Pbegin_image(BLOC(VIDE;))
#define   end_image                                                                                                                     \
                    Pend_image(BLOC(VIDE;))

#define   begin_image_AvecEditionProgression                                                                                            \
                    Pbegin_image(BLOC(B_PROGRESSION_DES_BEGIN_END(Y,Ymin,dimY                                                           \
                                                                 ,UTILISER_LE_MODE_DIRECT_DE_PROGRESSION_DES_BEGIN_END                  \
                                                                 ,PTYPE_I                                                               \
                                                                  );                                                                    \
                                      )                                                                                                 \
                                 )
#define   end_image_AvecEditionProgression                                                                                              \
                    Pend_image(BLOC(E_PROGRESSION_DES_BEGIN_END;))

#define   Pbegin_image_back(Bprogression)                                                                                               \
                         VERIFICATIONS_DE_CONFLITS_POSSIBLES_AVEC__INDEXATION_SIMPLIFIEE;                                               \
                                        /* Verification introduite le 20170713121225...                                              */ \
                         begin_colonne_back                                                                                             \
                              Bblock                                                                                                    \
                              BLOC(Bprogression);                                                                                       \
                                                                                                                                        \
                              begin_ligne                                                                                               \
                                   Bblock
#define   Pend_image_back(Eprogression)                                                                                                 \
                                   Eblock                                                                                               \
                              end_ligne                                                                                                 \
                                                                                                                                        \
                              BLOC(Eprogression);                                                                                       \
                              Eblock                                                                                                    \
                         end_colonne_back
                                        /* Introduit sous cette forme le 20170520092906 afin de faire que l'edition de la            */
                                        /* progression des {begin,end} ne soit disponible que pour les cas exceptionnels             */
                                        /* (via "_AvecEditionProgression") ou cela est justifie (par exemple : ombrage,              */
                                        /* accumulation,... Voir a ce propos 'v $xiii/di_album$FON _AvecEditionProgression').        */

#define   begin_image_back                                                                                                              \
                    Pbegin_image_back(BLOC(VIDE;))
#define   end_image_back                                                                                                                \
                    Pend_image_back(BLOC(VIDE;))

#define   begin_image_back_AvecEditionProgression                                                                                       \
                    Pbegin_image_back(BLOC(B_PROGRESSION_DES_BEGIN_END(Y,Ymin,dimY                                                      \
                                                                      ,UTILISER_LE_MODE_BACK___DE_PROGRESSION_DES_BEGIN_END             \
                                                                      ,PTYPE_I                                                          \
                                                                       );                                                               \
                                           )                                                                                            \
                                      )
#define   end_image_back_AvecEditionProgression                                                                                         \
                         Pend_image_back(BLOC(E_PROGRESSION_DES_BEGIN_END;))

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        " T R A I T E M E N T "   D ' U N E   I M A G E  :                                                                         */
/*                                                                                                                                   */
/*************************************************************************************************************************************/
#define   Ptraite_image(Bprogression,Eprogression,sequence_de_traitement,Begin_colonne,End_colonne,Begin_ligne,End_ligne)               \
                    VERIFICATIONS_DE_CONFLITS_POSSIBLES_AVEC__INDEXATION_SIMPLIFIEE;                                                    \
                                        /* Verification introduite le 20170713121225...                                              */ \
                    Begin_colonne                                                                                                       \
                         Bblock                                                                                                         \
                         BLOC(Bprogression);                                                                                            \
                                                                                                                                        \
                         Begin_ligne                                                                                                    \
                              Bblock                                                                                                    \
                              Test(TEST_MASQUE_ACTIF(X,Y,MASQUER_PARCOURS))                                                             \
                                   Bblock                                                                                               \
                                   sequence_de_traitement;                                                                              \
                                   Eblock                                                                                               \
                              ATes                                                                                                      \
                                   Bblock                                                                                               \
                                   Eblock                                                                                               \
                              ETes                                                                                                      \
                              Eblock                                                                                                    \
                         End_ligne                                                                                                      \
                                                                                                                                        \
                         BLOC(Eprogression);                                                                                            \
                         Eblock                                                                                                         \
                    End_colonne                                                                                                         \
                                        /* Introduits le 20170521081127...                                                           */

#define   traite_image(mode,sequence_de_traitement,Begin_colonne,End_colonne,Begin_ligne,End_ligne)                                     \
                    Ptraite_image(BLOC(VIDE;)                                                                                           \
                                 ,BLOC(VIDE;)                                                                                           \
                                 ,sequence_de_traitement                                                                                \
                                 ,Begin_colonne,End_colonne                                                                             \
                                 ,Begin_ligne,End_ligne                                                                                 \
                                  )

#define   traite_image_AvecEditionProgression(mode,sequence_de_traitement,Begin_colonne,End_colonne,Begin_ligne,End_ligne)              \
                    Ptraite_image(BLOC(B_PROGRESSION_DES_BEGIN_END(Y,Ymin,dimY                                                          \
                                                                  ,mode                                                                 \
                                                                  ,PTYPE_I                                                              \
                                                                   );                                                                   \
                                       )                                                                                                \
                                 ,BLOC(E_PROGRESSION_DES_BEGIN_END;)                                                                    \
                                 ,sequence_de_traitement                                                                                \
                                 ,Begin_colonne,End_colonne                                                                             \
                                 ,Begin_ligne,End_ligne                                                                                 \
                                  )

#define   traite_image_BH_GD(sequence_de_traitement)                                                                                    \
                    traite_image(ARGUMENT_INUTILE                                                                                       \
                                ,BLOC(sequence_de_traitement)                                                                           \
                                ,begin_colonne,end_colonne                                                                              \
                                ,begin_ligne,end_ligne                                                                                  \
                                 )
#define   traite_image_BH_GD_AvecEditionProgression(sequence_de_traitement)                                                             \
                    traite_image_AvecEditionProgression(UTILISER_LE_MODE_DIRECT_DE_PROGRESSION_DES_BEGIN_END                            \
                                                       ,BLOC(sequence_de_traitement)                                                    \
                                                       ,begin_colonne,end_colonne                                                       \
                                                       ,begin_ligne,end_ligne                                                           \
                                                        )
                                        /* Traitement normal :                                                                       */
                                        /*                                                                                           */
                                        /*                  de Bas (Y=Ymin) en Haut (Y=Ymax),                                        */
                                        /*                                                                                           */
                                        /* et :                                                                                      */
                                        /*                                                                                           */
                                        /*                  de Gauche (X=Xmin) a Droite (X=Xmax).                                    */
                                        /*                                                                                           */
#define   traite_image_HB_GD(sequence_de_traitement)                                                                                    \
                    traite_image(ARGUMENT_INUTILE                                                                                       \
                                ,BLOC(sequence_de_traitement)                                                                           \
                                ,begin_colonne_back,end_colonne_back                                                                    \
                                ,begin_ligne,end_ligne                                                                                  \
                                 )
#define   traite_image_HB_GD_AvecEditionProgression(sequence_de_traitement)                                                             \
                    traite_image_AvecEditionProgression(UTILISER_LE_MODE_BACK___DE_PROGRESSION_DES_BEGIN_END                            \
                                                       ,BLOC(sequence_de_traitement)                                                    \
                                                       ,begin_colonne_back,end_colonne_back                                             \
                                                       ,begin_ligne,end_ligne                                                           \
                                                        )
                                        /* Traitement inverse :                                                                      */
                                        /*                                                                                           */
                                        /*                  de Haut (Y=Ymax) en Bas (Y=Ymin),                                        */
                                        /*                                                                                           */
                                        /* et :                                                                                      */
                                        /*                                                                                           */
                                        /*                  de Gauche (X=Xmin) a Droite (X=Xmax).                                    */
                                        /*                                                                                           */
#define   traite_image_BH_DG(sequence_de_traitement)                                                                                    \
                    traite_image(ARGUMENT_INUTILE                                                                                       \
                                ,BLOC(sequence_de_traitement)                                                                           \
                                ,begin_colonne,end_colonne                                                                              \
                                ,begin_ligne_back,end_ligne_back                                                                        \
                                 )
#define   traite_image_BH_DG_AvecEditionProgression(sequence_de_traitement)                                                             \
                    traite_image_AvecEditionProgression(UTILISER_LE_MODE_DIRECT_DE_PROGRESSION_DES_BEGIN_END                            \
                                                       ,BLOC(sequence_de_traitement)                                                    \
                                                       ,begin_colonne,end_colonne                                                       \
                                                       ,begin_ligne_back,end_ligne_back                                                 \
                                                        )
                                        /* Traitement inverse :                                                                      */
                                        /*                                                                                           */
                                        /*                  de Bas (Y=Ymin) en Haut (Y=Ymax),                                        */
                                        /*                                                                                           */
                                        /* et :                                                                                      */
                                        /*                                                                                           */
                                        /*                  de Droite (X=Xmax) a Gauche (X=Xmin).                                    */
                                        /*                                                                                           */
#define   traite_image_HB_DG(sequence_de_traitement)                                                                                    \
                    traite_image(ARGUMENT_INUTILE                                                                                       \
                                ,BLOC(sequence_de_traitement)                                                                           \
                                ,begin_colonne_back,end_colonne_back                                                                    \
                                ,begin_ligne_back,end_ligne_back                                                                        \
                                 )
#define   traite_image_HB_DG_AvecEditionProgression(sequence_de_traitement)                                                             \
                    traite_image_AvecEditionProgression(UTILISER_LE_MODE_BACK___DE_PROGRESSION_DES_BEGIN_END                            \
                                                       ,BLOC(sequence_de_traitement)                                                    \
                                                       ,begin_colonne_back,end_colonne_back                                             \
                                                       ,begin_ligne_back,end_ligne_back                                                 \
                                                        )
                                        /* Traitement inverse :                                                                      */
                                        /*                                                                                           */
                                        /*                  de Haut (Y=Ymax) en Bas (Y=Ymin),                                        */
                                        /*                                                                                           */
                                        /* et :                                                                                      */
                                        /*                                                                                           */
                                        /*                  de Droite (X=Xmax) a Gauche (X=Xmin).                                    */
                                        /*                                                                                           */

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        F O N C T I O N S   S P E C I F I Q U E S   D ' A L B U M   ( ' Z '   P U I S   ' Y '   P U I S   ' X ' )  :               */
/*                                                                                                                                   */
/*************************************************************************************************************************************/
#define   Pbegin_album(Bprogression)                                                                                                    \
                    VERIFICATIONS_DE_CONFLITS_POSSIBLES_AVEC__INDEXATION_SIMPLIFIEE;                                                    \
                                        /* Verification introduite le 20170713121225...                                              */ \
                    begin_fuite                                                                                                         \
                         Bblock                                                                                                         \
                         BLOC(Bprogression);                                                                                            \
                                                                                                                                        \
                         begin_colonne                                                                                                  \
                              Bblock                                                                                                    \
                              begin_ligne                                                                                               \
                                   Bblock
#define   Pend_album(Eprogression)                                                                                                      \
                                   Eblock                                                                                               \
                              end_ligne                                                                                                 \
                              Eblock                                                                                                    \
                         end_colonne                                                                                                    \
                                                                                                                                        \
                         BLOC(Eprogression);                                                                                            \
                         Eblock                                                                                                         \
                    end_fuite
                                        /* Introduit sous cette forme le 20170520092906 afin de faire que l'edition de la            */
                                        /* progression des {begin,end} ne soit disponible que pour les cas exceptionnels             */
                                        /* (via "_AvecEditionProgression") ou cela est justifie (ombrage, accumulation,...).         */

#define   begin_album                                                                                                                   \
                    Pbegin_album(BLOC(VIDE;))
#define   end_album                                                                                                                     \
                    Pend_album(BLOC(VIDE;))

#define   begin_album_AvecEditionProgression                                                                                            \
                    Pbegin_album(BLOC(B_PROGRESSION_DES_BEGIN_END(Z,Zmin,dimZ                                                           \
                                                                 ,UTILISER_LE_MODE_DIRECT_DE_PROGRESSION_DES_BEGIN_END                  \
                                                                 ,PTYPE_A                                                               \
                                                                  );                                                                    \
                                      )                                                                                                 \
                                 )
#define   end_album_AvecEditionProgression                                                                                              \
                    Pend_album(BLOC(E_PROGRESSION_DES_BEGIN_END;))

#define   Pbegin_album_back(Bprogression)                                                                                               \
                    VERIFICATIONS_DE_CONFLITS_POSSIBLES_AVEC__INDEXATION_SIMPLIFIEE;                                                    \
                                        /* Verification introduite le 20170713121225...                                              */ \
                    begin_fuite_back                                                                                                    \
                         Bblock                                                                                                         \
                         BLOC(Bprogression);                                                                                            \
                                                                                                                                        \
                         begin_colonne                                                                                                  \
                              Bblock                                                                                                    \
                              begin_ligne                                                                                               \
                                   Bblock
#define   Pend_album_back(Eprogression)                                                                                                 \
                                   Eblock                                                                                               \
                              end_ligne                                                                                                 \
                              Eblock                                                                                                    \
                         end_colonne                                                                                                    \
                                                                                                                                        \
                         BLOC(Eprogression);                                                                                            \
                         Eblock                                                                                                         \
                    end_fuite_back
                                        /* Introduit sous cette forme le 20170520092906 afin de faire que l'edition de la            */
                                        /* progression des {begin,end} ne soit disponible que pour les cas exceptionnels             */
                                        /* (via "_AvecEditionProgression") ou cela est justifie (ombrage, accumulation,...).         */

#define   begin_album_back                                                                                                              \
                    Pbegin_album_back(BLOC(VIDE;))
#define   end_album_back                                                                                                                \
                    Pend_album_back(BLOC(VIDE;))

#define   begin_album_back_AvecEditionProgression                                                                                       \
                    Pbegin_album_back(BLOC(B_PROGRESSION_DES_BEGIN_END(Z,Zmin,dimZ                                                      \
                                                                      ,UTILISER_LE_MODE_BACK___DE_PROGRESSION_DES_BEGIN_END             \
                                                                      ,PTYPE_A                                                          \
                                                                       );                                                               \
                                           )                                                                                            \
                                      )
#define   end_album_back_AvecEditionProgression                                                                                         \
                    Pend_album_back(BLOC(E_PROGRESSION_DES_BEGIN_END;))

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        F O N C T I O N S   D E   P A R C O U R S   D ' U N   E N S E M B L E   D E   N I V E A U X   D E   C O U L E U R S  :     */
/*                                                                                                                                   */
/*************************************************************************************************************************************/
#define   BoID(fonction_de_parcours,niveau_courant,niveau_minimal,niveau_maximal,pas_du_niveau)                                         \
                    Bblock                                                                                                              \
                    DEFV(Int,INIT(niveau_courant,UNDEF));                                                                               \
                                        /* Niveau courant ; mais attention, celui-ci doit imperativement etre un                     */ \
                                        /* 'Int' afin de ne pas poser de probleme pour la detection des fins de boucle               */ \
                                        /* avec les troncations qui sont faites par le compilateur sur le mode 'Char'/'CHAR' avant   */ \
                                        /* d'effectuer les tests de fin (ainsi, par exemple, 255+1=256 devient 0 apres troncation    */ \
                                        /* par un modulo 256)...                                                                     */ \
                    fonction_de_parcours(niveau_courant,INTE(niveau_minimal),INTE(niveau_maximal),INTE(pas_du_niveau))                  \
                                        /* Parcours quelconque d'un ensemble de niveaux de couleurs.                                 */
#define   EBID(fin_de_fonction_de_parcours)                                                                                             \
                    fin_de_fonction_de_parcours                                                                                         \
                    Eblock                                                                                                              \
                                        /* Fin de parcours quelconque d'un ensemble de niveaux de couleurs.                          */

#define   BoIn(niveau_courant,niveau_minimal,niveau_maximal,pas_du_niveau)                                                              \
                    BoID(DoIn,niveau_courant,niveau_minimal,niveau_maximal,pas_du_niveau)                                               \
                                        /* Parcours ascendant d'un ensemble de niveaux de couleurs.                                  */
#define   EBoI                                                                                                                          \
                    EBID(EDoI)                                                                                                          \
                                        /* Fin de parcours ascendant d'un ensemble de niveaux de couleurs.                           */

#define   BoDe(niveau_courant,niveau_minimal,niveau_maximal,pas_du_niveau)                                                              \
                    BoID(DoDe,niveau_courant,niveau_minimal,niveau_maximal,pas_du_niveau)                                               \
                                        /* Parcours descendant d'un ensemble de niveaux de couleurs.                                 */
#define   EBoD                                                                                                                          \
                    EBID(EDoD)                                                                                                          \
                                        /* Fin de parcours descendant d'un ensemble de niveaux de couleurs.                          */

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        P A R C O U R S   E N   S P I R A L E   D ' U N E   I M A G E  :                                                           */
/*                                                                                                                                   */
/*                                                                                                                                   */
/*        Nota :                                                                                                                     */
/*                                                                                                                                   */
/*                    En general, on fera a la suite                                                                                 */
/*                  l'un de l'autre pour chaque point                                                                                */
/*                  {x,y} de la spirale :                                                                                            */
/*                                                                                                                                   */
/*                  SPIRALE_INITIALISATION;                 qui (re-)initialise eventuellement le bras courant,                      */
/*                  SPIRALE_DEPLACEMENT(x,y);               qui deplace le point courant {x,y} sur la spirale,                       */
/*                  SPIRALE_PARCOURS;                       qui gere les changements d'orientation du bras de la spirale,            */
/*                                                                                                                                   */
/*                  ou en une seule fois ;                                                                                           */
/*                                                                                                                                   */
/*                  SPIRALE_DEPLACEMENT_ET_PARCOURS(x,y,s); qui deplace le point courant {x,y} sur la spirale et gere les            */
/*                                                          changements d'orientation du bras de la spirale avec de plus la          */
/*                                                          possibilite de sauter 's' points.                                        */
/*                                                                                                                                   */
/*                                                                                                                                   */
/*        Parcours :                                                                                                                 */
/*                                                                                                                                   */
/*                    En notant '0' le numero du premier                                                                             */
/*                  point de la spirale (ou "centre"), le                                                                            */
/*                  parcours de celle-ci se fait de la                                                                               */
/*                  facon suivante :                                                                                                 */
/*                                                                                                                                   */
/*                                                                                                                                   */
/*                                      4 -- 3 -- 2                                                                                  */
/*                                      |         |    .                                                                             */
/*                                      |         |    .                                                                             */
/*                                      5    0 -- 1    .                                                                             */
/*                                      |              |                                                                             */
/*                                      |              |                                                                             */
/*                                      6 -- 7 -- 8 -- 9                                                                             */
/*                                                                                                                                   */
/*                                                                                                                                   */
/*        ATTENTION :                                                                                                                */
/*                                                                                                                                   */
/*                    Lorsqu'une telle spirale est utilisee                                                                          */
/*                  pour generer des nombres aleatoires (ainsi                                                                       */
/*                  que cela est fait dans '$xrq/nucleon.LB$I'                                                                       */
/*                  par exemple) suivant le choix du centre de                                                                       */
/*                  la spirale, le generateur sera independant                                                                       */
/*                  du format de l'images (cas, par exemple, du                                                                      */
/*                  choix du point [Xmin,Ymin,Zmin] comme centre                                                                     */
/*                  de la spirale), ou pas (cas, par exemple, du                                                                     */
/*                  choix du point [Xcentre,Ycentre,Zcentre] car                                                                     */
/*                  en effet ces coordonnees varient avec le                                                                         */
/*                  format de l'image contrairement au point                                                                         */
/*                  origine [Xmin,Ymin,Zmin]...).                                                                                    */
/*                                                                                                                                   */
/*                                                                                                                                   */
/*************************************************************************************************************************************/
#define   FACTEUR_DE_SPIRALE_DELTA_HORIZONTAL                                                                                           \
                    UN                                                                                                                  \
                                        /* Facteur du pas de parcours horizontal initial d'une spirale,                              */
#define   FACTEUR_DE_SPIRALE_DELTA_VERTICAL                                                                                             \
                    ZERO                                                                                                                \
                                        /* Facteur du pas de parcours vertical initial d'une spirale.                                */

#define   SPIRALE_DELTA_HORIZONTAL_GENERAL(pas_X,pas_Y)                                                                                 \
                    SE12(pas_X,pas_Y)                                                                                                   \
                                        /* Pas de parcours horizontal initial d'une spirale,                                         */
#define   SPIRALE_DELTA_HORIZONTAL_GLOBAL                                                                                               \
                    MUL2(FACTEUR_DE_SPIRALE_DELTA_HORIZONTAL,SPIRALE_DELTA_HORIZONTAL_GENERAL(PasX,PasY))                               \
                                        /* Pas de parcours horizontal initial d'une spirale a utiliser dans le cas ennuyeux          */ \
                                        /* ou 'SPIRALE_DEFINITION' ou 'SPIRALE_DEFINITION_GENERALE(...)' seraient a utiliser         */ \
                                        /* au niveau des variables globales ; le compilateur refuse d'initialiser une variable       */ \
                                        /* globale ('spirale_delta_horizontal') avec une autre variable globale 'pasX')...           */

#define   SPIRALE_DELTA_VERTICAL_GENERAL(pas_X,pas_Y)                                                                                   \
                    SE22(pas_X,pas_Y)                                                                                                   \
                                        /* Pas de parcours vertical initial d'une spirale,                                           */
#define   SPIRALE_DELTA_VERTICAL_GLOBAL                                                                                                 \
                    MUL2(FACTEUR_DE_SPIRALE_DELTA_VERTICAL,SPIRALE_DELTA_VERTICAL_GENERAL(PasX,PasY))                                   \
                                        /* Pas de parcours vertical initial d'une spirale a utiliser dans le cas ennuyeux            */ \
                                        /* ou 'SPIRALE_DEFINITION' ou 'SPIRALE_DEFINITION_GENERALE(...)' seraient a utiliser         */ \
                                        /* au niveau des variables globales ; le compilateur refuse d'initialiser une variable       */ \
                                        /* globale ('spirale_delta_vertical') avec une autre variable globale 'pasX')...             */

#define   SPIRALE_DELTA_HORIZONTAL                                                                                                      \
                    MUL2(SPIRALE_DEFINITION_____facteur_delta_horizontal,SPIRALE_DELTA_HORIZONTAL_GENERAL(pasX,pasY))                   \
                                        /* Pas de parcours horizontal initial d'une spirale,                                         */
#define   SPIRALE_DELTA_VERTICAL                                                                                                        \
                    MUL2(SPIRALE_DEFINITION_____facteur_delta_vertical,SPIRALE_DELTA_VERTICAL_GENERAL(pasX,pasY))                       \
                                        /* Pas de parcours vertical initial d'une spirale.                                           */

#define   NOMBRE_DE_POINTS_SAUTES_SUR_LA_SPIRALE                                                                                        \
                    ZERO                                                                                                                \
                                        /* Cette constante definie le nombre de points que l'on saute lorsque l'on passe d'un point  */ \
                                        /* de la spirale au suivant. La valeur initiale fait que tous les points sont pris en compte */ \
                                        /* et traites...                                                                             */

#define   PAS_DES_POINTS_SUR_LA_SPIRALE(Vnombre_de_points_sautes)                                                                       \
                    SUCC(Vnombre_de_points_sautes)                                                                                      \
                                        /* Pas des points sur la spirale (en general 1...).                                          */
#define   SPIRALE_PREMIER_BRAS                                                                                                          \
                    UNITE                                                                                                               \
                                        /* Longueur du premier bras.                                                                 */

#define   SPIRALE_BRAS_INITIALISATION                                                                                                   \
                    PRED(SPIRALE_PREMIER_BRAS)                                                                                          \
                                        /* Pour forcer l'initialisation du nombre de points sur un bras.                             */

#define   SPIRALE_DEFINITION                                                                                                            \
                    SPIRALE_DEFINITION_GENERALE(SPIRALE_DELTA_HORIZONTAL,SPIRALE_DELTA_VERTICAL)                                        \
                                        /* Initialisation standard des spirales. On notera avec attention l'absence de point-virgule */ \
                                        /* ";" apres 'SPIRALE_DEFINITION_GENERALE(...)' car, en effet, il s'agit la de donnees, et   */ \
                                        /* le risque serait alors de se retrouver avec plusieurs ";" contigus, ce qui est interdit   */ \
                                        /* par les compilateurs a l'interieur d'une zone de donnees (ceci se produirait si d'autres  */ \
                                        /* declarations de donnees suivaient par exemple 'SPIRALE_DEFINITION').                      */
#define   SPIRALE_DEFINITION_GENERALE(delta_horizontal,delta_vertical)                                                                  \
                                        /* Initialisation plus generale des spirales...                                              */ \
                    DEFV(Int,INIT(spirale_delta_horizontal,delta_horizontal));                                                          \
                                        /* Pas horizontal de parcours de la spirale ; on va partir vers la droite,                   */ \
                    DEFV(Int,INIT(spirale_delta_vertical,delta_vertical));                                                              \
                                        /* Pas vertical de parcours de la spirale ; on va partir horizontalement.                    */ \
                    DEFV(Int,INIT(spirale_longueur_du_bras_courant,SPIRALE_PREMIER_BRAS));                                              \
                                        /* Initialisation de la longueur du bras courant ; le premier bras                           */ \
                                        /* a une longueur unite.                                                                     */ \
                    DEFV(Int,INIT(spirale_nombre_de_points_a_traiter,SPIRALE_BRAS_INITIALISATION));                                     \
                                        /* Nombre de points restant a traiter sur le bras courant ; on donne                         */ \
                                        /* au nombre de points traites sur un bras une valeur forcant son                            */ \
                                        /* initialisation...                                                                         */ \
                    DEFV(Int,INIT(nombre_de_points_sur_la_spirale,ZERO));                                                               \
                                        /* Donne le nombre courant de points traites sur une spirale autour du                       */ \
                                        /* point courant ; on l'initialise avec 'ZERO' au cas ou il serait utilise                   */ \
                                        /* tel quel...                                                                               */

#define   SPIRALE_VALIDATION                                                                                                            \
                    Bblock                                                                                                              \
                    Test(IFNE(pasX,pasY))                                                                                               \
                         Bblock                                                                                                         \
                         PRINT_ERREUR("'pasX' et 'pasY' doivent etre egaux afin de parcourir correctement une spirale carree");         \
                         Eblock                                                                                                         \
                    ATes                                                                                                                \
                         Bblock                                                                                                         \
                         Eblock                                                                                                         \
                    ETes                                                                                                                \
                                                                                                                                        \
                                        /* ATTENTION : on ne peut mettre la sequence suivante :                                      */ \
                                        /*                                                                                           */ \
                                        /*        Test(IZEQ(PAS_DES_POINTS_SUR_LA_SPIRALE(Vnombre_de_points_sautes)))                */ \
                                        /*             Bblock                                                                        */ \
                                        /*             PRINT_ERREUR("le deplacement sur la spirale est impossible");                 */ \
                                        /*             EGAL(Vnombre_de_points_sautes,NOMBRE_DE_POINTS_SAUTES_SUR_LA_SPIRALE);        */ \
                                        /*             Eblock                                                                        */ \
                                        /*        ATes                                                                               */ \
                                        /*             Bblock                                                                        */ \
                                        /*             Eblock                                                                        */ \
                                        /*        ETes                                                                               */ \
                                        /*                                                                                           */ \
                                        /* d'une part parce qu'elle ne sert a rien (voir le 'Positive' qui sert a definir les        */ \
                                        /* variables du type 'Vnombre_de_points_sautes'), et d'autre part pour simplifier les        */ \
                                        /* choses, car toutes les spirales n'utilisent pas cette possibilite...                      */ \
                    Eblock

#define   SPIRALE_INITIALISATION_DU_NOMBRE_DE_POINTS_A_SAUTER(Vnombre_de_points_sautes,Inombre_de_points_a_sauter)                      \
                    Bblock                                                                                                              \
                    EGAL(Vnombre_de_points_sautes,Inombre_de_points_a_sauter);                                                          \
                    Eblock                                                                                                              \
                                        /* Initialisation du nombre de points a sauter sur la spirale.                               */

#define   SPIRALE_REINITIALISATION_BRAS                                                                                                 \
                    Bblock                                                                                                              \
                    EGAL(spirale_longueur_du_bras_courant,SPIRALE_PREMIER_BRAS);                                                        \
                                        /* Initialisation de la longueur du bras courant ; le premier bras                           */ \
                                        /* a une longueur unite.                                                                     */ \
                    EGAL(spirale_nombre_de_points_a_traiter,SPIRALE_BRAS_INITIALISATION);                                               \
                                        /* Et du nombre de points restant a traiter sur le bras courant ; on donne                   */ \
                                        /* au nombre de points traites sur un bras une valeur forcant son                            */ \
                                        /* initialisation...                                                                         */ \
                    Eblock
#define   SPIRALE_REINITIALISATION_DELTAS                                                                                               \
                    Bblock                                                                                                              \
                    EGAL(spirale_delta_horizontal,SPIRALE_DELTA_HORIZONTAL);                                                            \
                                        /* Pas horizontal de parcours de la spirale ; on va partir vers la droite,                   */ \
                    EGAL(spirale_delta_vertical,SPIRALE_DELTA_VERTICAL);                                                                \
                                        /* Pas vertical de parcours de la spirale ; on va partir horizontalement.                    */ \
                    Eblock
#define   SPIRALE_REINITIALISATION_BRAS_ET_DELTAS                                                                                       \
                    Bblock                                                                                                              \
                    SPIRALE_REINITIALISATION_BRAS;                                                                                      \
                                        /* Reinitialisation de la longueur du bras de la spirale.                                    */ \
                    SPIRALE_REINITIALISATION_DELTAS;                                                                                    \
                                        /* Reinitialisation des pas horizontal et vertical de parcours de la spirale.                */ \
                    Eblock

#define   SPIRALE_INITIALISATION                                                                                                        \
                    Bblock                                                                                                              \
                    Test(IFEQ(spirale_nombre_de_points_a_traiter,SPIRALE_BRAS_INITIALISATION))                                          \
                         Bblock                                                                                                         \
                         EGAL(spirale_nombre_de_points_a_traiter,spirale_longueur_du_bras_courant);                                     \
                                        /* Le nombre de points a traiter sur le bras courant, est egal au                            */ \
                                        /* nombre de points de ce bras.                                                              */ \
                         Eblock                                                                                                         \
                    ATes                                                                                                                \
                         Bblock                                                                                                         \
                         Eblock                                                                                                         \
                    ETes                                                                                                                \
                    Eblock

#define   SPIRALE_REINITIALISATION_COMPTAGE                                                                                             \
                    Bblock                                                                                                              \
                    CLIR(nombre_de_points_sur_la_spirale);                                                                              \
                                        /* Afin de compter les nombres de points de la spirale que l'on traite...                    */ \
                    Eblock

#define   SPIRALE_DEPLACEMENT(X_point_spirale,Y_point_spirale)                                                                          \
                    Bblock                                                                                                              \
                    INCR(X_point_spirale,MUL2(SPIRALE_DEPLACEMENT_____amplitude_horizontale,spirale_delta_horizontal));                 \
                    INCR(Y_point_spirale,MUL2(SPIRALE_DEPLACEMENT_____amplitude_verticale__,spirale_delta_vertical));                   \
                                        /* Et on deplace le point courant sur le bras courant.                                       */ \
                                        /*                                                                                           */ \
                                        /* La possibilite de "dilater" la spirale a ete introduite le 20151109145531...              */ \
                    Eblock
#define   SPIRALE_PARCOURS                                                                                                              \
                    Bblock                                                                                                              \
                    DECR(spirale_nombre_de_points_a_traiter,I);                                                                         \
                                        /* Et on decompte les points traites sur le bras courant...                                  */ \
                    Test(IFEQ(spirale_nombre_de_points_a_traiter,SPIRALE_BRAS_INITIALISATION))                                          \
                         Bblock                                                                                                         \
                         Test(IFEQ(spirale_delta_horizontal,SPIRALE_DELTA_VERTICAL))                                                    \
                              Bblock                                                                                                    \
                              INCR(spirale_longueur_du_bras_courant,I);                                                                 \
                                        /* Un bras sur deux, on augmente la longueur de ceux-ci.                                     */ \
                              Eblock                                                                                                    \
                         ATes                                                                                                           \
                              Bblock                                                                                                    \
                              Eblock                                                                                                    \
                         ETes                                                                                                           \
                                                                                                                                        \
                         SWAP(spirale_delta_horizontal,spirale_delta_vertical);                                                         \
                                                                                                                                        \
                         EGAL(spirale_delta_horizontal                                                                                  \
                             ,NEGA(MUL2(SPIRALE_PARCOURS_____sinus_de_l_angle_de_la_rotation,spirale_delta_horizontal))                 \
                              );                                                                                                        \
                         EGAL(spirale_delta_vertical                                                                                    \
                             ,NEUT(MUL2(SPIRALE_PARCOURS_____sinus_de_l_angle_de_la_rotation,spirale_delta_vertical))                   \
                              );                                                                                                        \
                                        /* On fait tourner le bras courant, ce qui revient a faire tourner de +/-(PI/2)              */ \
                                        /* le nombre complexe (spirale_delta_horizontal,spirale_delta_vertical).                     */ \
                         Eblock                                                                                                         \
                    ATes                                                                                                                \
                         Bblock                                                                                                         \
                         Eblock                                                                                                         \
                    ETes                                                                                                                \
                    Eblock
#define   SPIRALE_DEPLACEMENT_ET_PARCOURS(X_point_spirale,Y_point_spirale,Vnombre_de_points_sautes)                                     \
                    Bblock                                                                                                              \
                    Repe(PAS_DES_POINTS_SUR_LA_SPIRALE(Vnombre_de_points_sautes))                                                       \
                                        /* Le nombre de deplacements a faire est egal au nombre de points a sauter plus un (le point */ \
                                        /* d'arrivee...).                                                                            */ \
                         Bblock                                                                                                         \
                         SPIRALE_INITIALISATION;                                                                                        \
                         SPIRALE_DEPLACEMENT(X_point_spirale,Y_point_spirale);                                                          \
                         SPIRALE_PARCOURS;                                                                                              \
                         Eblock                                                                                                         \
                    ERep                                                                                                                \
                    Eblock

#define   SPIRALE_COMPTAGE                                                                                                              \
                    Bblock                                                                                                              \
                    INCR(nombre_de_points_sur_la_spirale,I);                                                                            \
                                        /* Et on calcule le nombre de points que l'on a traite.                                      */ \
                    Eblock

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        C O N V E R S I O N   D ' U N   I N D E X   D E   S P I R A L E                                                            */
/*        E N   D E S   C O O R D O N N E S   ' X '   E T   ' Y '  :                                                                 */
/*                                                                                                                                   */
/*                                                                                                                                   */
/*        Principe :                                                                                                                 */
/*                                                                                                                                   */
/*                                                                                                                                   */
/*                         diagonale                                                                                                 */
/*                            des                                                                                                    */
/*                    carres des nombres                                                                                             */
/*                           pairs                                                                                                   */
/*                                                                                                                                   */
/*                              *                                                                                                    */
/*                                *                                                                                                  */
/*                                 4 -- 3 -- 2                                                                                       */
/*                                 | *       |    .                                                                                  */
/*                                 |   *     |    .                                                                                  */
/*                                 5    0 -- 1    .                                                                                  */
/*                                 |           *  |                                                                                  */
/*                                 |             *|                                                                                  */
/*                                 6 -- 7 -- 8 -- 9                                                                                  */
/*                                                  *                                                                                */
/*                                                    *                                                                              */
/*                                                                                                                                   */
/*                                                 diagonale                                                                         */
/*                                                    des                                                                            */
/*                                            carres des nombres                                                                     */
/*                                                  impairs                                                                          */
/*                                                                                                                                   */
/*                                                                                                                                   */
/*                    La parite de la partie entiere du numero                                                                       */
/*                  courant permet de savoir si l'on se situe                                                                        */
/*                  dans le triangle inferieur (nombre pair) ou                                                                      */
/*                  dans le triangle superieur (nombre impair).                                                                      */
/*                                                                                                                                   */
/*                                                                                                                                   */
/*************************************************************************************************************************************/
#define   SPIRALE_INDEX_RELATIF(index,saut)                                                                                             \
                    MUL2(PAS_DES_POINTS_SUR_LA_SPIRALE(saut),SOUS(index,PREMIER_POINT))                                                 \
                                        /* Calcul de l'index relatif au numero du premier point ; c'est lui qui sera appele 'n' par  */ \
                                        /* la suite...                                                                               */
#define   SPIRALE_RACINE_CARREE_ENTIERE(index,saut)                                                                                     \
                    INTE(RACX(FLOT(SPIRALE_INDEX_RELATIF(index,saut))))                                                                 \
                                        /* Calcul de la racine carree "entiere" 'nr' de l'index 'n' de la spirale :                  */ \
                                        /*                                                                                           */ \
                                        /*                            __                                                             */ \
                                        /*                           /                                                               */ \
                                        /*                  nr = E(\/ n )                                                            */ \
                                        /*                                                                                           */ \
                                        /*  Exemple :                                                                                */ \
                                        /*                                                                                           */ \
                                        /*                  nr(3) = 1                                                                */ \
                                        /*                  nr(8) = 2                                                                */ \
                                        /*                                                                                           */
#define   SPIRALE_CARRE_INFERIEUR(index,saut)                                                                                           \
                    EXP2(SPIRALE_RACINE_CARREE_ENTIERE(index,saut))                                                                     \
                                        /* Calcul du carre ("entier") 'nr2' immediatement inferieur a l'index 'n' de la spirale :    */ \
                                        /*                                                                                           */ \
                                        /*                          2                                                                */ \
                                        /*                  nr2 = nr                                                                 */ \
                                        /*                                                                                           */
#define   SPIRALE_CARACTERISATION_DU_BRAS_COURANT(index,saut)                                                                           \
                    MOIT(DOUP(SPIRALE_RACINE_CARREE_ENTIERE(index,saut)))                                                               \
                                        /* Calcul de la moitie de la difference 'l' entre le carre qui suit immediatement 'nr2' et   */ \
                                        /* 'nr2' lui-meme, quantite qui permet de savoir si l'on trouve sur un bras vertical de      */ \
                                        /* spirale (lorsqu'on est inferieur a 'l'), ou bien sur un bras horizontal (lorsqu'on est    */ \
                                        /* superieur a 'l') :                                                                        */ \
                                        /*                                                                                           */ \
                                        /*                               2     2                                                     */ \
                                        /*                       (nr + 1)  - nr                                                      */ \
                                        /*                  l = -----------------                                                    */ \
                                        /*                              2                                                            */ \
                                        /*                                                                                           */ \
                                        /*                         2                2                                                */ \
                                        /*                       nr  + 2.nr + 1 - nr                                                 */ \
                                        /*                  l = ----------------------                                               */ \
                                        /*                                2                                                          */ \
                                        /*                                                                                           */ \
                                        /*                       2.nr + 1                                                            */ \
                                        /*                  l = ----------                                                           */ \
                                        /*                          2                                                                */ \
                                        /*                                                                                           */
#define   SPIRALE_DISTANCE_AU_CARRE_INFERIEUR(index,saut)                                                                               \
                    SOUS(SPIRALE_INDEX_RELATIF(index,saut),SPIRALE_CARRE_INFERIEUR(index,saut))                                         \
                                        /* Calcul de la "distance" 'd' mesuree sur la spirale de l'index 'n' au carre le precedant   */ \
                                        /* immediatement 'nr2' :                                                                     */ \
                                        /*                                                                                           */ \
                                        /*                  d = n - nr2                                                              */ \
                                        /*                                                                                           */
#define   SPIRALE_DISTANCE_AU_COIN_PRECEDENT(index,saut)                                                                                \
                    COND(IFLE(SPIRALE_DISTANCE_AU_CARRE_INFERIEUR(index,saut),SPIRALE_CARACTERISATION_DU_BRAS_COURANT(index,saut))      \
                        ,SPIRALE_DISTANCE_AU_CARRE_INFERIEUR(index,saut)                                                                \
                        ,SOUS(SPIRALE_DISTANCE_AU_CARRE_INFERIEUR(index,saut),SPIRALE_CARACTERISATION_DU_BRAS_COURANT(index,saut))      \
                         )                                                                                                              \
                                        /* Calcul de la "distance" 'b' mesuree sur la spirale de l'index 'n' au "coin" le precedant  */ \
                                        /* immediatement :                                                                           */ \
                                        /*                                                                                           */ \
                                        /*        si d <= l : b = d          ('n' est sur un bras vertical)                          */ \
                                        /*        si d >  l : b = d  - l     ('n' est sur un bras horizontal)                        */ \
                                        /*                                                                                           */
#define   SPIRALE_COORDONNEES_DU_CARRE_INFERIEUR(index,saut)                                                                            \
                    MOIT(COND(EST_PAIR(SPIRALE_CARRE_INFERIEUR(index,saut))                                                             \
                             ,NEUT(SPIRALE_RACINE_CARREE_ENTIERE(index,saut))                                                           \
                             ,TRMU(SPIRALE_RACINE_CARREE_ENTIERE(index,saut))                                                           \
                              )                                                                                                         \
                         )                                                                                                              \
                                        /* Caracterisation 'q' des coordonnees 'X' et 'Y' du carre 'nr2' precedant 'n' :             */ \
                                        /*                                                                                           */ \
                                        /*        si nr2 est pair   : q = nr / 2       ('n' est dans le triangle inferieur)          */ \
                                        /*        si nr2 est impair : q = (nr - 1) / 2 ('n' est dans le triangle superieur)          */ \
                                        /*                                                                                           */
#define   SPIRALE_X_DU_CARRE_INFERIEUR(index,saut)                                                                                      \
                    COND(EST_PAIR(SPIRALE_CARRE_INFERIEUR(index,saut))                                                                  \
                        ,NEGA(SPIRALE_COORDONNEES_DU_CARRE_INFERIEUR(index,saut))                                                       \
                        ,TRPU(SPIRALE_COORDONNEES_DU_CARRE_INFERIEUR(index,saut))                                                       \
                         )                                                                                                              \
                                        /* Abscisse 'X0' du carre 'nr2' precedant 'n' :                                              */ \
                                        /*                                                                                           */ \
                                        /*        si nr2 est pair   : X0 = -q          ('n' est dans le triangle inferieur)          */ \
                                        /*        si nr2 est impair : X0 = q + 1       ('n' est dans le triangle superieur)          */ \
                                        /*                                                                                           */
#define   SPIRALE_Y_DU_CARRE_INFERIEUR(index,saut)                                                                                      \
                    COND(EST_PAIR(SPIRALE_CARRE_INFERIEUR(index,saut))                                                                  \
                        ,NEUT(SPIRALE_COORDONNEES_DU_CARRE_INFERIEUR(index,saut))                                                       \
                        ,NEGA(SPIRALE_COORDONNEES_DU_CARRE_INFERIEUR(index,saut))                                                       \
                         )                                                                                                              \
                                        /* Ordonnee 'Y0' du carre 'nr2' precedant 'n' :                                              */ \
                                        /*                                                                                           */ \
                                        /*        si nr2 est pair   : Y0 = +q          ('n' est dans le triangle inferieur)          */ \
                                        /*        si nr2 est impair : Y0 = -q          ('n' est dans le triangle superieur)          */ \
                                        /*                                                                                           */

#define   Xcentre_SPIRALE                                                                                                               \
                    k___Xmin
#define   Ycentre_SPIRALE                                                                                                               \
                    k___Ymin
                                        /* Definition d'un centre arbitraire pour la spirale.                                        */
                                        /*                                                                                           */
                                        /* ATTENTION, avant le 1995062000, il y avait ici :                                          */
                                        /*                                                                                           */
                                        /*                  #define   Xcentre_SPIRALE                                             \  */
                                        /*                                      Xcentre                                              */
                                        /*                  #define   Ycentre_SPIRALE                                             \  */
                                        /*                                      Ycentre                                              */
                                        /*                                                                                           */
                                        /* Malheureusement, depuis l'introduction des fonctions 'FiSPIRALE_X(...)' et                */
                                        /* 'FiSPIRALE_Y(...)' introduites dans '$xig/fonct$vv$FON', ces definitions ne               */
                                        /* sont plus acceptables car, en effet, elles demandent {Xmin,Xmax,Ymin,Ymax}, ce            */
                                        /* que certains programmes (par exemple, ceux de '$xcp') ne connaissent pas. D'ou            */
                                        /* cette nouvelle definition "constante"...                                                  */

#define   SPIRALE_X(index,saut)                                                                                                         \
                    COOA(COND(EST_PAIR(SPIRALE_CARRE_INFERIEUR(index,saut))                                                             \
                             ,COND(IFLE(SPIRALE_DISTANCE_AU_CARRE_INFERIEUR(index,saut)                                                 \
                                       ,SPIRALE_CARACTERISATION_DU_BRAS_COURANT(index,saut)                                             \
                                        )                                                                                               \
                                  ,NEUT(SPIRALE_X_DU_CARRE_INFERIEUR(index,saut))                                                       \
                                  ,ADD2(SPIRALE_X_DU_CARRE_INFERIEUR(index,saut)                                                        \
                                       ,SPIRALE_DISTANCE_AU_COIN_PRECEDENT(index,saut)                                                  \
                                        )                                                                                               \
                                   )                                                                                                    \
                             ,COND(IFLE(SPIRALE_DISTANCE_AU_CARRE_INFERIEUR(index,saut)                                                 \
                                       ,SPIRALE_CARACTERISATION_DU_BRAS_COURANT(index,saut)                                             \
                                        )                                                                                               \
                                  ,NEUT(SPIRALE_X_DU_CARRE_INFERIEUR(index,saut))                                                       \
                                  ,SOUS(SPIRALE_X_DU_CARRE_INFERIEUR(index,saut)                                                        \
                                       ,SPIRALE_DISTANCE_AU_COIN_PRECEDENT(index,saut)                                                  \
                                        )                                                                                               \
                                   )                                                                                                    \
                              )                                                                                                         \
                        ,Xcentre_SPIRALE                                                                                                \
                         )                                                                                                              \
                                        /* Abscisse 'X' de 'n'...                                                                    */
#define   SPIRALE_Y(index,saut)                                                                                                         \
                    COOA(COND(EST_PAIR(SPIRALE_CARRE_INFERIEUR(index,saut))                                                             \
                             ,COND(IFLE(SPIRALE_DISTANCE_AU_CARRE_INFERIEUR(index,saut)                                                 \
                                       ,SPIRALE_CARACTERISATION_DU_BRAS_COURANT(index,saut)                                             \
                                        )                                                                                               \
                                  ,SOUS(SPIRALE_Y_DU_CARRE_INFERIEUR(index,saut)                                                        \
                                       ,SPIRALE_DISTANCE_AU_COIN_PRECEDENT(index,saut)                                                  \
                                        )                                                                                               \
                                  ,SOUS(SPIRALE_Y_DU_CARRE_INFERIEUR(index,saut)                                                        \
                                       ,SPIRALE_CARACTERISATION_DU_BRAS_COURANT(index,saut)                                             \
                                        )                                                                                               \
                                   )                                                                                                    \
                             ,COND(IFLE(SPIRALE_DISTANCE_AU_CARRE_INFERIEUR(index,saut)                                                 \
                                       ,SPIRALE_CARACTERISATION_DU_BRAS_COURANT(index,saut)                                             \
                                        )                                                                                               \
                                  ,ADD2(SPIRALE_Y_DU_CARRE_INFERIEUR(index,saut)                                                        \
                                       ,SPIRALE_DISTANCE_AU_COIN_PRECEDENT(index,saut)                                                  \
                                        )                                                                                               \
                                  ,ADD2(SPIRALE_Y_DU_CARRE_INFERIEUR(index,saut)                                                        \
                                       ,SPIRALE_CARACTERISATION_DU_BRAS_COURANT(index,saut)                                             \
                                        )                                                                                               \
                                   )                                                                                                    \
                              )                                                                                                         \
                        ,Ycentre_SPIRALE                                                                                                \
                         )                                                                                                              \
                                        /* Ordonnee 'Y' de 'n'....                                                                   */

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        P A R C O U R S   C I R C U L A I R E   D ' U N E   S P I R A L E   C A R R E E  :                                         */
/*                                                                                                                                   */
/*************************************************************************************************************************************/
#define   SPIRALE_CIRCULAIRE_VALIDATION(Vnombre_de_points_sautes)                                                                       \
                    Bblock                                                                                                              \
                    Test(IFNE(pasX,pasY))                                                                                               \
                         Bblock                                                                                                         \
                         PRINT_ERREUR("'pasX' et 'pasY' doivent etre egaux afin de parcourir correctement une spirale circulaire");     \
                         Eblock                                                                                                         \
                    ATes                                                                                                                \
                         Bblock                                                                                                         \
                         Eblock                                                                                                         \
                    ETes                                                                                                                \
                    Test(IFNE(Vnombre_de_points_sautes,NOMBRE_DE_POINTS_SAUTES_SUR_LA_SPIRALE))                                         \
                         Bblock                                                                                                         \
                         PRINT_ERREUR("sur une spirale circulaire, on ne peut sauter des points, ce parametre est donc ignore");        \
                         Eblock                                                                                                         \
                    ATes                                                                                                                \
                         Bblock                                                                                                         \
                         Eblock                                                                                                         \
                    ETes                                                                                                                \
                    Eblock

#define   INITIALISER_UNE_SPIRALE_CIRCULAIRE                                                                                            \
                    VRAI
#define   NE_PAS_INITIALISER_UNE_SPIRALE_CIRCULAIRE                                                                                     \
                    NOTL(INITIALISER_UNE_SPIRALE_CIRCULAIRE)

#define   DESINITIALISER_UNE_SPIRALE_CIRCULAIRE                                                                                         \
                    VRAI
#define   NE_PAS_DESINITIALISER_UNE_SPIRALE_CIRCULAIRE                                                                                  \
                    NOTL(DESINITIALISER_UNE_SPIRALE_CIRCULAIRE)

#define   SPIRALE_CIRCULAIRE_DEPLACEMENT_ET_PARCOURS(X_spirale,Y_spirale,X_centre,Y_centre,numero,XY_max,initialiser,desinitialiser)    \
                    Bblock                                                                                                              \
                    DEFV(pointI_2D,point_de_numero_cherche_relatif_au_centre);                                                          \
                    CALS(Fparcours_circulaire_d_une_spirale_carree(ADRESSE(point_de_numero_cherche_relatif_au_centre)                   \
                                                                  ,numero                                                               \
                                                                  ,XY_max                                                               \
                                                                  ,initialiser                                                          \
                                                                  ,desinitialiser                                                       \
                                                                   )                                                                    \
                         );                                                                                                             \
                                        /* Definition d'un point de manoeuvre donnant le point courant de la spirale relativement    */ \
                                        /* au centre...                                                                              */ \
                    EGAL(X_spirale                                                                                                      \
                        ,ADD2(X_centre                                                                                                  \
                             ,MUL2(SPIRALE_CIRCULAIRE_DEPLACEMENT_ET_PARCOURS_____amplitude_horizontale                                 \
                                  ,COXR(ASD1(point_de_numero_cherche_relatif_au_centre,x))                                              \
                                   )                                                                                                    \
                              )                                                                                                         \
                         );                                                                                                             \
                    EGAL(Y_spirale                                                                                                      \
                        ,ADD2(Y_centre                                                                                                  \
                             ,MUL2(SPIRALE_CIRCULAIRE_DEPLACEMENT_ET_PARCOURS_____amplitude_verticale__                                 \
                                  ,COYR(ASD1(point_de_numero_cherche_relatif_au_centre,y))                                              \
                                   )                                                                                                    \
                              )                                                                                                         \
                         );                                                                                                             \
                                        /* Et enfin generation des coordonnees absolues du point courant...                          */ \
                                        /*                                                                                           */ \
                                        /* La possibilite de "dilater" la spirale a ete introduite le 20151109145531...              */ \
                    Eblock

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        Q U E L Q U E S   F O N C T I O N S   D ' E D I T I O N  :                                                                 */
/*                                                                                                                                   */
/*************************************************************************************************************************************/
#define   PRINT_ABSCISSE                                                                                                                \
                    Bblock                                                                                                              \
                    CAL3(Prme2("X=%0*d\n",NOMBRE_DE_CHIFFRES_DECIMAUX(dimX),X));                                                        \
                                        /* Edition de l'abscisse 'X' courante.                                                       */ \
                                        /*                                                                                           */ \
                                        /* La procedure 'NOMBRE_DE_CHIFFRES_DECIMAUX(...)' fut introduite le 20051210182839.         */ \
                    Eblock
#define   PRINT_ORDONNEE                                                                                                                \
                    Bblock                                                                                                              \
                    CAL3(Prme2("Y=%0*d\n",NOMBRE_DE_CHIFFRES_DECIMAUX(dimY),Y));                                                        \
                                        /* Edition de l'ordonnee 'Y' courante.                                                       */ \
                                        /*                                                                                           */ \
                                        /* La procedure 'NOMBRE_DE_CHIFFRES_DECIMAUX(...)' fut introduite le 20051210182839.         */ \
                    Eblock
#define   PRINT_COLONNE                                                                                                                 \
                    Bblock                                                                                                              \
                    Test(IFEQ(Y,Ymin))                                                                                                  \
                         Bblock                                                                                                         \
                         PRINT_ABSCISSE;                                                                                                \
                                        /* Edition de l'abscisse 'X' courante en debut de chaque colonne                             */ \
                         Eblock                                                                                                         \
                    ATes                                                                                                                \
                         Bblock                                                                                                         \
                         Eblock                                                                                                         \
                    ETes                                                                                                                \
                    Eblock
#define   PRINT_LIGNE                                                                                                                   \
                    Bblock                                                                                                              \
                    Test(IFEQ(X,Xmin))                                                                                                  \
                         Bblock                                                                                                         \
                         PRINT_ORDONNEE;                                                                                                \
                                        /* Edition de l'ordonnee 'Y' courante en debut de chaque ligne.                              */ \
                         Eblock                                                                                                         \
                    ATes                                                                                                                \
                         Bblock                                                                                                         \
                         Eblock                                                                                                         \
                    ETes                                                                                                                \
                    Eblock

#define   PRINT_CHARGE(pas)                                                                                                             \
                    Bblock                                                                                                              \
                    Test(IFET(IFEQ(Y,Ymin),IFEQ(X,Xmin)))                                                                               \
                         Bblock                                                                                                         \
                         CALS(Fsauts_de_lignes(UN));                                                                                    \
                                        /* Par prudence...                                                                           */ \
                         Eblock                                                                                                         \
                    ATes                                                                                                                \
                         Bblock                                                                                                         \
                         Eblock                                                                                                         \
                    ETes                                                                                                                \
                                                                                                                                        \
                    Test(IFET(IZEQ(REST(COYR(Y),pas)),IFEQ(X,Xmin)))                                                                    \
                         Bblock                                                                                                         \
                         Repe(DIVZ(COYR(Y),pas))                                                                                        \
                              Bblock                                                                                                    \
                              CAL3(Prme1(FORMAT_CHAR,K_ETOILE));                                                                        \
                                        /* Au debut de chaque ligne, on edite une suite d'etoiles montrant le travail deja           */ \
                                        /* effectue et dont le nombre est proportionnel a 'Y'.                                       */ \
                              Eblock                                                                                                    \
                         ERep                                                                                                           \
                                                                                                                                        \
                         Repe(DIVZ(SOUS(dimY,COYR(Y)),pas))                                                                             \
                              Bblock                                                                                                    \
                              CAL3(Prme1(FORMAT_CHAR,K_POINT));                                                                         \
                                        /* Au bout de chaque ligne, on edite une suite de points montrant le travail encore a        */ \
                                        /* effectuer, et dont le nombre est proportionnel a 'dimY-Y'.                                */ \
                              Eblock                                                                                                    \
                         ERep                                                                                                           \
                                                                                                                                        \
                         CALS(Fsauts_de_lignes(UN));                                                                                    \
                         Eblock                                                                                                         \
                    ATes                                                                                                                \
                         Bblock                                                                                                         \
                         Eblock                                                                                                         \
                    ETes                                                                                                                \
                    Eblock                                                                                                              \
                                        /* Cette macro permet par une edition periodique de petites etoiles de se situer par         */ \
                                        /* rapport a la masse totale du travail a effectuer... Elle ne fonctionne bien qu'avec       */ \
                                        /* la macro 'begin_image'/'end_image' de parcours des images.                                */

#define   INHIBER____begin_end_____editer_la_progression                                                                                \
                    BSaveModifyVariable(Logical                                                                                         \
                                       ,begin_end_____editer_la_progression                                                             \
                                       ,FAUX                                                                                            \
                                        );
#define   RESTAURER__begin_end_____editer_la_progression                                                                                \
                    ESaveModifyVariable(Logical                                                                                         \
                                       ,begin_end_____editer_la_progression                                                             \
                                        );
                                        /* Introduit le 20170519145548 pour, par exemple, bloquer a priori l'edition de la           */
                                        /* progression dans des fonctions qui ne le "meritent" pas.                                  */

#define   UTILISER_LE_MODE_BACK___DE_PROGRESSION_DES_BEGIN_END                                                                          \
                    VRAI
#define   UTILISER_LE_MODE_DIRECT_DE_PROGRESSION_DES_BEGIN_END                                                                          \
                    NOTL(UTILISER_LE_MODE_BACK___DE_PROGRESSION_DES_BEGIN_END)
                                        /* Modes introduits le 20170402102304...                                                     */

#define   PTYPE_A                                                                                                                       \
                    "album"
#define   PTYPE_I                                                                                                                       \
                    "image"
                                        /* Modes introduits le 20170402102304...                                                     */

#define   B_PROGRESSION_DES_BEGIN_END(coordonnee,coordonnee_minimale,dimension_de_la_coordonnee,utiliser_le_mode_back,type)             \
                                        /* Le parametre 'mode_de_PROGRESSION_DES_BEGIN_END' a ete introduit le 20170402102304...     */ \
                                        /*                                                                                           */ \
                                        /* Le parametre 'type' a ete introduit le 20170519154357...                                  */ \
                    Bblock                                                                                                              \
                    Test(IL_FAUT(begin_end_____editer_la_progression))                                                                  \
                         Bblock                                                                                                         \
                         Test(IZEQ(begin_end_____compteur_d_imbrications))                                                              \
                              Bblock                                                                                                    \
                              CALS(Fprogression_des_begin_end(INTE(coordonnee)                                                          \
                                                             ,INTE(coordonnee_minimale)                                                 \
                                                             ,INTE(dimension_de_la_coordonnee)                                          \
                                                             ,begin_end_____pas_d_edition_de_la_progression                             \
                                                             ,utiliser_le_mode_back                                                     \
                                                             ,Gvar_sHOTE                                                                \
                                                             ,Gvar_HOST                                                                 \
                                                             ,identifiant_de_branches_paralleles                                        \
                                                             ,nom_de_la_commande_courante                                               \
                                                             ,FICHIER_COURANT_RELATIF                                                   \
                                                             ,NomDeLaFonctionCourante                                                   \
                                                             ,LIGNE_COURANTE                                                            \
                                                             ,type                                                                      \
                                                              )                                                                         \
                                   );                                                                                                   \
                                        /* ATTENTION : c'est bien 'nom_de_la_commande_courante' et non 'NOM_DE_LA_COMMANDE_COURANTE' */ \
                                        /* qui doit figurer ci-dessus et ce a cause du type 'CHAR' attendu pour cet argument...      */ \
                                        /*                                                                                           */ \
                                        /* L'argument 'type' a ete introduit le 20170519154357...                                    */ \
                              Eblock                                                                                                    \
                         ATes                                                                                                           \
                              Bblock                                                                                                    \
                              Eblock                                                                                                    \
                         ETes                                                                                                           \
                                                                                                                                        \
                         INCR(begin_end_____compteur_d_imbrications,I);                                                                 \
                         Eblock                                                                                                         \
                    ATes                                                                                                                \
                         Bblock                                                                                                         \
                         Eblock                                                                                                         \
                    ETes                                                                                                                \
                    Eblock                                                                                                              \
                                        /* Edition eventuelle de la progression d'un parcours d'image...                             */
#define   E_PROGRESSION_DES_BEGIN_END                                                                                                   \
                    Bblock                                                                                                              \
                    Test(IL_FAUT(begin_end_____editer_la_progression))                                                                  \
                         Bblock                                                                                                         \
                         DECR(begin_end_____compteur_d_imbrications,I);                                                                 \
                         Eblock                                                                                                         \
                    ATes                                                                                                                \
                         Bblock                                                                                                         \
                         Eblock                                                                                                         \
                    ETes                                                                                                                \
                    Eblock                                                                                                              \
                                        /* Fin de l'edition eventuelle de la progression d'un parcours d'image. Ceci a ete           */ \
                                        /* introduit le 20170405114853 (voir 'v $xig/fonct$vv$FON 20170405114345').                  */



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.