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 |
1 2 3 | TYPE Tab_LInt = ARRAY[1..Dim_Max, 1..Dim_Max] OF LongInt; VAR Carte: Tab_LInt; |
Code : | Sélectionner tout |
1 2 3 | FOR x:= 1 TO Larg_Image DO FOR y:= 1 TO Haut_Image DO Carte[x, y]:= 0; |
Code : | Sélectionner tout |
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); |
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 |
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); |
N1 = 16 , N2 = 256 , N3 = 4096 et N4 = 65536:
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 |
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 |
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.