_______________________________________________________________________________________________________________________________________
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        F O N C T I O N S   D E   B A S E   D ' E D I T I O N   D E S   I M A G E S                                                */
/*        S U R   L E   B I T - M A P   N O I R   E T   B L A N C   R I D G E  :                                                     */
/*                                                                                                                                   */
/*                                                                                                                                   */
/*        Definition :                                                                                                               */
/*                                                                                                                                   */
/*                    Ce fichier contient toutes les fonctions                                                                       */
/*                  de base d'edition graphique des images raster,                                                                   */
/*                  quelle que soit la definition.                                                                                   */
/*                                                                                                                                   */
/*                                                                                                                                   */
/*        Author of '$xiidr/fonction$FON' :                                                                                          */
/*                                                                                                                                   */
/*                    Jean-Francois COLONNA (LACTAMME, 19870000000000).                                                              */
/*                                                                                                                                   */
/*************************************************************************************************************************************/

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        O P P O R T U N I T E   D E   C O M P I L E R   C E   M O D U L E  :                                                       */
/*                                                                                                                                   */
/*************************************************************************************************************************************/

#ifdef    __VERSION__COMPILER_LE_GRAPHIQUE_ROS                                  /* Common,DEFV(Fonction,) : indicateur de VERSION.   */
DEFV(Common,DEFV(Logical,_______VERSION__COMPILER_LE_GRAPHIQUE_ROS));
#Aifdef   __VERSION__COMPILER_LE_GRAPHIQUE_ROS                                  /* Common,DEFV(Fonction,) : indicateur de VERSION.   */
#Eifdef   __VERSION__COMPILER_LE_GRAPHIQUE_ROS                                  /* Common,DEFV(Fonction,) : indicateur de VERSION.   */

#ifdef    __VERSION__COMPILER_LE_GRAPHIQUE_ROS              /* Common,DEFV(Fonction,) : la bibliotheque est conditionnelle.          */
/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        M I S E   E N   M O D E   G R A P H I Q U E  :                                                                             */
/*                                                                                                                                   */
/*************************************************************************************************************************************/

BFonctionI

DEFV(Common,DEFV(FonctionI,IRopen()))
/*-----------------------------------------------------------------------------------------------------------------------------------*/
     Bblock
     INIT_ERROR;
     /*..............................................................................................................................*/
     EXECUTION_D_UNE_SUITE_DE_COMMANDES_SOUS_SH("settek");
     RETU_ERROR;
     Eblock

EFonctionI

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        M I S E   E N   M O D E   A L P H A _ N U M E R I Q U E  :                                                                 */
/*                                                                                                                                   */
/*************************************************************************************************************************************/

BFonctionI

DEFV(Common,DEFV(FonctionI,IRclose()))
/*-----------------------------------------------------------------------------------------------------------------------------------*/
     Bblock
     INIT_ERROR;
     /*..............................................................................................................................*/
     EXECUTION_D_UNE_SUITE_DE_COMMANDES_SOUS_SH("setx3.64");
     RETU_ERROR;
     Eblock

EFonctionI

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        D I S P L A Y   G R A P H I Q U E   D ' U N E   I M A G E  :                                                               */
/*                                                                                                                                   */
/*************************************************************************************************************************************/

BFonctionI

#    define    FACTEUR_GRAPHIQUE                                                                                                        \
                         QUATRE                                                                                                         \
                                        /* Facteur d'echelle pour passer des coordonnees d'image aux                                 */ \
                                        /* coordonnees graphiques.                                                                   */
DEFV(Common,DEFV(FonctionI,IRdisplay(imageA,seuil)))
DEFV(Argument,DEFV(image,imageA));
                                        /* Image Argument que l'on veut visualiser sur le bit-map noir et blanc.                     */
DEFV(Argument,DEFV(genere_p,seuil));
                                        /* Le bit-map etant noir et blanc, il faut decreter a l'aide de ce "seuil"                   */
                                        /* quels sont les point "noirs" (point < seuil) et les points "blancs"                       */
                                        /* (point >= seuil).                                                                         */
