Voir les versions texte avec indentation :
 
Dragon récursif
  Dragons non récursifs

Courbe du Dragon






Ces courbes ont été aussi construites avec Maple :
Aller voir

I. Dragon par récursivité

Tracé de quelques itérés


dragon(3)

dragon(4)

dragon(5)

dragon(6)

dragon(84)

dragon(14)




/* Courbe du Dragon */


#include "colors.inc"
#include "metals.inc"

#declare r=0.2 ;

camera { location <-0.3,0,-1.2> look_at<-0.52,-0.1,0>}
light_source { <-3,3,-5> color rgb<0.8,0.8,1>*0.8 }
light_source { <2,3,-3> color White}

background { rgb <0.9,0.95,0.95>}

#macro dragon(n)
#if(n=1) union {
cylinder { <0,0,0>,<1,0,0>,r}
sphere { <0,0,0>,r}
sphere { <1,0,0>,r}
}
#else union { object { dragon(n-1) }

object { dragon(n-1)
rotate <0,0,-90> }

translate < cos((n)*pi/4),sin((n)*pi/4),0>
scale 1/sqrt(2)
}
#end
#end


#declare n=6; // NBRE ITERATIONS

object { dragon(n)
texture{
T_Copper_3B
}
rotate <0,0,-(n+3)*45> // pour le mettre sur "ses pattes"(??)
finish {ambient 0.5 diffuse 0.6 specular 0.81 roughness 0.001}
}

Début  
II. Dragon sans récursivité

Tracé de deux "dragons" non classiques


dragon-feu (11)

dragon-feu (14)

dragon simple(8)

dragon simple(12)



#include "colors.inc"
#include "metals.inc"

//-------------- n ITERATIONS---------------


camera { location <-0.5,-0,-2> look_at<-0.5,-0.2,0>}
light_source { <-3,3,-100> color White }
light_source { <2,3,-50> color Yellow}

background { rgb<1,0.95,0.85>*1 } //<0.,0.5,0.95>*1.0

//---------------- macros -------------------
#macro sim(a,b,e,f,g) // pour similitude appliquée à

#end

//----------- MACRO DRAGON------------------------
#macro dragon(s1x,s1y,s2x,s2y,transx,transy,n)

#local tab = array [pow(2,n)] ;
#declare tab[0]=<0,0,0>;
#declare tab[1]=<1,0,0>;
#local trx=transx;
#local try=transy;
#local be=1;

#while(be #declare centre= tab[pow(2,be)-1];
#declare LL=vlength(tab[pow(2,be)-1]-tab[0]); // on ramène ainsi le diamètre à environ 2
#declare bi=0; // donc caméra, lumières fixes pour tout n
#while (bi #declare temp=tab[bi]-centre;
// similitude s2 puis translation trans2 à la branche d'ordre be
#declare tab[pow(2,be+1)-bi-1]=(centre +sim(s2x,s2y,temp.x,temp.y,temp.z))/LL;//
#declare bi=bi+1;
#end // fin boucle (2)

#declare bi=0;
#while (bi // similitude s1 à la branche d'ordre be
#declare temp=tab[bi];
#declare tab[bi]=(sim(s1x,s1y,temp.x,temp.y,temp.z)+)/LL;//
#declare bi=bi+1;
#end
#declare trx=trx/LL;
#declare try=try/LL; // fin boucle (3)
#declare be=be+1;
#end
//-------------------------------------------

#local r=0.25/pow(1.4,n) ;
#declare cp=0;
union {
#while(cp #if ( vlength(tab[cp]-tab[cp+1])!= 0 )
sphere {tab[cp] ,r}
cylinder { tab[cp],tab[cp+1] ,r}
#end
#declare cp=cp+1;
#end
sphere {tab[pow(2,n)-1] ,r}
texture {T_Copper_3B}
}

//sphere {0 ,r*1.01 pigment {Red} }

#end // macro DRAGON

//--------------INITIALISATIONS---------------


// dragon classique
#declare n=10;
object{ dragon(1, 0, 0, 1,0,0,10) rotate <0,0,(n+3)*45>
}

/* */
/* // dragon enflammé !
#declare n=10;
object{ dragon(1, 0, 0, 1,cos(pi/4),sin(pi/4),n)
rotate <0,0,(n-4)*45-22>
translate <0.1,0.,0>
finish{ ambient 0.6}
}
*/

/* dragon sans points multiples
#declare n=12;
object{ dragon(1, 0, 0, 1,0,0.8,n)
rotate <0,0,(n+3)*45>
translate <0.1,0.,0>
scale 1
}



Début