Voir : 
la version texte avec indentation

La bouteille de Klein





voir avec des lunettes rouge-cyan : l'anaglyphe

avec programme 1

Voir en 800x800 
(29 Ko)  

avec programme 2

Voir en 800x800
(35 Ko)

avec programme 3

Voir en 800x800
(35 Ko)


bouteille multiple avec programme 4
tube d'axe une épi ou une hypocycloide à n rebroussements
de rayon de période 2*Pi/n


agrandir

agrandir

agrandir

agrandir

agrandir

agrandir


autre type de bouteilles multiples
tube d'axe une cycloide sphérique à n rebroussements
de rayon de période 2*Pi/n



agrandir


agrandir


agrandir



agrandir


agrandir


Surface 2 établie avec équations du site de R. Ferréol : Programme 2
Surface 3 établie avec équations de Sisto Baldo : Programme 3
Tuyaux à base d'épi ou hypocycloïdes : Programme 4



Programme 1 ; surface reconstituée artificiellement


/* Bouteille de Klein */
#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{ <xx1(uu),yy1(uu),zz1(uu)>,<xx1(vv),yy1(vv),zz1(vv)>,(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{ <xx2(uu),yy2(uu),zz2(uu)>,<xx2(vv),yy2(vv),zz2(vv)>,(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{ <xx3(uu),yy3(uu),zz3(uu)>,<xx3(vv),yy3(vv),zz3(vv)>,(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>
} // fin torus
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>
}



Début  

II. Programme 2 ; surface utilisant les équations :
r:=4-2*cos(uu)
---------uu=0..pi, vv=0..2*pi -----------
x1 := cos(uu)*(6+6*sin(uu)+r*cos(vv))
y1 := 20*sin(uu)+r*sin(uu)*cos(vv)
z1 := r*sin(vv)
---------uu=pi..2*pi, vv=0..2*pi --------
x2 := 6*cos(uu)*(1+sin(uu))-r*cos(vv)
y2 := 20*sin(uu)
z2 := r*sin(vv)
-----------------------------------------
#include "colors.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(<dCXu(uu,vv),dCYu(uu,vv),dCZu(uu,vv)>,<dCXv(uu,vv),dCYv(uu,vv),dCZv(uu,vv)>);
#declare uu=uu+iu;
#declare x2=CX(uu,vv);
#declare y2=CY(uu,vv);
#declare z2=CZ(uu,vv);
#declare n2=vcross(<dCXu(uu,vv),dCYu(uu,vv),dCZu(uu,vv)>,<dCXv(uu,vv),dCYv(uu,vv),dCZv(uu,vv)>);
#declare vv=vv+iv ;
#declare x3=CX(uu,vv);
#declare y3=CY(uu,vv);
#declare z3=CZ(uu,vv);
#declare n3=vcross(<dCXu(uu,vv),dCYu(uu,vv),dCZu(uu,vv)>,<dCXv(uu,vv),dCYv(uu,vv),dCZv(uu,vv)>);
#declare uu=uu-iu ;
#declare x4=CX(uu,vv);
#declare y4=CY(uu,vv);
#declare z4=CZ(uu,vv) ;
#declare n4=vcross(<dCXu(uu,vv),dCYu(uu,vv),dCZu(uu,vv)>,<dCXv(uu,vv),dCYv(uu,vv),dCZv(uu,vv)>);
#declare vv=vv-iv ;
#declare uu=uu+iu ;
//TRIANGLES
object{
smooth_triangle{
<x1,y1,z1>,n1,

<x2,y2,z2>,n2,
<x3,y3,z3>,n3
}
}
object{
smooth_triangle{
<x1,y1,z1>, n1,
<x3,y3,z3>, n3
<x4,y4,z4>, 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<umax) //boucle externe
#declare vv = vmin;
#while (vv<vmax) //boucle interne
//POINTS
#declare x1=CX(uu,vv);
#declare y1=CY(uu,vv);
#declare z1=CZ(uu,vv) ;
#declare n1=vcross(<dCXu(uu,vv),dCYu(uu,vv),dCZu(uu,vv)>,<dCXv(uu,vv),dCYv(uu,vv),dCZv(uu,vv)>);
#declare uu=uu+iu;
#declare x2=CX(uu,vv);
#declare y2=CY(uu,vv);
#declare z2=CZ(uu,vv);
#declare n2=vcross(<dCXu(uu,vv),dCYu(uu,vv),dCZu(uu,vv)>,<dCXv(uu,vv),dCYv(uu,vv),dCZv(uu,vv)>);
#declare vv=vv+iv ;
#declare x3=CX(uu,vv);
#declare y3=CY(uu,vv);
#declare z3=CZ(uu,vv);
#declare n3=vcross(<dCXu(uu,vv),dCYu(uu,vv),dCZu(uu,vv)>,<dCXv(uu,vv),dCYv(uu,vv),dCZv(uu,vv)>);
#declare uu=uu-iu ;
#declare x4=CX(uu,vv);
#declare y4=CY(uu,vv);
#declare z4=CZ(uu,vv) ;
#declare n4=vcross(<dCXu(uu,vv),dCYu(uu,vv),dCZu(uu,vv)>,<dCXv(uu,vv),dCYv(uu,vv),dCZv(uu,vv)>);
//TRIANGLES
object{
smooth_triangle{
<x1,y1,z1>,n1,
<x2,y2,z2>,n2,
<x3,y3,z3>,n3
}
}
object{
smooth_triangle{
<x1,y1,z1>, n1,
<x3,y3,z3>, n3
<x4,y4,z4>, n4
}
}

#end // fin boucle interne
#declare uu = uu+iu ;
#end //fin boucle externe
#end // fin macro

//--------- voir fichier texte pour un meilleur rendu -------------------

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
}


