Trace des fractales définies comme L-systèmes.
import kandinsky from math import cos,sin,pi def ligne(p1,p2): global c # algorithme de Bresenham x1,y1=p1 x2,y2=p2 dx=x2-x1 dy=y2-y1 pentu=abs(dy)>abs(dx) if pentu: x1,y1=y1,x1 x2,y2=y2,x2 if x1>x2: x1,x2=x2,x1 y1,y2=y2,y1 dx=x2-x1 dy=y2-y1 erreur=int(dx/2.0) pasy=1 if y1<y2 else -1 y=y1 for x in range(x1,x2+1): coord=(y,x) if pentu else (x,y) kandinsky.set_pixel(int(coord[0]),int(coord[1]),(c,c,c)) erreur-=abs(dy) if erreur<0: y+=pasy erreur+=dx def avance(): global p,l,rad p1=(p[0]+l*cos(rad), p[1]+l*sin(rad)) ligne(p,p1) p=p1 def tourne(angle): global rad rad+=angle*pi/180 def remplace(chaine,regles): return ''.join(regles[caractere] for caractere in chaine) def dessin(position=(160,120),rang=8,longueur=100,radian=0,couleur=0): global p,l,rad,r,c rad=radian r=rang l=longueur p=position c=couleur # Courbe du C # regles={"F":"+F-F+", # "+":"+","-":"-"} # red=0.5**.5 # l*=red**rang # mouvements={"F":"avance()", # "+":"tourne(45)", # "-":"tourne(-90)"} # chaine="F" # Courbe de Peano # regles={"F":"F-F+F+F+F-F-F-F+F", # "+":"+","-":"-"} # red=1/3 # l*=red**rang # mouvements={"F":"avance()", # "+":"tourne(90)", # "-":"tourne(-90)"} # chaine="F" # Courbe de Von Koch # regles={"A":"A+A-A+A", # "+":"+","-":"-"} # red=1/3 # l*=red**rang # chaine="A" # mouvements={"A":"avance()", # "+":"tourne(-60)", # "-":"tourne(120)"} # Courbe de Sierpinski # regles={"A":"B-A-B","-":"-", # "B":"A+B+A","+":"+"} # red=0.5 # l*=red**rang # mouvements={"A":"avance()", # "B":"avance()", # "+":"tourne(60)", # "-":"tourne(-60)"} # chaine="A" # Courbe du dragon regles={"A":"AGB","B":"CGB", "C":"AGD","D":"CGD", "G":"G"} chaine="A" red=0.5**0.5 mouvements={"A":"tourne(-90)", "B":"tourne(-90)", "C":"tourne(90)", "D":"tourne(90)", "G":"avance()"} l*=red**rang for _ in range(rang): chaine=remplace(chaine,regles) for mot in chaine: exec(mouvements[mot])