/*-----------------------------------------------------------------------------------------------------------------------------------*/
     Bblock
     INIT_ERROR;
     DEFV(STRU(Rectangle),window_coordonnees);
                                        /* Definition des coordonnees {X,Y} du coin superieur gauche de la                           */
                                        /* fenetre courante, et des longueurs (Dx,Dy) de celle-ci.                                   */
     DEFV(STRU(Form),window_dimensions);
                                        /* (re-)definition des longueurs (Dx,Dy)=(width,height) de la fenetre courante.              */
     DEFV(Int,INIT(window_identificator,UNDEF));
                                        /* Identificateur de la fenetre courante.                                                    */
     DEFV(genere_p,point);
                                        /* Point imageA[X][Y] courant.                                                               */
     DEFV(STRU(Point),origine);
                                        /* Coordonnees de l'origine du vecteur courant.                                              */
     DEFV(STRU(Point),extremite);
                                        /* Coordonnees de l'extremite du vecteur courant.                                            */
     DEFV(Logical,INIT(trace_segment,LUNDEF));
                                        /* Indique si un trace de segment est en cours ("VRAI") ou pas ("FAUX").                     */
     /*..............................................................................................................................*/
     EGAL(window_identificator,GetWindowNumber(STANDARD_ERREUR));
     CALS(GetWindowFrame(window_identificator,ADRESSE(window_coordonnees)));
                                        /* Recuperation de la definition geometrique de la fenetre courante.                         */
     EGAL(ASD1(window_dimensions,width),ASD2(window_coordonnees,extent,x));
     EGAL(ASD1(window_dimensions,height),ASD2(window_coordonnees,extent,y));
     CALS(DrawInit(ADRESSE(window_dimensions)));
                                        /* Pour initialiser le trace graphique (definition geometrique de la fenetre).               */
     CALS(ClearScreen());
                                        /* Nettoyage de l'ecran.                                                                     */
     CALS(ClearBitmap());
                                        /* Nettoyage du bit-map.                                                                     */
     begin_colonne
          Bblock
          EGAL(trace_segment,FAUX);
          begin_ligne
               Bblock
               EGAL(point,load_point(imageA,X,Y));
                                        /* Recuperation du point courant.                                                            */
               Test(IFLE(point,seuil))
                    Bblock
                                        /* Cas ou le point courant doit etre "noir".                                                 */
                    Test(IL_NE_FAUT_PAS(trace_segment))
                         Bblock
                         EGAL(trace_segment,VRAI);
                         INITIALISATION_POINT_2D(origine
                                                ,MUL2(FACTEUR_GRAPHIQUE,X)
                                                ,MUL2(FACTEUR_GRAPHIQUE,Y)
                                                 );
                                        /* Definition de l'origine du segment courant.                                               */
                         Eblock
                    ATes
                         Bblock
                         Eblock
                    ETes
                    Eblock
               ATes
                    Bblock
                    Eblock
               ETes
               Test(IFOU(IFGT(point,seuil),IFEQ(X,Xmax)))
                    Bblock
                                        /* Cas ou le point courant doit etre "blanc" ou bien c'est le bout de ligne.                 */
                    Test(IL_FAUT(trace_segment))
                         Bblock
                         INITIALISATION_POINT_2D(extremite
                                                ,MUL2(FACTEUR_GRAPHIQUE,X)
                                                ,MUL2(FACTEUR_GRAPHIQUE,Y)
                                                 );
                         DrawLine(ASD1(origine,x),ASD1(origine,y),ASD1(extremite,x),ASD1(extremite,y));
                         EGAL(trace_segment,FAUX);
                         Eblock
                    ATes
                         Bblock
                         Eblock
                    ETes
                    Eblock
               ATes
                    Bblock
                    Eblock
               ETes
               Eblock
          end_ligne
          Eblock
     end_colonne
     WriteScreen();
                                        /* Et on force l'ecriture de l'image sur le bit-map.                                         */
     RETU_ERROR;
     Eblock

EFonctionI

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        V I S U A L I S A T I O N   D ' U N E   I M A G E  :                                                                       */
/*                                                                                                                                   */
/*************************************************************************************************************************************/

BFonctionI

#    define    FACTEUR_VISUALISATION                                                                                                    \
                         FACTEUR_GRAPHIQUE                                                                                              \
                                        /* Pour passer des coordonnees de l'image a celles de l'ecran.                               */
#    define    Xmin_bit_map                                                                                                             \
                         ZERO
#    define    Xmax_bit_map                                                                                                             \
                         PARE(4000)
#    define    Ymin_bit_map                                                                                                             \
                         ZERO
#    define    Ymax_bit_map                                                                                                             \
                         PARE(4000)
#    define    TAILLE_PAVE_X                                                                                                            \
                         DIVI(SEIZE,HUIT)                                                                                               \
                                        /* Taille horizontale d'un pave de tramage d'un "pixel" en nombre de points,                 */
