/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        C O N V O L U T I O N   D E   L ' I M A G E   A R G U M E N T  :                                                           */
/*                                                                                                                                   */
/*                                                                                                                                   */
/*        Author of '$xci/convol.01$I' :                                                                                             */
/*                                                                                                                                   */
/*                    Jean-Francois Colonna (LACTAMME, 1993??????????).                                                              */
/*                                                                                                                                   */
/*************************************************************************************************************************************/

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        M A C R O S   U T I L E S  :                                                                                               */
/*                                                                                                                                   */
/*************************************************************************************************************************************/
#define   SELECTION_DES_NIVEAUX(nom_palette,niveaux_a_traiter,niveaux_cumulables)                                                       \
                    Bblock                                                                                                              \
                    BoIn(niveau,NOIR,BLANC,PAS_COULEURS)                                                                                \
                         Bblock                                                                                                         \
                         EGAL(ITb1(niveaux_a_traiter,INDX(niveau,NOIR)),VRAI);                                                          \
                         EGAL(ITb1(niveaux_cumulables,INDX(niveau,NOIR)),VRAI);                                                         \
                                        /* Initialisation telle que tous les niveaux soient a la fois "traitables" et "cumulables".  */ \
                         Eblock                                                                                                         \
                    EBoI                                                                                                                \
                                                                                                                                        \
                    Test(IL_FAUT(exclure_un_niveau_de_la_convolution))                                                                  \
                         Bblock                                                                                                         \
                         EGAL(ITb1(niveaux_a_traiter,INDX(niveau_a_exclure_de_la_convolution,NOIR)),FAUX);                              \
                                        /* Possibilite introduite le 20060302163815 dans 'v $xci/convol.01$K' (et dans les autres    */ \
                                        /* programmes '$xci/convol.0?$K') puis generalisee ici le 20060304181214. Ceci est destine   */ \
                                        /* a ameliorer les images obtenues par 'v $xci/detourage.11$Z' et 'v $xci/detourage.13$Z'    */ \
                                        /* en convoluant le resultat, sauf le NOIR...                                                */ \
                         Eblock                                                                                                         \
                    ATes                                                                                                                \
                         Bblock                                                                                                         \
                         Eblock                                                                                                         \
                    ETes                                                                                                                \
                                                                                                                                        \
                    Test(IFNE_chaine(nom_palette,NOM_PIPE))                                                                             \
                         Bblock                                                                                                         \
                         Test(PAS_D_ERREUR(CODE_ERROR(Iload_liste_de_substitution(L_SUBSTITUTION_VARIABLE,nom_palette))))               \
                              Bblock                                                                                                    \
                              BoIn(niveau,NOIR,BLANC,PAS_COULEURS)                                                                      \
                                   Bblock                                                                                               \
                                   EGAL(ITb1(niveaux_a_traiter,INDX(niveau,NOIR))                                                       \
                                       ,COND(IFLE(ACCES_listes_de_substitution(L_SUBSTITUTION_VARIABLE,niveau)                          \
                                                 ,seuil_de_FAUX_VRAI_pour_les_niveaux_a_traiter                                         \
                                                  )                                                                                     \
                                            ,FAUX                                                                                       \
                                            ,VRAI                                                                                       \
                                             )                                                                                          \
                                        );                                                                                              \
                                        /* La liste 'L_SUBSTITUTION_VARIABLE' est convertie en valeurs logiques {FAUX,VRAI}          */ \
                                        /* suivant le seuil 'seuil_de_FAUX_VRAI_pour_les_niveaux_a_traiter'...                       */ \
                                   Eblock                                                                                               \
                              EBoI                                                                                                      \
                              Eblock                                                                                                    \
                         ATes                                                                                                           \
                              Bblock                                                                                                    \
                                        /* En cas d'erreur, les listes {niveaux_a_traiter,niveaux_cumulables} ont ete initialisees   */ \
                                        /* ci-dessus...                                                                              */ \
                              Eblock                                                                                                    \
                         ETes                                                                                                           \
                         Eblock                                                                                                         \
                    ATes                                                                                                                \
                         Bblock                                                                                                         \
                         Eblock                                                                                                         \
                    ETes                                                                                                                \
                    Eblock                                                                                                              \
                                        /* Definition des listes de niveaux a traiter (introduit le 20060304181214)...               */

