Fractales en picwins

Description

Disclaimer:
      • Ce code est donné à titre anecdotique : mIRC ne fournit pas les perfs obligatoires pour faire des fractales plus évoluées, mais bon, ça détend entre deux scanners de clones non ? ***


J'ai retrouvé les fractales suivantes dans un vieux script, j'avais posté des screenshots sur sdb, mais je me rends compte que je n'avais laissé les sources nulle part. Donc je corrige l'erreur, avec le screenshot fait à l'époque (qui est de très piètre qualité, merci le jpg obligatoire..) :-)

Comme souvent, je me soustrais un peu au jeu mais je ne poste pas ça pour avoir des critiques sur mon code'style, pour plusieurs raisons :
- je m'en fous un peu des avis des uns et des autres sur mon niveau en mirc, sans méchanceté,
- ces sources ont plus de 2 ans et que je ne les ai pas du tout retravaillées, elles ne reflètent donc pas ce que je coderais aujourd'hui,

Tapez /fractal une fois loadé !

Source / Exemple :


Alias fractal {
  e 0 1
  e 5 0 Ces aliases montrent des exemples de construction de fractales en picwins
  e 5 0 Pada - pada.irc@gmail.com - 2008
  e 5 3 * /vonkoch : Flocon de Von Koch. Plus d'infos : http://fr.wikipedia.org/wiki/Flocon_de_Koch
  e 5 3 * /fougere [nombre_d_iterations] : Fougère de Barnsley. Plus d'infos : 
  e 5 3 * /sierp [nombre_d_iterations] : Triangle de Sierpinski. Plus d'infos : http://fr.wikipedia.org/wiki/Triangle_de_Sierpinski
  e 5 3 * /ifs [motif] [nombre_d_iterations] : Iterated Function System, généralisation des deux exemples précédents. Plus d'infos : http://en.wikipedia.org/wiki/Iterated_function_system
  e 5 7 Motifs acceptés: spirale fougere dragon sierpinski arbre. Par défaut: dragon
  e 5 7 Attention: l'utilisation de cette fonction nécessite d'avoir le fichier "fract.ini" au même niveau que le remote !
  e 0 1 
}
Alias -l e echo $$1 -a $str($chr(160),$$2) $3-

;#############

Alias vonkoch {
  if $hget(Fractal) { hfree fractal }
  hmake fractal 100
  hadd fractal itr 0
  hadd fractal 0 100 400
  hadd fractal 1 500 400
  hadd fractal 2 300 $calc(400 - $sqrt(3) * 200)
  hadd fractal 3 100 400
  window -aCpd @VonKoch -1 -1 600 600
  vonkoch2
}
Alias -l vonkoch2 {
  clear @VonKoch
  drawfill -c @VonKoch 1 1 1 1
  if ($hget(fractal,itr) >= 6) { vonkoch | halt }
  hinc fractal itr 
  ;#"espacement" de chaque ancien point
  var %i $calc(3 * 4 ^ $hget(fractal,itr))
  while (%i >= 0) {
    hadd fractal $calc(%i) $hget(fractal,$calc(%i / 4))
    dec %i 4
  }
  ;#calcul des nouveaux points
  %i = 0 
  while (%i < $calc(3 * 4 ^ $hget(fractal,itr))) {
    tokenize 32 $hget(fractal,%i) $hget(fractal,$calc(%i + 4))
    var %dx $calc($3 - $1) , %dy $calc($4 - $2)
    hadd fractal $calc(%i + 1) $calc($1 + %dx * 1 / 3) $calc($2 + %dy * 1 / 3)
    hadd fractal $calc(%i + 3) $calc($1 + %dx * 2 / 3) $calc($2 + %dy * 2 / 3)
    tokenize 32 $hget(fractal,$calc(%i + 1)) $hget(fractal,$calc(%i + 3))
    tokenize 32 $calc(($3 - $1) / 2) $calc(($4 - $2) / 2)
    hadd fractal $calc(%i + 2) $calc($gettok($hget(fractal,$calc(%i + 1)),1,32) + $1 - $2 * $sqrt(3)) $calc($gettok($hget(fractal,$calc(%i + 1)),2,32) + $2 + $1 * $sqrt(3))
    var %imax = $calc(%i + 4)
    while (%i < %imax) {
      tokenize 32 $hget(fractal,%i) $hget(fractal,$calc(%i + 1))
      drawline @VonKoch 7 2 $1 $2 $3 $4
      inc %i
    }
  }
  drawtext -bp @VonKoch 15 1 Tahoma 12 420 10 Itération $+ $iif($hget(fractal,itr) > 1,s) $+  : $hget(fractal,itr)
  drawtext -bp @VonKoch 15 1 Tahoma 12 420 30 Points [3*4^N] : $calc($hget(fractal,0).item - 2)
  drawtext -bp @VonKoch 15 1 Tahoma 12 10 10 Cliquez pour obtenir l'itération $iif($hget(fractal,itr) >= 6,0,$calc($hget(fractal,itr) + 1)) 
}
Menu @VonKoch { 
  sclick:vonkoch2
}