#    define    TAILLE_PAVE_Y                                                                                                            \
                         DIVI(SEIZE,HUIT)                                                                                               \
                                        /* Taille verticale d'un pave de tramage d'un "pixel" en nombre de points.                   */
#    define    TAILLE_PAVE                                                                                                              \
                         TAILLE_PAVE_X                                                                                                  \
                                        /* Taille horizontale d'un pave de tramage ; cette constante est utilisee dans               */
                                        /* la formule 'index_random(x,y)' et lors de son inversion...                                */
#    define    sous_Xmin                                                                                                                \
                         ZERO                                                                                                           \
                                        /* Abscisse minimale de sous-echantillonnage d'un pave.                                      */
#    define    sous_Xmax                                                                                                                \
                         TRMU(TAILLE_PAVE_X)                                                                                            \
                                        /* Abscisse maximale de sous-echantillonnage d'un pave.                                      */
#    define    sous_Ymin                                                                                                                \
                         ZERO                                                                                                           \
                                        /* Ordonnee minimale de sous-echantillonnage d'un pave.                                      */
#    define    sous_Ymax                                                                                                                \
                         TRMU(TAILLE_PAVE_Y)                                                                                            \
                                        /* Ordonnee maximale de sous-echantillonnage d'un pave.                                      */
#    define    pas_sous_X                                                                                                               \
                         pasX                                                                                                           \
                                        /* Pas de parcours horizontal des paves,                                                     */
#    define    pas_sous_Y                                                                                                               \
                         pasY                                                                                                           \
                                        /* Pas de parcours vertical des paves.                                                       */
#    define    index_random(x,y)                                                                                                        \
                         ADD2(INDEX0                                                                                                    \
                             ,ADD2(SOUS(x,sous_Xmin)                                                                                    \
                                  ,MUL2(SOUS(y,sous_Ymin),TAILLE_PAVE)                                                                  \
                                   )                                                                                                    \
                              )
#    define    min_index_random                                                                                                         \
                         index_random(sous_Xmin,sous_Ymin)
#    define    max_index_random                                                                                                         \
                         index_random(sous_Xmax,sous_Ymax)
#    define    taille_index_random                                                                                                      \
                         NBRE(min_index_random,max_index_random)
#    define    graine1   2413                                                                                                           \
                                        /* Parametres arbitraires et aleatoires,                                                     */
#    define    graine2   31415                                                                                                          \
                                        /* Parametres arbitraires et aleatoires,                                                     */
#    define    graine3   7687                                                                                                           \
                                        /* Parametres arbitraires et aleatoires,                                                     */
#    define    graine4   791                                                                                                            \
                                        /* Parametres arbitraires et aleatoires,                                                     */
#    define    decalage1 9                                                                                                              \
                                        /* Parametres arbitraires et aleatoires.                                                     */
#    define    translation1                                                                                                             \
                         PARE(23)
#    define    rdn_shuffle(x)                                                                                                           \
                         ADD2(SARS(ABSO(MUL2(MAGIK                                                                                      \
                                            ,OUEX(ADD2(MUL2(graine1,EXP2(x))                                                            \
                                                      ,MUL2(graine2,EXP3(x))                                                            \
                                                       )                                                                                \
                                                 ,ADD2(MUL2(graine3,EXP2(x))                                                            \
                                                      ,MUL2(graine4,EXP3(x))                                                            \
                                                       )                                                                                \
                                                  )                                                                                     \
                                             )                                                                                          \
                                        )                                                                                               \
                                  ,decalage1                                                                                            \
                                   )                                                                                                    \
                             ,translation1                                                                                              \
                              )
#    define    shuffle_index                                                                                                            \
                         ITb1(shuffle                                                                                                   \
                             ,ADD2(min_index_random                                                                                     \
                                  ,REST(ADD2(rdn_shuffle(OUEX(index_shuffle,graine))                                                    \
                                            ,increment_shuffle                                                                          \
                                             )                                                                                          \
                                       ,taille_index_random                                                                             \
                                        )                                                                                               \
                                   )                                                                                                    \
                              )
DEFV(Common,DEFV(FonctionI,IRvisualisation(imageA)))
DEFV(Argument,DEFV(image,imageA));
                                        /* Image Argument que l'on veut visualiser sur le bit-map noir et blanc.                     */
