Des tubes...
Les surfaces présentées ci-dessous sont calculées et enregistrées dans
des fichiers. Ces derniers sont lus par Metapost à travers la procédure
gdata du fichier graph.mp.
Les fichiers de données, les images et les macros sont dans l'archive.
%@Auteur: Jean-Michel Sarlat
%@Date: 19 avril 2005
input graph;
input fonctions;
input panneaux;
u = 2cm;
color couleur;
let ST = scantokens;
% Lecture du fichier de données à l'aide de la procédure gdata de graph.mp
% Chaque ligne du fichier correspond à une dalle, de la plus éloignée à la
% plus proche du point de vue. Les données sont structurées de la façon
% suivante:
% <indice1> <indice2> <point1> <point2> <point3> <point4> <facteur d'éclairement>
% Les indices sont les références de la dalle (deux paramètres) et les
% points sont les sommets du quadrilatère représentant la dalle.
% Les données étant rendues comme chaîne de caractère par gdata, elles
% sont converties dans leur type MetaPost à l'aide l'instruction scantokens.
vardef Surface(expr s) =
gdata(s,p,dalle(ST p1,ST p2,ST p3,ST p4,ST p5,ST p6,ST p7))
enddef;
% facteur d'éclairement. Les deux variables minE et max E sont relatives
% à chaque tube, calculées au moment de la construction des fichiers <*.s>
% elles sont affectées dans les fichiers <*.mp>.
def fe(expr e) =
(0.3+0.7/(maxE-minE)*(e-minE))
enddef;
% Dessin des dalles.
def dalle(expr i,j,a,b,c,d,e) =
fill (a--b--c--d--cycle) scaled u withcolor (fe(e)*couleur);
enddef;
vardef f(expr t) = 2*cos(t) enddef;
vardef g(expr t) = 2*sin(t) enddef;
vardef h(expr t) = 0 enddef;
couleur := (0,1,0.5);
beginfig(1);
input tore.a.mp;
fill pX scaled u withcolor 0.8white;
draw CourbeYZ(g,h,Pi/2,3Pi/2,2) scaled u withcolor blue;
fill pY scaled u withcolor 0.8white;
draw CourbeZX(h,f,0,Pi,2) scaled u withcolor blue;
fill pZ scaled u withcolor 0.8white;
draw CourbeXY(f,g,0,2Pi,40) scaled u withcolor blue;
Surface("tore.a.s");
endfig;
vardef f(expr t) = 2*cos(t) enddef;
vardef g(expr t) = 2*sin(t) enddef;
vardef h(expr t) = 0 enddef;
couleur := (1,0.76,0.15);
beginfig(2);
input demi_tore.a.mp;
fill pX scaled u withcolor 0.8white;
draw CourbeYZ(g,h,3Pi/2,2Pi,2) scaled u withcolor blue;
fill pY scaled u withcolor 0.8white;
draw CourbeZX(h,f,-Pi,0,2) scaled u withcolor blue;
fill pZ scaled u withcolor 0.8white;
draw CourbeXY(f,g,Pi,2Pi,40) scaled u withcolor blue;
Surface("demi_tore.a.s");
endfig;
vardef f(expr t) = (1-cos(t))*cos(t) enddef;
vardef g(expr t) = (1-cos(t))*sin(t) enddef;
vardef h(expr t) = 0 enddef;
couleur := (0,0.98,1);
beginfig(3);
input cardio01.a.mp;
fill pX scaled u withcolor 0.8white;
draw CourbeYZ(g,h,Pi/2,3Pi/2,2) scaled u withcolor blue;
fill pY scaled u withcolor 0.8white;
draw CourbeZX(h,f,0,Pi,2) scaled u withcolor blue;
fill pZ scaled u withcolor 0.8white;
draw CourbeXY(f,g,0,2Pi,40) scaled u withcolor blue;
Surface("cardio01.a.s");
endfig;
vardef f(expr t) = (1-cos(t))*cos(t) enddef;
vardef g(expr t) = (1-cos(t))*sin(t) enddef;
vardef h(expr t) = -0.3sin(t) enddef;
couleur := (1,0.1,0.6);
def dalle(expr i,j,a,b,c,d,e) =
fill (a--b--c--d--cycle) scaled u withcolor (fe(e)*couleur);
draw (a--b--c--d--cycle) scaled u withpen pencircle scaled 0.25
withcolor (fe(e)*0.7*couleur);
enddef;
Pour passer le point de rebroussement de la cardioïde, elle est régularisée; une
dimension est ajoutée de façon à faire disparaître le point singulier.
beginfig(4);
input cardio02.a.mp;
fill pX scaled u withcolor 0.8white;
draw CourbeYZ(g,h,0,2Pi,80) scaled u withcolor blue;
fill pY scaled u withcolor 0.8white;
draw CourbeZX(h,f,0,2Pi,80) scaled u withcolor blue;
fill pZ scaled u withcolor 0.8white;
draw CourbeXY(f,g,0,2Pi,80) scaled u withcolor blue;
Surface("cardio02.a.s");
endfig;
couleur := (1,0.4,0.2);
beginfig(5);
input cardio03.a.mp;
fill pX scaled u withcolor 0.8white;
draw CourbeYZ(g,h,0,2Pi,80) scaled u withcolor blue;
fill pY scaled u withcolor 0.8white;
draw CourbeZX(h,f,0,2Pi,80) scaled u withcolor blue;
fill pZ scaled u withcolor 0.8white;
draw CourbeXY(f,g,0,2Pi,80) scaled u withcolor blue;
Surface("cardio03.a.s");
endfig;
vardef f(expr t) = cos(4*t) enddef;
vardef g(expr t) = sin(4*t) enddef;
vardef h(expr t) = t enddef;
couleur := (0.4,1,0.6);
beginfig(6);
input helice01.a.mp;
fill pX scaled u withcolor 0.8white;
draw CourbeYZ(g,h,0,2Pi,80) scaled u withcolor blue;
fill pY scaled u withcolor 0.8white;
draw CourbeZX(h,f,0,2Pi,80) scaled u withcolor blue;
fill pZ scaled u withcolor 0.8white;
draw CourbeXY(f,g,0,2Pi,80) scaled u withcolor blue;
% La taille des fichiers lus semble être limitée, d'où
% la nécessité de les scinder.
Surface("helice01.a.s.1");
Surface("helice01.a.s.2");
endfig;
vardef f(expr t) = t*cos(4*t) enddef;
vardef g(expr t) = t*sin(4*t) enddef;
vardef h(expr t) = t enddef;
couleur := (0.4,0.6,1);
beginfig(7);
input helice02.a.mp;
fill pX scaled u withcolor 0.8white;
draw CourbeYZ(g,h,-Pi,Pi,180) scaled u withcolor blue;
fill pY scaled u withcolor 0.8white;
draw CourbeZX(h,f,-Pi,Pi,180) scaled u withcolor blue;
fill pZ scaled u withcolor 0.8white;
draw CourbeXY(f,g,-Pi,Pi,180) scaled u withcolor blue;
Surface("helice02.a.s.1");
Surface("helice02.a.s.2");
endfig;
end
|