;#############

; Fougère de Barnsley
; Coordonnées tirées de http://www.futura-sciences.com/comprendre/d/dossier234-6.php

Alias fougere {
  window -aCpd @Foug -1 -1 400 600
  drawfill @Foug 1 1 1 1
  var %n $iif($1,$1,15000),%k 1,%x 50,%y 0 
  while (%k <= %n) {
    var %r = $rand(0,1000)
    if (%r <= 10) { %x = 0 | %y = $calc(0.16 * %y) }
    elseif (%r <= 860) { %x = $calc(0.85 * %x + 0.04 * %y) | %y = $calc(- 0.04 * %x + 0.85 * %y + 1.6) }
    elseif (%r <= 930) { %x = $calc(0.2 * %x - 0.26 * %y) | %y = $calc(0.23 *%x + 0.22 * %y + 1.6) }
    else { %x = $calc(- 0.15 * %x + 0.28 * %y) | %y = $calc(0.26 * %x + 0.24 * %y + 0.44) }
    drawdot @Foug 3 1 $calc(200 - 60 * %x) $calc(600 - 60 * %y)
    inc %k
  }
}

;#############

; Triangle de Sierpinski

Alias sierp {
  window -aCpd @Sierpinski -1 -1 450 390
  drawfill @Sierpinski 1 1 1 1
  var %n $iif($1,$1,15000),%k 1,%x 0,%y 0 
  while (%k <= %n) {
    var %r = $rand(0,1000)
    if (%r <= 333) { %x = $calc(0.5 * %x) | %y = $calc(0.5 * %y) }
    elseif (%r <= 666) { %x = $calc(0.5 * %x + 1) | %y = $calc(0.5 * %y) }
    else { %x = $calc(0.5 * %x + 0.5) | %y = $calc(0.5 * %y + 0.8660254) }
    drawdot @Sierpinski 12 1 $calc(400 - 180 * %x) $calc(350 - 200 * %y)
    inc %k
  }
}

;############# 

; Iterated Function System généralisées