/*-----------------------------------------------------------------------------------------------------------------------------------*/
     Bblock
     INIT_ERROR;
     DEFV(STRU(Rectangle),window_coordonnees);
                                        /* Definition des coordonnees {X,Y} du coin superieur gauche de la                           */
                                        /* fenetre courante, et des longueurs (Dx,Dy) de celle-ci.                                   */
     DEFV(STRU(Form),window_dimensions);
                                        /* (re-)definition des longueurs (Dx,Dy)=(width,height) de la fenetre courante.              */
     DEFV(Int,INIT(window_identificator,UNDEF));
                                        /* Identificateur de la fenetre courante.                                                    */
     DEFV(genere_p,point);
                                        /* Point imageA[X][Y] courant.                                                               */
     DEFV(STRU(Point),origine);
                                        /* Coordonnees de l'origine du vecteur courant.                                              */
     DEFV(STRU(Point),extremite);
                                        /* Coordonnees de l'extremite du vecteur courant.                                            */
     DEFV(Int,INIT(sous_X,UNDEF));
                                        /* Pour echantillonner horizontalement un pave.                                              */
     DEFV(Int,INIT(sous_Y,UNDEF));
                                        /* Pour echantillonner verticalement un pave.                                                */
     DEFV(Int,INIT(numero,UNDEF));
                                        /* Numero du sous-point courant.                                                             */
     DEFV(Int,DTb1(shuffle,taille_index_random));
                                        /* Vecteur contenant pour chaque couple de coordonnees (sous_X,sous_Y) donnees comme         */
                                        /* un index un nouveau couple de coordonnees (rdn_X,rdn_Y) tranformees aleatoirement         */
                                        /* et biunivoquement.                                                                        */
     DEFV(Int,INIT(index_shuffle,UNDEF));
                                        /* Index du tableau de "shuffle"...                                                          */
     DEFV(Int,INIT(increment_shuffle,UNDEF));
                                        /* Afin de trouver une place libre dans le tableau de "shuffle".                             */
     DEFV(Int,INIT(rdn_X,UNDEF));
                                        /* Pour "shuffliser" horizontalement un pave.                                                */
     DEFV(Int,INIT(rdn_Y,UNDEF));
                                        /* Pour "shuffliser" verticalement un pave.                                                  */
     DEFV(Int,INIT(compteur,UNDEF));
                                        /* Compteur pour "shuffliser" les coordonnees.                                               */
     DEFV(Int,INIT(graine,UNDEF));
                                        /* Contient la valeur d'une fonction de 'X' et de 'Y' pour faire que                         */
                                        /* la "shufflisation" depende de la localisation...                                          */
     /*..............................................................................................................................*/
     EGAL(window_identificator,GetWindowNumber(STANDARD_ERREUR));
     GetWindowFrame(window_identificator,ADRESSE(window_coordonnees));
                                        /* Recuperation de la definition geometrique de la fenetre courante.                         */
     EGAL(ASD1(window_dimensions,width),ASD2(window_coordonnees,extent,x));
     EGAL(ASD1(window_dimensions,height),ASD2(window_coordonnees,extent,y));
     DrawInit(ADRESSE(window_dimensions));
                                        /* Pour initialiser le trace graphique (definition geometrique de la fenetre).               */
     ClearScreen();
                                        /* Nettoyage de l'ecran.                                                                     */
     ClearBitmap();
                                        /* Nettoyage du bit-map.                                                                     */
     begin_image
          Bblock
          EGAL(increment_shuffle,W);
          EGAL(graine
              ,MUL2(MAGIK
                   ,ADD2(COXR(X)
                        ,MUL2(dimX
                             ,COYR(Y)
                              )
                         )
                    )
               );
          EGAL(graine,rdn_shuffle(graine));
                                        /* Ainsi la "graine" depend de la localisation...                                            */
          DoIn(index_shuffle,min_index_random,max_index_random,I)
               Bblock
               EGAL(ITb1(shuffle,index_shuffle),UNDEF);
                                        /* On initialise de facon indefinie...                                                       */
               Eblock
          EDoI
          DoIn(index_shuffle,min_index_random,max_index_random,I)
               Bblock
               Test(IFEQ(index_shuffle,UNDEF))
                    Bblock
                    PRINT_ERREUR("l'index de 'shuffle' prend la valeur 'UNDEF'");
                    Eblock
               ATes
                    Bblock
                    Eblock
               ETes
               Tant(IFNE(shuffle_index,UNDEF))
                    Bblock
                    INCR(increment_shuffle,I);
                    Eblock
               ETan
               EGAL(shuffle_index,index_shuffle);
                                        /* Dans la premiere entree libre, on memorise l'index courant ; ulterieurement,              */
                                        /* un couple (sous_X,sous_Y) donnera un index dans le tableau "shuffle",                     */
                                        /* l'entree correspondante donnant le couple (rdn_X,rdn_Y).                                  */
               Eblock
          EDoI
          EGAL(point
              ,DIVI(MUL2(load_point(imageA,X,Y)
                        ,MUL2(TAILLE_PAVE_X,TAILLE_PAVE_Y)
                         )
                   ,BLANC
                    )
               );
                                        /* Recuperation du point courant.                                                            */
          CLIR(numero);
                                        /* On initialise le numero du sous-point courant.                                            */
          DoIn(sous_X,sous_Xmin,sous_Xmax,pas_sous_X)
               Bblock
               DoIn(sous_Y,sous_Ymin,sous_Ymax,pas_sous_Y)
                    Bblock
                    INCR(numero,I);
                                        /* On ne traite pas tous les points du pave courant ; seuls seront                           */
                                        /* marques ceux qui permettront de traduire le niveau du point courant                       */
                                        /* par une trame noir-blanc de dosage adequat...                                             */
                    Test(IFGT(numero,point))
                         Bblock
                         EGAL(index_shuffle,ITb1(shuffle,REST(index_random(sous_X,sous_Y),taille_index_random)));
                         EGAL(rdn_X
                             ,ADD2(sous_Xmin
                                  ,REST(SOUS(index_shuffle,min_index_random),TAILLE_PAVE)
                                   )
                              );
                         EGAL(rdn_Y
                             ,ADD2(sous_Ymin
                                  ,QUOD(SOUS(index_shuffle,min_index_random),TAILLE_PAVE)
                                   )
                              );
                                        /* ATTENTION : pour calculer 'rdn_X' et 'rdn_Y', on utilise le meme                          */
                                        /* diviseur 'TAILLE_PAVE' : en effet, il suffit de regarder la formule                       */
                                        /* donnant 'index_random(x,y)' pour s'en convaincre...                                       */
                         INITIALISATION_POINT_2D(origine
                                                ,MUL2(FACTEUR_VISUALISATION
                                                     ,ADD2(MUL2(TAILLE_PAVE_X,X)
                                                          ,rdn_X
                                                           )
                                                      )
                                                ,MUL2(FACTEUR_VISUALISATION
                                                     ,ADD2(MUL2(TAILLE_PAVE_Y,Y)
                                                          ,rdn_Y
                                                           )
                                                      )
                                                 );
                         Test(IFET(INCLff(ASD1(origine,x),Xmin_bit_map,Xmax_bit_map)
                                  ,INCLff(ASD1(origine,y),Ymin_bit_map,Ymax_bit_map)
                                   )
                              )
                              Bblock
                              TRANSFERT_POINT_2D(extremite,origine);
                              DrawLine(ASD1(origine,x),ASD1(origine,y),ASD1(extremite,x),ASD1(extremite,y));
                                        /* Trace du sous-point courant.                                                              */
                              Eblock
                         ATes
                              Bblock
                              Eblock
                         ETes
                         Eblock
                    ATes
                         Bblock
                         Eblock
                    ETes
                    Eblock
               EDoI
               Eblock
          EDoI
          Eblock
     end_image
     WriteScreen();
                                        /* Et on force l'ecriture de l'image sur le bit-map.                                         */
     RETU_ERROR;
     Eblock

