Dragons et autres courbes
Ces mêmes fractales ont été tracées avec PovRay :
Aller voir "courbe du C"
Aller voir "dragon"
I. Construction de courbes diverses
a. Dragons classique et moins classiques
>
with(plots):
Reverse:=proc(liste) local n: n:=nops(liste): [seq(liste[n-i+1],i=1..n)] end:
dragon:= proc(R1,C1,R2,C2,n) # [R,G,B] en 6 ieme argument possible...
local k,liste,r1,c1,r2,c2,long,dep,uu, coul1;
if nargs<6 then coul1:=1,0,0 :
else coul1:=op(args[6]) fi;
dep:=evalf(exp(I*Pi*(n+4)/4)):
r1:=evalf(R1): c1:=evalf(C1*dep):r2:=evalf(R2):c2:=evalf(C2):
liste:=[0,dep]:
for k to n do
long:=nops(liste):
uu:=liste[long]:
liste:=[op(map(x->r1*x+c1,liste)),
seq(uu+r2*(liste[long-j+1]-uu)+c2,j=1..long)]
od:
liste:=map(x->[Re(x),Im(x)],liste):
PLOT(CURVES(liste),AXESSTYLE(NONE),SCALING(UNCONSTRAINED),COLOR(RGB,coul1));
end:
dragon_bis:= proc(R1,C1,R2,C2,n) # [R,G,B] en 6 ieme argument possible...
local k,liste,r1,c1,r2,c2,long,dep,uu, coul1;
if nargs<6 then coul1:=1,0,0 :
else coul1:=op(args[6]) fi;
dep:=evalf(exp(I*Pi*(n+4)/4)):
r1:=evalf(R1): c1:=evalf(C1*dep):r2:=evalf(R2):c2:=evalf(C2):
liste:=[0,dep]:
for k to n do
long:=nops(liste):
uu:=liste[long]:
liste:=[op(map(x->r1*x+c1,liste)),
seq(uu+r2*(liste[j]-uu)+c2,j=1..long)]
od:
liste:=map(x->[Re(x),Im(x)],liste):
PLOT(CURVES(liste),AXESSTYLE(NONE),SCALING(CONSTRAINED),COLOR(RGB,coul1));
end:
Dragon classique
dragon(1,0,I,0,11);
dragon(1,0,I,0.5,10,[0,0,1]);#tt:=time():time()-tt;
Dragon moins classique
> dragon(1,1,I,0,10);
dragon feu et flammes
> display([dragon(1,exp(I*Pi/3),I,0,10,[1,0.4,0])],thickness=2);#,pointplot([[0,0],[1,0]],symbol=BOX)
Dragon qui ne se recoupe pas
display(dragon(1,I*0.8,I,0,10,[0,0,1]),thickness=2) ;
#dragon(1,2*I,I,0,10,[0.8,0.6,0]);
#la courbe du C ou courbe de Lévy
> dragon_bis(exp(I*Pi/4)/sqrt(2),0,exp(-I*Pi/4)/sqrt(2),0,12);
#la courbe du E
> dragon_bis(exp(I*Pi/3)/sqrt(2),0,exp(I*Pi*5/3)/sqrt(2),0,14);
Début  b. Autres courbes
>
with(plots):# à mettre si non chargé dans Maple.ini
fractale:= proc(R1,C1,R2,C2,n)
local k,liste,r1,c1,r2,c2,long;
r1:=evalf(R1): c1:=evalf(C1):r2:=evalf(R2):c2:=evalf(C2):
liste:=[0,1]:
for k to n do
long:=nops(liste):
liste:=[op(map(x->r1*x+c1,liste)),op(map(x->r2*x+c2,liste))]
od:
liste:=map(x->[Re(x),Im(x)],liste):
PLOT(CURVES(liste),COLOR(RGB,0.9,0.6,0.2),AXESSTYLE(NONE),SCALING(CONSTRAINED));
end:
#la même mais tracé des points dans un ordre différent
fractale_bis:= proc(R1,C1,R2,C2,n,couleur)
local k,liste,r1,c1,r2,c2,long, coul ;
if nargs()=6 then coul:=op(couleur) else coul:=0.9,0.6,0.2; fi;
r1:=evalf(R1): c1:=evalf(C1):r2:=evalf(R2):c2:=evalf(C2):
liste:=[0,1]:
for k to n do
long:=nops(liste):
liste:=[op(map(x->r1*x+c1,liste)),seq(r2*liste[long+1-j]+c2,j=1..long)]
od:
liste:=map(x->[Re(x),Im(x)],liste):
PLOT(CURVES(liste),COLOR(RGB,coul),AXESSTYLE(NONE),SCALING(CONSTRAINED));
end:
# Dragon Goff
> fractale((1-I)/2,(1+I)/4,(-1+I)/2,1,10);
# Dragon Goff 2
> fractale((1-I)/2,0,(1-I)/2,I,10);
# Un autre dragon
> fractale_bis((1+I)/2,0,(I-1)/2,-3,11);
# Courbe du C (approximative)
> fractale(exp(I*Pi/4)/sqrt(2),0,exp(-I*Pi/4)/sqrt(2),1+I,12);
> fractale_bis(exp(I*Pi/4)/sqrt(2),0,exp(-I*Pi/4)/sqrt(2),1+I,12); # traits parasites
# Courbes du E (approximative)
> #fractale(exp(2*I*Pi/5)/sqrt(2),0,exp(-2*I*Pi/5)/sqrt(2),exp(I*Pi/100*73),12);
> fractale(exp(I*Pi/3)/sqrt(2),0,exp(I*Pi*5/3)/sqrt(2),exp(I*Pi/100*74),14);
# Cumulus ou BOUM !
> fractale((1+I)/2,0,exp(5*I*Pi/3)/sqrt(2),1+I,11);
> fractale_bis((1+I)/2,0,exp(5*I*Pi/3)/sqrt(2),1+I,11);
# ( Le cheval ou ) Maman caniche portant son petit
>
fractale_bis(exp(I*Pi/3)/sqrt(2),0.08*I,
-exp(I*Pi*5/3)/sqrt(2),exp(31*I*Pi/32),14,[0,0,0]);
# Courbe du crabe
> fractale(exp(I*Pi/6)/sqrt(2),0,exp(-I*Pi/6)/sqrt(2),exp(I*Pi*7/30),13);
> fractale_bis(exp(I*Pi/6)/sqrt(2),0,exp(-I*Pi/6)/sqrt(2),1+I,10);
# Fumée
> fractale(exp(I*Pi/10)/sqrt(2),0,exp(-I*Pi/10*3)*0.67,1+20*I,11);
> fractale_bis(exp(I*Pi/10)/sqrt(2),0,exp(-I*Pi/10*3)*0.67,1+20*I,11);
# Perruque
> fractale(exp(1*I*Pi/8)/sqrt(2),0,exp(-3*I*Pi/8)/sqrt(2),10,11);
> fractale_bis(exp(1*I*Pi/8)/sqrt(2),0,exp(-3*I*Pi/8)/sqrt(2),10,11);
Début  II. Construction décomposée des courbes
>
restart:
with(plots):# à mettre si non chargé dans Maple.ini
fractale:= proc(R1,C1,R2,C2,n)
global F1,F2 :
local k,liste,r1,c1,r2,c2,long,tamp,dep;
r1:=evalf(R1): c1:=evalf(C1):r2:=evalf(R2):c2:=evalf(C2):
dep:=evalf(exp(I*Pi*(n+3)/4)):
liste:=[0,dep]:
for k to n do
long:=nops(liste):
tamp:=r2*liste[long]+c2;
liste:=[seq(r2*liste[long-j+1]+c2-tamp,j=1..long),op(map(x->r1*x+c1-tamp,liste))]
od:
liste:=map(x->[Re(x),Im(x)],liste):
display([seq(
display([ PLOT(CURVES([liste[1],liste[2]]),COLOR(RGB,0,0,0) ),seq(
PLOT(CURVES([seq(liste[j],j=2^w+1..2^(w+1))]),COLOR(HUE,w/n) ), w=0..k)]),
k=1..n-1)],insequence=true,axes=none,scaling=constrained);
end:
fractale_bis:= proc(R1,C1,R2,C2,n)
local k,i,liste,r1,c1,r2,c2,long,dep;
r1:=evalf(R1): c1:=evalf(C1):r2:=evalf(R2):c2:=evalf(C2):
dep:=evalf(exp(I*Pi*(n+3)/4)):
liste:=[0,dep]:
for k to n do
liste:=[op(map(x->r1*x+c1,liste)),op(map(x->r2*x+c2,liste))]:
od:
liste:=map(x->[Re(x),Im(x)],liste):
display([seq(
display([ PLOT(CURVES([liste[1],liste[2]]),COLOR(RGB,0,0,0) ),seq(
PLOT(CURVES([seq(liste[j],j=2^w+1..2^(w+1))]),COLOR(HUE,w/n) ), w=0..k)]),
k=1..n-1)],insequence=true,axes=none,scaling=constrained);
end:
fractale_ter:= proc(R1,C1,R2,C2,n)
local k,i,liste,r1,c1,r2,c2,long,uu,dep;
r1:=evalf(R1): c1:=evalf(C1*dep):r2:=evalf(R2):c2:=evalf(C2):
dep:=evalf(exp(I*Pi*(n-1)/4)):
liste:=[0,dep]:
for k to n do
long:=nops(liste):
uu:=liste[long]:
liste:=[op(map(x->r1*x+c1,liste)),
seq(uu+r2*(liste[j]-uu)+c2,j=1..long)]
od: liste:=map(x->[Re(x),Im(x)],liste):
display([seq(
display([ PLOT(CURVES([liste[1],liste[2]]),COLOR(RGB,0,0,0) ),seq(
PLOT(CURVES([seq(liste[j],j=2^w+1..2^(w+1))]),COLOR(HUE,w/n) ), w=0..k)]),
k=1..n-1)],insequence=true,axes=none,scaling=constrained);
end:
#dragon classique
> fractale((1-I)/2,0,(1+I)/2,0,12);
# Courbe du C
> fractale_ter((1-I)/2,0,(1+I)/2,0,14);
# un autre dragon déroulé par un bout
> fractale_bis((1+I)/2,I,(I-1)/2,6*exp(17*I*Pi/24),12);
# Cumulus ou BOUM !
> fractale_bis((1+I)/2,0,exp(5*I*Pi/3)/sqrt(2),1,12);
# Maman Caniche portant son petit
> fractale_bis(exp(I*Pi/3)/sqrt(2),0.08*I,-exp(I*Pi*5/3)/sqrt(2),exp(21*I*Pi/32),12);
# Fumée
fractale_bis(exp(I*Pi/10)/sqrt(2),2,exp(-I*Pi/10*3)*0.67,1+15*I,12);
# Perruque
> fractale_bis(exp(1*I*Pi/8)/sqrt(2),0,exp(-3*I*Pi/8)/sqrt(2),1,11);