Début  

Programme 3 ; Equations de Baldo
/* 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 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<umax) //boucle externe
#declare vv = vmin;
#while (vv<vmax) //boucle interne
//POINTS
#declare x1=CX(uu,vv);
#declare y1=CY(uu,vv);
#declare z1=CZ(uu,vv) ;
#declare uu=uu+iu;
#declare x2=CX(uu,vv);
#declare y2=CY(uu,vv);
#declare z2=CZ(uu,vv);
#declare vv=vv+iv ;
#declare x3=CX(uu,vv);
#declare y3=CY(uu,vv);
#declare z3=CZ(uu,vv);
#declare uu=uu-iu ;
#declare x4=CX(uu,vv);
#declare y4=CY(uu,vv);
#declare z4=CZ(uu,vv) ;
#declare vv=vv-iv;
//NORMALS
#declare uu=uu+2*iu ;
#declare nx1=CX(uu,vv);
#declare ny1=CY(uu,vv);
#declare nz1=CZ(uu,vv);
#declare uu=uu-2*iu ;
#declare vv=vv+2*iv;
#declare nx2=CX(uu,vv) ;
#declare ny2=CY(uu,vv) ;
#declare nz2=CZ(uu,vv) ;
#declare vv=vv-2*iv ;
#declare uu=uu-iu ;
#declare nx3=CX(uu,vv);
#declare ny3=CY(uu,vv);
#declare nz3=CZ(uu,vv);
#declare uu=uu+iu;
#declare vv=vv-iv ;
#declare nx4=CX(uu,vv);
#declare ny4=CY(uu,vv);
#declare nz4=CZ(uu,vv);
#declare vv=vv+iv;
#declare n1=vcross(<nx2-x4,ny2-y4,nz2-z4>,<nx1-x2,ny1-y2,nz1-z2>);
#declare n2=vcross(<x4-x3,y4-y3,z4-z3>,<nx2-x4,ny2-y4,nz2-z4>);
#declare n3=vcross(<nx3-x1,ny3-y1,nz3-z1>,<nx2-x4,ny2-y4,nz2-z4>);
#declare n4=vcross(<x3-x2,y3-y2,z3-z2>,<nx1-x2,ny1-y2,nz1-z2>);
#declare n5=vcross(<x1-x2,y1-y2,z1-z2>,<x3-x2,y3-y2,z3-z2>);
#declare n6=vcross(<nx3-x1,ny3-y1,nz3-z1>,<x4-x1,y4-y1,z4-z1>) ;
#declare n7=vcross(<nx1-x2,ny1-y2,nz1-z2>,<nx4-x1,ny4-y1,nz4-z1>);
#declare n8=vcross(<nx4-x1,ny4-y1,nz4-z1>,<x1-x2,y1-y2,z1-z2>) ;
#declare n9=vcross(<nx4-x1,ny4-y1,nz4-z1>,<nx3-x1,ny3-y1,nz3-z1>);

//TRIANGLES
object{
smooth_triangle{
<x1,y1,z1>,n5+n6+n8+n9,
<x2,y2,z2>,n4+n5+n7+n8,
<x3,y3,z3>,n1+n2+n4+n5
}
}
object{
smooth_triangle{
<x1,y1,z1>, n5+n6+n8+n9,
<x3,y3,z3>, n1+n2+n4+n5
<x4,y4,z4>, 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>
}


Début