Bonjour,
J'ai commencé aujourd'hui un code python pour dessiner des fractales, en me basant sur les ensembles de Julia. Même conceptuellement, il peut y avoir des erreurs. Pour l'instant je refuse de regarder les codes dispos en ligne pour me forcer à réfléchir un peu plus.
Il me reste de bien nombreuses choses à faire, mais pour l'instant, je voulais voir le résultat en utilisant simplement $z^2-1=0$. Du coup, je l'ai tracé sur un million de pixels. J'ai décidé de calculer jusqu'au 8ème terme de la série. Donc ça fait quand même beaucoup de calculs, mais ça reste raisonnable. C'est un nombre que je peux évidemment réduire, mais j'aimerais déjà accelerer le code sans toucher à ce paramètres, si possible.
Je vous joins le code ci-après. Il n'est pas très long et devrait être assez facile à comprendre.
J'ai bien quelques idées, comme le fait que je reprogramme les opérations complexes au lieu d'utiliser une librairie toute faite. Je pourrais aussi choisir de colorer le pixel directement, au lieu de colorer un carré d'un pixel de coté, mais le faire comme ça me permet de faire des tests avec bien moins de points. J'ai aussi quelques importations inutiles.
En gros, est-ce que je fais quelque chose qui ralentit fortement l'execution du code, ou est-ce que c'est seulement dû au sujet ? Je rajoueterai aussi que mes connaissances en Python sont extrêmement limitées, mais j'essaierai de comprendre vos réponses.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 | import sys, math, random, os from graphics import * #Parameters #Complex numbers tested Xmin=-2 Xmax=+2 Ymin=-1 Ymax=+1 Xsampling=1000 Ysampling=1000 #Image ImageWidth=1000 ImageHeight=1000 Convmin=0.01 Convmax=1.5 Repetitions=8 #Enter it as C0+C1X+C2X2+... Equation=[-1,0,1] #Not yet used Color1=[255,0,0] Color2=[130,0,130] #Variables Xrec=ImageWidth/(2*Xsampling*1.0) Yrec=ImageHeight/(2*Ysampling*1.0) #Define complex mathematics def ComplexAddition(nb1,nb2): return [nb1[0]+nb2[0],nb1[1]+nb2[1]] def ComplexMultiplication(nb1,nb2): return [nb1[0]*nb2[0]-nb1[1]*nb2[1],nb1[0]*nb2[1]+nb1[1]*nb2[0]] def ComplexNorm(nb): return math.sqrt(nb[0]*nb[0]+nb[1]*nb[1]) def ComplexPower(nb,power): if power==0: return [1,0] else: if power==1: return nb else: return ComplexMultiplication(nb,ComplexPower(nb,power-1)) def ComplexEquation(eq,nb): order=0 result=[0,0] for coeff in eq: result=ComplexAddition(result,ComplexMultiplication([coeff,0],ComplexPower(nb,order))) order=order+1 return result def ComplexEquationIteration(eq,nb,Repetitions): if Repetitions==0: return nb else: return ComplexEquationIteration(eq,ComplexEquation(eq,nb),Repetitions-1) #Operations on the graphics def GetPointCoordinates(nb): x=(nb[0]-Xmin)/(Xmax-Xmin*1.0)*ImageWidth y=(nb[1]-Ymin)/(Ymax-Ymin*1.0)*ImageHeight return [x,y] def ColorAroundPoint(nb,color): nb2=GetPointCoordinates(nb) r=Rectangle(Point(nb2[0]-Xrec,nb2[1]-Yrec),Point(nb2[0]+Xrec,nb2[1]+Yrec)) r.setFill(color) r.setOutline(color) r.draw(fig) def Color(nb): if ComplexNorm(ComplexEquationIteration(Equation,nb,Repetitions)) < Convmax: return 'blue' else: return 'black' # Main part of the program fig = GraphWin("My Fractal", ImageWidth, ImageHeight) for x in range(Xsampling+1): for y in range(Ysampling+1): X=Xmin+x/(Xsampling*1.0)*(Xmax-Xmin) Y=Ymin+y/(Ysampling*1.0)*(Ymax-Ymin) ColorAroundPoint([X,Y],Color([X,Y])) fig.getMouse() # pause for click in window fig.close() |
Merci !