program func_3d (input,output); (* 3D-Darstellung von Funktionen *)
{$S-,R-}
{$N+,E+}
uses crt , graph , hcopyu;
const r = 20;
d = 900;
t = 0.5;
p = 1.1;
s = 0.15; (* Bestimmt GrÖße der Rechtecke *)
l = 28; (* Anzahl der Rechtecke *)
var GrDriver,GrMode,i,j,
k,xc,yc,ErrCode : integer;
x,y,st,sp,ct,cp : single; (* schnelleres Berechnen *)
v : array[1..4] of pointtype; (* Punkt x,y *)
drucken : char;
procedure hercules; external;
{$l herc }
function f(x,y : real): real; (* Hier die Funktion eingeben *)
begin
{ if (x<0) or (x>1) or (y<0) or (y>1) then f:=0 else }
f:=1.5*x*y*exp(sin(x)+cos(y)) / (1+x*x+y*y);
end;
procedure q (var p :pointtype ;x,y,z :single);
var a,b : single;
begin
a :=-(x*ct+y*st);
b := (a*sp-z*cp+r)/d;
p.x := round(xc+(y*ct-x*st)/b);
p.y := round(yc-(a*cp+z*sp)/b);
end;
begin
GrDriver:=Detect;
ErrCode:=RegisterBGIDriver(@hercules);
InitGraph(GrDriver,GrMode,'');
Errcode:=GraphResult;
if ErrCode <> grOk then
begin (* Fehler ausgeben *)
writeln('Fehler bei Grafik-Initialisierung : ',GraphErrorMsg(ErrCode));
halt;
end;
xc:=GetmaxX shr 1;
yc:=GetmaxY shr 1 +30;
SetFillStyle(0,1); { Hintergrund bleibt schwarz }
Bar(0,0,GetmaxX,GetmaxY);
SetFillstyle(1,4*Byte(GrDriver<>7));
st:=sin(t);
sp:=sin(p);
ct:=cos(t);
cp:=cos(p);
for i:=-l to l-1 do
for j:=-l to l-1 do
if not keypressed then (* vorzeitiger Abbruch mÖglich *)
begin
for k:=1 to 4 do
begin
x:=(i + k and 2 shr 1)*s;
y:=(j+(k-1) shr 1)*s;
q(v[k], x, y, f(x,y) );
end;
FillPoly(4,v);
end;
Rectangle(0,0,GetmaxX,GetmaxY);
OutTextXY(5,5,'Drucken ? (j/N)');
repeat until keypressed ;
drucken:=readkey;
if (drucken='j') or (drucken='J') then
begin
OutTextXY(5,5,' ');
hcopy(1,1,719,400,false);
end;
CloseGraph;
end.