/* Programme 1 : bouteille de Klein reconstituée artificiellement */ #include "glass.inc" #include "colors.inc" #include "metals.inc" //Lights, camera, action camera { orthographic location < 0,1,-4.2> look_at < 0,-1.2, 0> } light_source { <-2, 3,-8> color rgb 1 shadowless } light_source { <5, 3, -8> color rgb 1 shadowless } // ---------------------------------------- plane { z,4 pigment { gradient y color_map { [0.01 Blue] [0.9 SkyBlue] } } scale 5.5*y translate <0,-0.34,0> } #declare co1=0.15; #declare co2=0.5; // -------- demi cercle ----------------- #macro xx1(uu) cos(uu) #end #macro yy1(uu) sin(uu) #end #macro zz1(uu) 0 #end #macro courbe1(n,deb,fin) #local pas=(fin-deb)/n; #local uu = deb; #while (uu<=fin) #local vv=uu+pas; cylinder{ ,,(1+cos(uu)*co1)*co2, 0.01} #local uu=vv; #end //fin boucle #end //macro // -------- cos ----------------- #macro xx2(uu) cos(uu) #end #macro yy2(uu) uu-pi-0.1 #end #macro zz2(uu) 0 #end #macro courbe2(n,deb,fin) #local pas=(fin-deb)/n; #local uu = deb; #while (uu<=fin) #local vv=uu+pas; cylinder{ ,,(1-2*co1-cos(uu)*co1)*co2, 0.01} #local uu=vv; #end //fin boucle #end //macro // -------- droite ----------------- #macro xx3(uu) 1 #end #macro yy3(uu) -uu #end #macro zz3(uu) 0 #end #macro courbe3(n,deb,fin) #local pas=(fin-deb)/n; #local uu = deb; #while (uu<=fin) #local vv=uu+pas; cylinder{ ,,(1+2*co1-cos(uu)*co1)*co2, 0.01} #local uu=vv; #end //fin boucle #end //macro // --------------------------------------- #declare umin = 0; #declare umax = pi; #declare iter = 50; union { union { difference{ blob{ courbe1(iter,umin,umax) courbe2(iter,umin,umax) threshold 0.01 } box{ <0,-1,-2>,<2,2,2> } } difference{ blob {courbe1(iter,umin,umax) courbe3(iter,umin,umax) threshold 0.01 } box{ <-2,-1,-2>,<0,2,2> } } clipped_by{ box{ <-2,-pi,-2>,<2,3,2>}} } // fin union interne torus{ (1-1.58*co1)*co2, 2.27*co1*co2 clipped_by{cylinder{<0,0,0>,<0,-1,0>,1.5}} scale <1,1.5,1> translate <1,-pi+0.02,0>} pigment { Gold*1.8 transmit 0.6} texture { T_Glass3 } finish { ambient 0.1 reflection 0.2 specular 0.8} rotate <170,0,0> translate <-0.1,-2.2,0> scale <2,1,1> } ================================================================== ================================================================== /* Programme 2 : bouteille de Klein à partir des équations //--------------- partie 1 ---------------- x1 := 6*cos(uu)+6*cos(uu)*sin(uu)+4*cos(vv)*cos(uu)-2*cos(vv)*cos(uu)^2 y1 := 20*sin(uu)+4*sin(uu)*cos(vv)-2*sin(uu)*cos(vv)*cos(uu) z1 := 4*sin(vv)-2*sin(vv)*cos(uu) x1u := -sin(uu)*(6+6*sin(uu)+r*cos(vv))+6*cos(uu)^2 y1u := 20*cos(uu)+r*cos(uu)*cos(vv) z1u := 0 x1v := -cos(uu)*r*sin(vv) y1v := -r*sin(uu)*sin(vv) z1v := r*cos(vv) //--------------- partie 2 ---------------- x2 := 6*cos(uu)+6*cos(uu)*sin(uu)-4*cos(vv)+2*cos(vv)*cos(uu) y2 := 20*sin(uu) z2 := 4*sin(vv)-2*sin(vv)*cos(uu) x2u := -6*sin(uu)*(1+sin(uu))+6*cos(uu)^2 y2u := 20*cos(uu) z2u := 0 x2v := r*sin(vv) y2v := 0 z2v := r*cos(vv) */ #include "colors.inc" #include "sable.inc" camera { orthographic location < 2,0,-40> look_at < 0,-2, 0> } light_source { <-5,20,-15> color White } light_source { <5,20, -10> color rgb 1 } light_source { <10,-30,0 > color White*1.5 } // ---------------------------------------- sky_sphere { pigment { gradient y-5 color_map { [0.3 rgb <0.6,1.0,1.0>*1.2] [0.5 rgb <0.0,0.1,0.8>] } } } //--------------- partie 1 ---------------- #macro surf1(umin,umax) //--------------- M(uu,vv) ------------- #macro CX(uu,vv) 6*cos(uu)+6*cos(uu)*sin(uu)+4*cos(vv)*cos(uu)-2*cos(vv)*cos(uu)*cos(uu) #end #macro CY(uu,vv) 20*sin(uu)+4*sin(uu)*cos(vv)-2*sin(uu)*cos(vv)*cos(uu) #end #macro CZ(uu,vv) (4-2*cos(uu))*sin(vv) #end //--------------- dM/duu ------------- #macro dCXu(uu,vv) -sin(uu)*(6+6*sin(uu)+ (4-2*cos(uu))*cos(vv))+6*cos(uu)*cos(uu) #end #macro dCYu(uu,vv) 20*cos(uu)+ (4-2*cos(uu))*cos(uu)*cos(vv) #end #macro dCZu(uu,vv) 0 #end //--------------- dM/dvv ------------- #macro dCXv(uu,vv) -cos(uu)* (4-2*cos(uu))*sin(vv) #end #macro dCYv(uu,vv) - (4-2*cos(uu))*sin(uu)*sin(vv) #end #macro dCZv(uu,vv) (4-2*cos(uu))*cos(vv) #end //------------------------------------ #declare vmin = 0; #declare vmax = 2*pi; #declare uiter = 40; //nombre de pas #declare viter = 30; #declare iu = (umax-umin)/uiter ; //increment par pas #declare iv = (vmax-vmin)/viter; // methode normale mathématique #local vv = vmin; #while (vv<=vmax) //boucle externe #local uu = umin; #while (uu<=umax) //boucle interne //POINTS #declare x1=CX(uu,vv); #declare y1=CY(uu,vv); #declare z1=CZ(uu,vv) ; #declare n1=vcross(,); #declare uu=uu+iu; #declare x2=CX(uu,vv); #declare y2=CY(uu,vv); #declare z2=CZ(uu,vv); #declare n2=vcross(,); #declare vv=vv+iv ; #declare x3=CX(uu,vv); #declare y3=CY(uu,vv); #declare z3=CZ(uu,vv); #declare n3=vcross(,); #declare uu=uu-iu ; #declare x4=CX(uu,vv); #declare y4=CY(uu,vv); #declare z4=CZ(uu,vv) ; #declare n4=vcross(,); #declare vv=vv-iv ; #declare uu=uu+iu ; //TRIANGLES object{ smooth_triangle{ ,n1, ,n2, ,n3 } } object{ smooth_triangle{ , n1, , n3 , n4 } } #end // fin boucle interne #declare vv = vv+iv ; #end //fin boucle externe #end // -------------- partie 2 -------- #macro surf2(umin,umax) //--------------- M(uu,vv) ------------- #macro CX(uu,vv) 6*cos(uu)+6*cos(uu)*sin(uu)-4*cos(vv)+2*cos(vv)*cos(uu) #end #macro CY(uu,vv) 20*sin(uu) #end #macro CZ(uu,vv) 4*sin(vv)-2*sin(vv)*cos(uu) #end //--------------- dM/duu ------------- #macro dCXu(uu,vv) -6*sin(uu)*(1+sin(uu))+6*cos(uu)*cos(uu) #end #macro dCYu(uu,vv) 20*cos(uu) #end #macro dCZu(uu,vv) 0 #end //--------------- dM/dvv ------------- #macro dCXv(uu,vv) (4-2*cos(uu))*sin(vv) #end #macro dCYv(uu,vv) 0 #end #macro dCZv(uu,vv) (4-2*cos(uu))*cos(vv) #end #declare vmin = 0; #declare vmax = 2*pi; #declare uiter = 40; //nombre de pas #declare viter = 30; #declare iu = (umax-umin)/uiter ; //increment par pas #declare iv = (vmax-vmin)/viter; // methode normale mathématique #declare uu = umin; #while (uu,); #declare uu=uu+iu; #declare x2=CX(uu,vv); #declare y2=CY(uu,vv); #declare z2=CZ(uu,vv); #declare n2=vcross(,); #declare vv=vv+iv ; #declare x3=CX(uu,vv); #declare y3=CY(uu,vv); #declare z3=CZ(uu,vv); #declare n3=vcross(,); #declare uu=uu-iu ; #declare x4=CX(uu,vv); #declare y4=CY(uu,vv); #declare z4=CZ(uu,vv) ; #declare n4=vcross(,); //TRIANGLES object{ smooth_triangle{ ,n1, ,n2, ,n3 } } object{ smooth_triangle{ , n1, , n3 , n4 } } #end // fin boucle interne #declare uu = uu+iu ; #end //fin boucle externe #end // fin macro //----------------------------------------- union{ surf1(0,pi) surf2(pi,2*pi) pigment { Gold*1.2 transmit 0.4 } finish { phong 0.5 phong_size 150 ambient 0.3 diffuse 0.4 reflection 0.2 } rotate <140,30,0> scale 1.5*x } //------------ Amélioration possible ------------- /* La surface avec l'affichage ci-dessus présente un léger defaut que l'on peut, en partie, supprimer grace à la modification ci-dessous. Par contre, le temps de calcul du rendu passe d'environ 1 minute à 5 heures !!! union{ difference { union{ surf1(0,pi) } cylinder {<-3,0,0>,<-3,-4,0>,10 } } difference { union{ surf2(pi,2*pi) } cylinder {<-3,0,0>,<-3,4,0>,10 } } pigment { Gold*1.2 transmit 0.4 } finish { phong 0.5 phong_size 150 ambient 0.3 diffuse 0.4 reflection 0.2 } rotate <140,30,0> scale 1.5*x } */ ================================================================== ================================================================== /* Programme 3 : bouteille de Klein à partir des équations de Sisto Baldo http://www-math.science.unitn.it/~baldo */ // ---------- equations ----------- #macro CX(uu,vv) .75*(1-cos(uu)+1/3*(pow(2-uu/pi,3)-pow(2-uu/pi,2)*11/4+ 3/2*(2-uu/pi)+.8)*cos(vv)*(-cos(uu)/2+3/4*pow(sin(uu),2)*cos(uu)+ cos(2*uu)/2)*1/sqrt(pow(sin(uu),2)+pow(-cos(uu)/2+3/4*pow(sin(uu),2)*cos(uu)+cos(2*uu)/2,2))) #end #macro CY(vu,vv) 1/3*(pow(2-uu/pi,3)-pow(2-uu/pi,2)*11/4+3/2*(2-uu/pi)+.8)*sin(vv) #end #macro CZ(uu,vv) pow(1-cos(uu),2)*sin(uu)/4+1/3*(pow(2-uu/pi,3)-pow(2-uu/pi,2)*11/4+3/2*(2-uu/pi)+.8)*cos(vv)*sin(uu)* 1/sqrt(pow(sin(uu),2)+pow(-cos(uu)/2+3/4*pow(sin(uu),2)*cos(uu)+cos(2*uu)/2,2)) #end //------------------------------- #include "colors.inc" #include "stones.inc" #include "textures.inc" global_settings { assumed_gamma 1.5 } camera { orthographic location < -1, 1,-6> direction <1,1,3> look_at < -0.35, -0.6, 0> } light_source { <-10, 20,-15> color rgb 1 } light_source { <5, -5, -15> color rgb 1 } background{ color Orange*0.9 } #declare uiter = 200; #declare viter = 40; //#declare a=2 ; #declare vmin = 0; #declare vmax = 2*pi; #declare umin = 0.01 ; #declare umax = 2*pi-0.01; #declare iu = (umax-umin)/uiter; #declare iv = (vmax-vmin)/viter ; //#declare counter = 0 ; #declare surface =union{ #declare vv = vmin; #declare uu = umin; #while (uu,); #declare n2=vcross(,); #declare n3=vcross(,); #declare n4=vcross(,); #declare n5=vcross(,); #declare n6=vcross(,) ; #declare n7=vcross(,); #declare n8=vcross(,) ; #declare n9=vcross(,); //TRIANGLES object{ smooth_triangle{ ,n5+n6+n8+n9, ,n4+n5+n7+n8, ,n1+n2+n4+n5 } } object{ smooth_triangle{ , n5+n6+n8+n9, , n1+n2+n4+n5 , n2+n3+n5+n6 } } #declare vv = vv+iv; #end // fin boucle interne #declare uu = uu+iu ; #end //fin boucle externe } union{ object {surface } disc{ <0., 0, 0.>,<1, 0, 0>,0.27,0.24 } // rustine pour boucher le trou texture{ pigment { dents color_map { [ 0.1 color red 0.95 green 1 blue 0.95 transmit 0.6] [ 0.1 color red 0.7 green 1 blue 0.6 transmit 0.4] [ 0.4 color red 0.3 green 0.8 blue 0.5 transmit 0.1] [ 0.5 color red 0.2 green 0.7 blue 0.7 transmit 0.6] } // color_map scale 0.05 } //fin pigment finish { ambient 0.45 diffuse 0.2 specular 0.7 roughness 0.01 } } // fin texture rotate <130,-10,-110> scale <1.3,1,1> }