Fractales en picwins

Soyez le premier à donner votre avis sur cette source.

Vue 4 399 fois - Téléchargée 109 fois

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

A voir également

Ajouter un commentaire

Commentaires

RCA ArKanis
Messages postés
1287
Date d'inscription
mercredi 21 avril 2004
Statut
Membre
Dernière intervention
21 février 2009
-
effectivement, ça fait du bien de voir de telles sources de temps en temps :D
C'est tout de même étrange, il faut que je tape 2x chaque commande pour que ça fonctionne ^^
J'ai testé quelques trucs, il s'avère que le -h et le -a doivent être sur deux commandes séparées. D'abord du -h avec l'ouverture de la fenêtre et ensuite tu l'actives.

tu parles de fractal.ini mais c'est fract.ini
ici : Attention: l'utilisation de cette fonction nécessite d'avoir le fichier "fractal.ini" au même niveau que le remote !

Rien à redire sur le code, tu t'en doutes ;) Il me semble que je l'avais déjà testé y'a quelques années :)
En tout cas, les résultats sont bluffants
cs_PaDa
Messages postés
1804
Date d'inscription
mardi 15 juillet 2003
Statut
Membre
Dernière intervention
22 septembre 2009
1 -
Je corrige les points 1 et 2 tout de suite : j'ai envoyé la mauvaise source, en effet, j'avais constaté sous mIRC 6.31 que "-a0Cpdh" ne convenait pas. Je l'avais remplacé par "-aCpd" partout, ce que je vais refaire immédiatemment. Aucun souci sous mIRC 6.16 en revanche, peut-être que les options ne font pas exactement la même chose ?

Merci pour ce commentaire en tout cas =)
cs_wims
Messages postés
2466
Date d'inscription
vendredi 23 juillet 2004
Statut
Membre
Dernière intervention
1 août 2010
1 -
Le comportement de -h a changer durant les version mais c'est corrigé sur la 6.31 (tu voudrais pas Activer la fenetre et la Hide en même temps =) ?)

Sinon c'est vraiment bien, assez jolie, mais malheuresement très lent

Pour /lya, tu n'aurais pas un lien externe ?
Chapeau bas quand même
cs_PaDa
Messages postés
1804
Date d'inscription
mardi 15 juillet 2003
Statut
Membre
Dernière intervention
22 septembre 2009
1 -
J'avoue que je ne sais même pas pourquoi j'avais mis un "-h" honnêtement... Enfin, c'est corrigé. Et en effet, c'est très lent, mais mIRC n'est pas le seul fautif ! J'y suis pour quelque chose côté VonKoch, kenji a une implémentation bien meilleure que la mienne. Si je me souviens bien, je calcule chaque point en itérant alors que lui utilise une méthode résursive, et ça change tout, sax m'avait fait remarquer ça : http://www.scriptsdb.org/comments.php?id=483

Pour les autres fractales, il y a certainement aussi ce genre de soucis. C'est donc bien uniquement à titre anecdotique ;-)

Pour Lyapounov :
- http://fr.wikipedia.org/wiki/Fractale_de_Lyapunov < les infos courantes
- http://pagesperso-orange.fr/charles.vassallo/fr/lyap_art/images1.html < j'essayais d'arriver à ça
- http://math.cmaisonneuve.qc.ca/alevesque/chaos_fract/Lyapunov/Lyapunov.html < je serais peut-être arrivé au 2e dessin de cette page :/ .. il y a un algo lisible dedans
- http://gjoly.free.fr/fractales/?s=exposant&lang=en-US < une autre page présentant l'algo
VestaX
Messages postés
376
Date d'inscription
mardi 2 décembre 2003
Statut
Membre
Dernière intervention
24 avril 2013
-
whaoo whaoo whaooo, ca fais plaisir de voir que le langage IRC n'est pas encore etteinds. je te félicite, et je ne savais pas que tu étais un cador en picwin Pada :)

C'est vrai que le langage IRC est en voie d'extinction. C'est bien dommafge car c'est un langage facile et assez puissant, même si ca plante souvent lors des requetes assez lourdes.

10/10

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.