Voir le flux RSS

wiwaxia

[Actualité] La possibilité d'une île

Noter ce billet
par , 08/05/2017 à 19h18 (479 Affichages)
Suite du billet précédent.

La lecture du message à l'origine du premier billet m'avait remis en mémoire une brève indication algorithmique trouvée dans un livre paru il y a une vingtaine d'années, et concernant la création de reliefs fractals.
Le processus, très simple à mettre en oeuvre, consistait en la superposition sur un plan horizontal de marches d'escalier aléatoirement positionnées, et de hauteur égale à l'unité. Je n'ai pu remettre la main sur le texte, mais la transposition au triangle ne pose aucune difficulté; c'est l'objet de l'exposé qui suit, avec la description des variantes susceptibles de modifier radicalement l'aspect de l'image obtenue.

# Soit une variable Carte définie comme tableau d'entiers au format LongInt, dont les dimensions maximales correspondent à celles de l'image:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
 TYPE Tab_LInt = ARRAY[1..Dim_Max, 1..Dim_Max] OF LongInt;
 VAR Carte: Tab_LInt;
et dont tous les élément utiles ont été initialisés à zéro par les instructions:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
     FOR x:= 1 TO Larg_Image DO
       FOR y:= 1 TO Haut_Image DO Carte[x, y]:= 0;
On envisage une série de (N) étapes, au cours desquelles les coordonnées de trois points (A, B, C) du plan (xOy) font l'objet d'un tirage pseudo-aléatoire de densité uniforme, par des instructions du type:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
 TYPE Point = RECORD  x, y: LongInt  END;
 VAR VeA, VeB, VeC, Vmin, Vmax: Point;

 PROCEDURE TirageABC(VAR V1, V2, V3: Point);
   VAR i: Byte; Ve: Point;
   BEGIN
     FOR i:= 1 TO 3 DO
       BEGIN
         Ve.x:= Random(Larg_Image); Inc(Ve.x);
         Ve.y:= Random(Haut_Image); Inc(Ve.y);
         CASE i OF  1: V1:= Ve; 2: V2:= Ve; 3: V3:= Ve  END
       END
   END;

 TirageABC(VeA, VeB, VeC);
On augmente alors de (1) les valeurs de tous les points situés à l'intérieur du triangle (ABC), par le balayage systématique des cases présentes dans le rectangle circonscrit (voir le premier billet).
La plus grande valeur obtenue par incrémentation (Zmax) ayant été simultanément déterminée, on définit facilement une échelle de couleurs pour le transfert du pixel correspondant vers le corps de l'image:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
 PROCEDURE Init_1_MatIm(Zm, La, Ha: Z_32; VAR C_: Tab_LInt; VAR Ma: Tab_Pix);
   CONST P000: Pixel = (0, 0, 0);
         ListeC: ARRAY[0..9] OF Pixel =
                 ((  0, 105,   0), (  0, 180,   0), (  0, 255,   0),
                  (170, 255,   0), (255, 255,   0), (255, 170,   0),
                  (210, 165,   0), (165, 165, 165), (210, 210, 210), (255, 255, 255));
   VAR i: Byte; x, y, z: Z_32; Kc: Reel; Px: Pixel;
   BEGIN
     Kc:= 10 / (Zm + 1);
     FOR x:= 1 TO La DO
       FOR y:= 1 TO Ha DO BEGIN
                            z:= C_[x, y];
                            IF (z>0) THEN BEGIN
                                            i:= Trunc(Kc * z);
                                            Ma[x, y]:= ListeC[i]
                                          END
                                     ELSE Ma[x, y]:= P000
                          END
   END;

   Init_1_MatIm(Zmax, Larg_Image, Haut_Image, Carte, Matr_Image);
Voici ce que donne l'algorithme dans le cas d'images carrées (250x250) et un nombre croissant de tirages, prenant successivement les valeurs:
N1 = 16 , N2 = 256 , N3 = 4096 et N4 = 65536:

Nom : A250x250_N00016L128_01.png
Affichages : 28
Taille : 6,1 KoNom : A250x250_N00256L128_01.png
Affichages : 28
Taille : 8,7 KoNom : A250x250_N04096L128_01.png
Affichages : 28
Taille : 5,2 KoNom : A250x250_N65536L128_01.png
Affichages : 27
Taille : 3,9 Ko

Il y a manifestement pour (N) un domaine de valeurs optimales, de l'ordre de quelques centaines à quelques milliers, conduisant à des contours nettement irréguliers et dépourvus de segments rectilignes; par contre un nombre indéfiniment croissant de tirages produit un lissage des frontières, qui représentent à la limite les courbes d'équiprobabilité, pour un triangle quelconque, de contenir un point donné M(x, y).

# Les contours les plus irréguliers s'observant dans la région centrale de l'image, on peut reprendre le tracé en se restreignant au domaine des valeurs les plus élevées [Zmax/2 ; Zmax], par une modification mineure du code:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
     FOR x:= 1 TO La DO
       FOR y:= 1 TO Ha DO BEGIN    
                            z:= 2 * C_[x, y]; Dec(z, Zm);
                            IF (z>0) THEN BEGIN
                                            i:= Trunc(Kc * z);
                                            IF (z<0) THEN i:= 0;
                                            Ma[x, y]:= ListeC[i]
                                          END
                                     ELSE Ma[x, y]:= P000
                          END
Les autres données demeurant inchangées, apparaissent les images suivantes:

Nom : B250x250_N00016L128_02.png
Affichages : 29
Taille : 1,7 KoNom : B250x250_N00256L128_02.png
Affichages : 28
Taille : 5,7 KoNom : B250x250_N04096L128_02.png
Affichages : 30
Taille : 3,8 KoNom : B250x250_N65536L128_02.png
Affichages : 28
Taille : 2,9 Ko

qui montrent, du point de vue de l'irrégularité des contours, une amélioration nette dans le second cas, plus atténuée pour le suivant.

Envoyer le billet « La possibilité d'une île » dans le blog Viadeo Envoyer le billet « La possibilité d'une île » dans le blog Twitter Envoyer le billet « La possibilité d'une île » dans le blog Google Envoyer le billet « La possibilité d'une île » dans le blog Facebook Envoyer le billet « La possibilité d'une île » dans le blog Digg Envoyer le billet « La possibilité d'une île » dans le blog Delicious Envoyer le billet « La possibilité d'une île » dans le blog MySpace Envoyer le billet « La possibilité d'une île » dans le blog Yahoo

Mis à jour 09/05/2017 à 14h06 par wiwaxia

Catégories
Programmation

Commentaires

  1. Avatar de wiwaxia
    • |
    • permalink
    Le logiciel du site, refusant obstinément toute image supplémentaire, m'a contraint de m'interrompre.
    Donc voir le billet suivant La possibilité d'une île (2)
    ... si vous avez tenu le coup jusque là.
    Mis à jour 09/05/2017 à 13h52 par wiwaxia