% hiddenlinegraph.mp
% L. Nobre G.
% 2003
% The application of the big nice trick to draw 3D hidden line surfaces 

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

def zsurfaci( expr xc, yc ) = 
	begingroup
		numeric zout;
		zout = yc**4-xc*yc*(1-yc**2);
		( ( xc, yc, zout ) )
	endgroup 
enddef;

def zsurface( expr xc, yc ) =
	( xc, yc, cosd(xc*57)*cosd(yc*57)+4*mexp(-(xc**2+yc**2)*6.4) )
enddef;

def zsurfaca( expr xc, yc ) =
	( xc, yc, 1.5-0.2*xc )
enddef;

%f := (6,1,0);
f := (5,1.5,3);
Spread := 147;
NF := 0;
LightSource := (1,-1,2);

beginfig(1); 
	numeric nx, ny, lowx, higx, lowy, higy, 
	        facz, lowz, higz, base, topo;
	path chair;
	nx = 22;
	ny = 22;
	lowy = -7;
	higy = 7;
	lowx = -7;
	higx = 7;
	facz = 2;
	lowz = -1;
	higz = 5;
%	lowy = -2.5;
%	higy = 1;
%	lowx = 1.5;
%	higx = 3;
%	facz = 3;
%	lowz = -1.5;
%	higz = 1.5;
	partrimesh( nx,ny,lowx,higx,lowy,higy,
	                  lowx,higx,lowy,higy,lowz,higz,facz,zsurface);
	partrimesh( nx,ny,lowx,higx,lowy,higy,
	                  lowx,higx,lowy,higy,lowz,higz,facz,zsurfaca);
	base = -1/facz;
	topo = 1/facz;
	chair = rp((-1,-1,base))--rp((1,-1,base))--rp((1,1,base))
	      --rp((-1,1,base))--rp((-1,-1,base))--rp((-1,-1,topo))
	      --rp((-1,1,topo))--rp((-1,1,base))--cycle;
	draw chair;
%	fill_faces( withcolor blue );
	draw_invisible( false, false, green, blue );
endfig;

verbatimtex \end{document} etex

end;
