global_settings { max_trace_level 15 } // Paramètres d'ajustement #declare Taille = <20,20,20>; #declare Nombre = 2; //nombre de tuyaux #declare Proba = 0.7; //probabilité d'aller tout droit #declare Essais = 6; //essais de recherche de direction #declare RN= seed(23); // Constantes et déclaration #declare Transposition = array[6][6] {// direction départ, direction arrivée => forme d'objet {0,0,4,3,6,5}, {0,0,8,7,10,9}, {7,3,1,1,12,11}, {8,4,1,1,14,13}, {9,6,13,11,2,2}, {10,6,14,12,2,2} } #declare Table = array[Taille.x][Taille.y][Taille.z] #declare xx=0; #while (xx=Taille.x) #declare result = false; #end #if (yy>=Taille.y) #declare result = false; #end #if (zz>=Taille.z) #declare result = false; #end #if (result = true)// sidans le tableau #if (Table[xx][yy][zz]<99) #declare result = false; #end #end result #end #macro Nouveaupoint (coord, dir) // sort la coordonnée du nouveau point #local xx=coord.x; #local yy=coord.y; #local zz=coord.z; #switch (dir) #case (0) #local xx=xx+1; #break #case (1) #local xx=xx-1; #break #case (2) #local yy=yy+1; #break #case (3) #local yy=yy-1; #break #case (4) #local zz=zz+1; #break #case (5) #local zz=zz-1; #break #else #end //retourne le vecteur #end #macro Randint (A) //retourne un entier inférieur à A int(rand(RN)*A) #end // Generation #declare Tuyau = 0; #while (Tuyau < Nombre) //génération d'1 tuyau //point de départ #declare essai=0; // 100 essais pour trouver un point de départ #declare okay=false; #while ((essai<100) * (okay=false)) #declare Dir = Randint(6); #switch (Dir) //selon la face #case(0) #declare Loc= <0,Randint(Taille.y),Randint(Taille.z)>; #break #case(1) #declare Loc= ; #break #case(2) #declare Loc = ; #break #case(3) #declare Loc = ; #break #case(4) #declare Loc = ; #break #case(5) #declare Loc = ; #break #else #end #declare essai=essai+1; #if ((Libre(Loc) = true) * (Libre(Nouveaupoint(Loc,Dir)) = true)) //trouvé un point valable #declare okay = true; #declare Table[Loc.x][Loc.y][Loc.z]=int(Dir/2); //0->5 => 0->2 #end #end #if (okay = true)// On a le départ maintenant faut construire #while (okay = true) // tant qu'on est pas coincé #if ((Libre(Nouveaupoint(Loc,Dir)) = true) * (rand(RN) look_at <9,9,9>} light_source {<14.9,15,-30> color rgb <0.7,0.7,0.3>} light_source{<15.1,15,-30> color rgb <0.3,0.3,0.7>} //textures #declare M_tuyau=material { texture { pigment {rgb <0.9,0.9,0.9>} finish { metallic reflection {0.2,0.4 fresnel} //conserve_energy //phong 0.2 } normal {bumps 0.1 scale 0.05} } interior {ior 1.2} } // objets #declare Tube = cylinder { //tube selon X <-0.51,0,0>,<0.51,0,0>,0.25 material {M_tuyau} } #declare Coude = merge { // Coude -X,-Y cylinder {<-0.51,0,0>,<-0.29,0,0>,0.25} cylinder {<0,-0.29,0>,<0,-0.51,0>,0.25} intersection { torus{ 0.3,0.25 rotate 90*x} box{<0,0,-0.8>,<0.6,0.6,0.8>} translate <-0.3,-0.3,0> } material {M_tuyau} } #macro Objet(N) #switch (N) #case(0) // X object{Tube} #break #case(1) // y object{Tube rotate 90*z} #break #case(2) // z object{Tube rotate 90*y} #break #case(3) //-X=>-y object{Coude} #break #case(4) //-X=>y object{Coude scale <1,-1,1>} #break #case(5) //-X=>-Z object{Coude matrix <1,0,0,0,0,1,0,1,0,0,0,0> } #break #case(6) //-X=>Z object{Coude matrix <1,0,0,0,0,-1,0,-1,0,0,0,0> } #break #case(7) //X=>-Y object {Coude scale <-1,1,1>} #break #case(8) //X=>Y object {Coude scale -1} #break #case(9) //X=>-Z object {Coude matrix <-1,0,0,0,0,1,0,1,0,0,0,0> } #break #case(10) //X=>Z object {Coude matrix <-1,0,0,0,0,-1,0,-1,0,0,0,0>} #break #case(11) //-Y=>-Z object {Coude matrix <0,0,1,0,1,0,1,0,0,0,0,0>} #break #case(12) //-Y=>Z object {Coude matrix <0,0,-1,0,1,0,-1,0,0,0,0,0>} #break #case(13) //y=>-Z object {Coude matrix <0,0,1,0,-1,0,1,0,0,0,0,0>} #break #case(14) //y=>z object {Coude matrix <0,0,-1,0,-1,0,-1,0,0,0,0,0>} #break #end #end //dessin #declare xx=0; #while (xx} // CAS SPECIAUX EN DESSOUS #end //fin de l'objet #declare zz=zz+1; #end #declare yy=yy+1; #end #declare xx=xx+1; #end