EFonctionI

#    undef     TAILLE_PAVE_X
#    undef     TAILLE_PAVE_Y
#    undef     TAILLE_PAVE
#    undef     sous_Xmin
#    undef     sous_Xmax
#    undef     sous_Ymin
#    undef     sous_Ymax
#    undef     pas_sous_X
#    undef     pas_sous_Y
#    undef     index_random
#    undef     taille_index_random
#    undef     max_index_random
#    undef     min_index_random
#    undef     graine1
#    undef     graine2
#    undef     graine3
#    undef     graine4
#    undef     decalage1
#    undef     translation1
#    undef     rdn_shuffle
#    undef     shuffle_index
#    undef     Xmin_bit_map
#    undef     Xmax_bit_map
#    undef     Ymin_bit_map
#    undef     Ymax_bit_map
#    undef     FACTEUR_GRAPHIQUE
#    undef     FACTEUR_VISUALISATION
#Aifdef   __VERSION__COMPILER_LE_GRAPHIQUE_ROS              /* Common,DEFV(Fonction,) : la bibliotheque est conditionnelle.          */
#Eifdef   __VERSION__COMPILER_LE_GRAPHIQUE_ROS              /* Common,DEFV(Fonction,) : la bibliotheque est conditionnelle.          */

_______________________________________________________________________________________________________________________________________



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.