%@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;

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