Alias IFS {
  if (!$exists($scriptdirfract.ini)) { echo -a Placez "fract.ini" au même niveau que le remote ! | halt }
  var %b $ticks,%m = $iif($1,$1,dragon),%n = $iif($2,$2,$readini($scriptdirfract.ini,Main,N))
  tokenize 32 $readini($scriptdirfract.ini,%m,z)
  if (!%n) { echo -a Erreur: impossible de déterminer la précision : votre fichier fract.ini est il valide ? | halt }
  var %k 1,%c $1,%x $2,%y $3,%x0 $4,%x1 $5,%y0 $6,%y1 $7,%r
  if ($window(@IFS)) { close -@ @IFS }
  window -aCpd @IFS -1 -1 $8 $9
  drawfill @IFS 1 1 1 1
  while (%k <= %n) {
    %r = $rand(0,1000)
    tokenize 32 $readini($scriptdirfract.ini,%m,1) $readini($scriptdirfract.ini,%m,2) $readini($scriptdirfract.ini,%m,3) $readini($scriptdirfract.ini,%m,4)
    if (%r <= $7) { %x = $calc($1 * %x + $2 * %y + $5) | %y = $calc($3 * %x + $4 * %y + $6) }
    elseif (%r <= $14) { %x = $calc($8 * %x + $9 * %y + $12) | %y = $calc($10 * %x + $11 * %y + $13) }
    elseif (%r <= $21) { %x = $calc($15 * %x + $16 * %y + $19) | %y = $calc($17 * %x + $18 * %y + $20) }
    elseif (%r <= $28) { %x = $calc($22 * %x + $23 * %y + $26) | %y = $calc($24 * %x + $25 * %y + $27) }
    drawdot @IFS %c 1 $calc(%x0 - %x1 * %x) $calc(%y0 - %y1 * %y)
    inc %k
  }
  ; echo -ta > $calc(1000 * ($ticks - %b)) s
}
Menu @IFS {
  ;sclick:echo -s > $mouse.x $mouse.y
  Spirale:IFS spirale $readini($scriptdirfract.ini,Main,N)
  Fougere:IFS fougere $readini($scriptdirfract.ini,Main,N) 
  Dragon:IFS dragon $readini($scriptdirfract.ini,Main,N)
  Sierpenski:IFS sierpinski $readini($scriptdirfract.ini,Main,N)
  Arbre:IFS arbre $readini($scriptdirfract.ini,Main,N)
  -
  Changer la précision:writeini $scriptdirfract.ini Main N $$?="Points ? (défaut 4000)"
}

;#############

; Exposant de Lyapounov
; ATTENTION: NE FONCTIONNE PAS
; Les valeurs à donner sont du genre 50 50 (taille de fenêtre désirée), mais ça fait freezer mIRC *très longtemps*, et pas de résultat OK
; Si vous arrivez à le faire marcher, n'hésitez pas à me dire, j'ai la flemme de regarder !

Alias lya {
  window -aCpd @Lya -1 -1 $1 $$2
  clear -@ @Lya
  var %ix 1,%iy 1,%r
  while (%ix <= $1) {
    Lya2 %ix $2
    inc %ix
  }
}
Alias -l lya2 { var %iy 1 | while (%iy <= $$2) { drawdot -r @Lya $lya3($1,%iy,400) 1 $calc(200 - $1) $calc(200 - %iy) | inc %iy } }
Alias -l lya3 {
  var %k1 $calc(3 + $1 / 200),%k2 $calc(3 + $2 / 200),%n $$3,%i 1,%r 0 , %x 0.5,%m
  while %i <= %n {
    %m = $mid(1122,$calc($calc(%i % 4) + 1),1)
    %k = $eval($+(%,k,%m),2)
    %x = $lyautil(%x,%k)
    %r = $calc(%r + $log($abs(%k * (1 - 2 * %x))) / $log(2))
    inc %i
  }
  %r = $calc(%r / %n * 100)
  %r = $calc((%r - 158) * 20)
  ;echo -a R %r
  ;if (%r <= %min) { set %min %r }
  ; if (%r >= %max) { set %max %r }
  return $rgb(%R,%R,%R)
}
Alias -l lyautil { return $calc($2 * $1 * (1 - $1) ) }

Conclusion :


/fractal pour l'aide.

Attention:
- l'alias "/ifs" nécessite le fichier fract.ini pour fonctionner, donc pour l'utiliser vous devrez télécharger le .zip. La source se suffit à elle même pour les autres cas...
- l'alias /lya ne fonctionne pas, mais il y a de l'idée (enfin je suppose, ça remonte loin), donc pour les plus acharnés..
- testé sur mIRC 6.16 et 6.31, pas de garantie sur les vieilles versions..

Codes Sources

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.