Page 1 sur 1

Mandelbrot

Message non luPosté: 11 Sep 2020, 00:43
de Maxam
Bonjour,
Un petit portage rapide de la fractale de Mandelbrot depuis la Numworks pour tester
Comme je n'ai pas de Numworks je ne peux pas comparer les perfs.

Edit: J'ai légèrement modifié le code pour un affichage incrémental.

Code: Tout sélectionner
from ti_draw import *
from ti_image import *
from time import *

def mandelbrot(N_iteration):
  clear()
  start=clock()
  bc=0
  screen=new_image(318,212,(0,0,0))
  screen.show_image(0,0)
  for x in range(318):
    for y in range(212):
      z = complex(0,0)
      c = complex(3.5*x/318-2.5, -2.5*y/211+1.25)
      i = 0
      while (i < N_iteration) and abs(z) < 2:
        i = i + 1
        z = z*z+c
      rgb = int(255*i/N_iteration)
      screen.set_pixel(x,y,(int(rgb),int(rgb*0.75),int(rgb*0.25)))
    bc=bc+1
    if bc==20:
      screen.show_image(0,0)
      bc=0
  end=clock()
  screen.show_image(0,0)
  print("elapsed time : {} sec".format(round(end-start)))
mandelbrot(20)

Re: Mandelbrot

Message non luPosté: 11 Sep 2020, 06:42
de Wistaro
Merci du partage :)

Re: Mandelbrot

Message non luPosté: 23 Oct 2020, 14:01
de Arbus33
Bonjour,
Pour éviter que d'autres galèrent aussi :
il semble que les lignes "rgb = ..." et "screen.set..." soient dans la boucle "while", et donc l'indentation doit être celle-ci (alignement avec "i =..." et "z =...") :

....while (i < N_iteration) and abs(z) < 2:
......i = i + 1
......z = z*z+c
......rgb = int(255*i/N_iteration)
......screen.set_pixel(x,y,(int(rgb),int(rgb*0.75),int(rgb*0.25)))

Sinon on a une belle erreur, Python est sévère là dessus.
Et merci pour ce code, le premier Python "graphique" que je fais tourner sur ma TI CX II-T CAS.
Pour info : avec 20 en paramètre ça me donne 153 secondes.
Est-ce que c'est pareil sur les autres machines ? Il me semble avoir vu des vidéos plus rapides...

Re: Mandelbrot

Message non luPosté: 23 Oct 2020, 14:20
de parisse
Il faut environ 1 minute avec l'interpreteur MicroPython de KhiCAS pour l'appel a mandelbrot(20,1,320,222) sur le code ci-dessous. Comme j'exploite la symetrie et que j'ai optimise les boucles, passer de 120s a 150s me parait normal.
Code: Tout sélectionner
from math import *
from kandinsky import *
# Mandelbrot fractal
# Nmax: precision, s: scale
def mandelbrot(Nmax=10,s=2,X=160,Y=111):
  w=2.7/X
  h=-1.87/Y
  Y=Y-1
  for y in range(ceil(Y/2)+1):
    c = complex(-2.1,h*y+0.935)
    for x in range(X):
      z = 0
      for j in range(Nmax):
        z=z**2+c
        if abs(z)>2:
          break
      fill_rect(s*x,s*y,s,s,126*j+2079)
      fill_rect(s*x,s*(Y-y),s,s,126*j+2079)
      c = c+w
    set_pixel()

.