#define   NOYAU(numero,valeur)                                                                                                          \
                    Bblock                                                                                                              \
                    EGAL(ITb1(noyau,INDX(numero,PREMIER_POINT)),valeur);                                                                \
                                                                                                                                        \
                    Test(EST_VRAI(le_noyau_de_convolution_est_carre))                                                                   \
                         Bblock                                                                                                         \
                         EGAL(ITb1(inhibition_du_noyau,INDX(numero,PREMIER_POINT)),ACTIF);                                              \
                                        /* Lorsque le noyau de convolution est carre, on prend tous les points de la spirale.        */ \
                         Eblock                                                                                                         \
                    ATes                                                                                                                \
                         Bblock                                                                                                         \
                         DEFV(Int,INIT(X,UNDEF));                                                                                       \
                         DEFV(Int,INIT(Y,UNDEF));                                                                                       \
                                                                                                                                        \
                         EGAL(X,iSPIRALE_X(numero,Pconvolution_____nombre_de_points_sautes));                                           \
                         EGAL(Y,iSPIRALE_Y(numero,Pconvolution_____nombre_de_points_sautes));                                           \
                                        /* Definition des coordonnees {X,Y} du point courant relativement au centre de la spirale,   */ \
                                        /* qui s'appelle (Xcentre_SPIRALE,Ycentre_SPIRALE). Le passage par les fonctions             */ \
                                        /* 'iSPIRALE_X(...)' et 'iSPIRALE_Y(...)' est destine a alleger le travail de certains       */ \
                                        /* compilateurs, et par exemple de 'SYSTEME_SGPCM801_IRIX_CC'.                               */ \
                                                                                                                                        \
                         Test(IFLT(RdisI2D(X,Y,Xcentre_SPIRALE,Ycentre_SPIRALE)                                                         \
                                  ,MOIT(RACX(nombre_de_points))                                                                         \
                                   )                                                                                                    \
                              )                                                                                                         \
                                        /* Le nombre de points du noyau (soit 'N') donne la surface du carre representant le noyau   */ \
                                        /* de convolution. La moitie de sa racine carre est donc le rayon du cercle inscrit dans le  */ \
                                        /* noyau carre, qui definit donc le noyau circulaire.                                        */ \
                              Bblock                                                                                                    \
                              EGAL(ITb1(inhibition_du_noyau,INDX(numero,PREMIER_POINT)),ACTIF);                                         \
                                        /* Lorsque le noyau de convolution est circulaire, on ne prend que les points qui sont       */ \
                                        /* situes dans le cercle inscrit a l'interieur du noyau carre...                             */ \
                              Eblock                                                                                                    \
                         ATes                                                                                                           \
                              Bblock                                                                                                    \
                              EGAL(ITb1(inhibition_du_noyau,INDX(numero,PREMIER_POINT)),INACTIF);                                       \
                                        /* Lorsque le noyau de convolution est circulaire, on exclue les points qui sont situes a    */ \
                                        /* l'exterieur du cercle inscrit a l'interieur du noyau carre...                             */ \
                              Eblock                                                                                                    \
                         ETes                                                                                                           \
                         Eblock                                                                                                         \
                    ETes                                                                                                                \
                    Eblock                                                                                                              \
                                        /* Definition de la liste d'inhibition suivant que le noyau est carre ou circulaire...       */



Copyright © Jean-François Colonna, 2019-2021.
Copyright © CMAP (Centre de Mathématiques APpliquées) UMR CNRS 7641 / Ecole Polytechnique, 2019-2021.