summaryrefslogtreecommitdiff
path: root/Master/texmf-dist/doc/metapost/featpost/example/standard/hiddensurface.mp
blob: b0d64e95612b3c234dc175c93f3d81971658798e (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
% hiddensurface.mp
% L. Nobre G.
% 2004

%input featpost3Dplus2D;

% The big nice trick to draw 3D hidden line surfaces

verbatimtex 
\documentclass{article} 
\usepackage{beton} 
\usepackage{concmath} 
\usepackage{ccfonts} 
\begin{document} 
etex

numeric toplevel;
toplevel = 2.2;

def zsurface( expr xc, yc ) = 
	begingroup
		numeric zout;
		zout = yc**4 -xc*yc*(1-yc**2);
		if zout > toplevel:
			zout := toplevel;
		fi;
		( zout )
	endgroup 
enddef;

def zline( expr yc ) = 
	begingroup
		numeric zout;
		zout = 4*yc*yc*yc/(1-3*yc*yc); %% I don't get it...
		if zout > 3:
			zout := 3;
		fi;
		( zout )
	endgroup 
enddef;

f := (6,1,2);
Spread := 67;

beginfig(1); 
	numeric i, j, nx, ny, lowx, higx, lowy, higy, refz;
	numeric posx, posy, posz, facz, lowl, higl, pensize;
	color gridx[], pos, begcont, endcont, begconf, endconf;
	path facex, descontjump;
	pensize = 3pt;
	nx = 20;
	ny = 50;
	lowy = -2.5;
	higy = 1;
	lowx = 1.5;
	higx = 3;
	refz = -2.5;
	facz = 5;
	for i=0 upto nx:
	    for j=0 upto ny:
		posx := lowx + i*( higx - lowx )/nx;
		posy := lowy + j*( higy - lowy )/ny;
		posz := zsurface( posx, posy );
		posx := bracket(lowx,posx,higx);
		posy := bracket(lowy,posy,higy);
		posz := posz/facz;
		gridx[j] := ( posx, posy, posz );
	    endfor;
	    pos := ( posx, -1, refz/facz );
	    facex := rp( pos )--rp( gridx0 );
	    for j=1 upto ny:
		facex := facex--rp( gridx[j] );
	    endfor;
	    facex:=facex--rp((posx,1,refz/facz))--cycle;
	    unfill facex;
	    draw facex;
	endfor;
	lowl = -2.0;
%	higl = -0.7;
	higl = -1.0;
	for j=0 upto ny:
		posy := lowl + j*( higl - lowl )/ny;
		posx := zline( posy );
		posz := zsurface( posx, posy );
		posx := bracket(lowx,posx,higx);
		posy := bracket(lowy,posy,higy);
		posz := posz/facz;
		gridx[j] := ( posx, posy, posz );
	endfor;
	facex := rp( gridx0 );
	for j=1 upto ny:
		facex := facex--rp( gridx[j] );
	endfor;
	draw facex withcolor red; %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
	lowl := -1.4;
	higl := -0.8;
	for j=0 upto ny:
		posy := lowl + j*( higl - lowl )/ny;
		posx := -2*posy;
		posz := zsurface( posx, posy );
		posx := bracket(lowx,posx,higx);
		posy := bracket(lowy,posy,higy);
		posz := posz/facz;
		gridx[j] := ( posx, posy, posz );
	endfor;
	facex := rp( gridx0 );
	for j=1 upto ny:
		facex := facex--rp( gridx[j] );
	endfor;
	draw facex withcolor green;
	lowl := -1.0;
	higl := 0.5;
	for j=0 upto 1:
		posy := lowl + j*( higl - lowl );
		posx := 2;
		posz := zsurface( posx, posy );
		posx := bracket(lowx,posx,higx);
		posy := bracket(lowy,posy,higy);
		posz := posz/facz;
		gridx[j] := ( posx, posy, posz );
	endfor;
%	facex := rp( gridx0 );
%	for j=1 upto ny:
%		facex := facex--rp( gridx[j] );
%	endfor;
%	draw facex withcolor blue;	
	pickup pencircle scaled pensize;
	draw rp(gridx0) withcolor red;
	draw rp(gridx1) withcolor red;	
	posx := 2.83;
	posy := -1.933;
	posz := zsurface( posx, posy );
	posx := bracket(lowx,posx,higx);
	posy := bracket(lowy,posy,higy);
	posz := posz/facz;
	draw rp((posx,posy,posz)) withcolor blue;
	posy := 0.517;
	posy := bracket(lowy,posy,higy);
	draw rp((posx,posy,posz)) withcolor blue;
	begconf = (1.15,-1,refz/facz);
	endconf = (1.15, 1,refz/facz);
	begcont = ( 1,-1,1.15*toplevel/facz);
	endcont = (-1,-1,1.15*toplevel/facz);
	pickup pencircle scaled 0.5pensize;
	drawarrow rp(begconf)--rp(endconf);
	drawarrow rp(begcont)--rp(endcont);
	label.ulft( btex $\Lambda$ etex, rp(0.5*(begcont+endcont)) );
	label.bot( btex $\Upsilon$ etex, rp(0.5*(begconf+endconf)) );
endfig;

verbatimtex \end{document} etex

end;