home *** CD-ROM | disk | FTP | other *** search
- {************************************************}
- {* FUNGR.PAS *}
- {* 3D-Funktionsplotter für das Grafiksystem *}
- {* (C) 1989 S.Szkaradnik & TOOLBOX *}
- {************************************************}
-
- Function Zfun ( X, Y : Real ) : Real ;
- Begin
- Zfun := EXP(-SQR(X)-SQR(Y))
- End ;
-
- Procedure FnGraph ( Xmin, Xmax, Ymin, Ymax,
- Zmin, Zmax : Real) ;
-
- Var
- OldL, NewL : PolyPoint ;
- J, K, MaxX, LevZ : Integer ;
- StepH, StepV, DeltH : Integer ;
- X, Y, Fun, MultZ, StepX, StepY : REAL;
-
- Procedure HorizLines ;
- Begin
- For K := 0 To 200 Do OldL.Co[K].Y := 0 ;
- Y := Ymin ;
- For J := 0 To 40 Do
- Begin
- X := Xmin ;
- For K := 0 To 200 Do
- Begin
- Fun := ZFun(X,Y);
- NewL.Co[k].X := K * StepH + J * DeltH ;
- NewL.Co[k].Y := Round(MultZ*Fun)
- + J * StepV + LevZ ;
- X := X + StepX ;
- End ;
- NewL.N := K ;
- For K := 1 To 200 Do
- If OldL.Co[K].Y > NewL.Co[K-1].Y Then
- NewL.Co[K-1].Y := OldL.Co[K].Y ;
- OldL := NewL ;
- If J Mod 2 = 0 Then Line ( NewL ) ;
- Y := Y + StepY ;
- End ;
- End ;
-
- Procedure VertLines ;
- Begin
- For K := 0 To 200 Do OldL.Co[K].Y := 0 ;
- X := Xmax ;
- For J := 0 To 200 Do
- Begin
- Y := Ymin ;
- For K := 0 To 40 Do
- Begin
- Fun := ZFun(X,Y);
- NewL.Co[k].X := MaxX - J * DeltH
- + K * StepH ;
- NewL.Co[k].Y := Round ( MultZ * Fun )
- + K * StepV + LevZ ;
- Y := Y + StepY ;
- End ;
- NewL.N := K ;
- For K := 0 To 39 Do
- If OldL.Co[K].Y > NewL.Co[K+1].Y Then
- NewL.Co[K+1].Y := OldL.Co[K].Y ;
- OldL := NewL ;
- If J Mod 5 = 0 Then Line ( NewL ) ;
- X := X - StepX ;
- End ;
- End ;
-
- Begin
- StepX := ( Xmax - Xmin ) / 200 ;
- StepY := ( Ymax - Ymin ) / 40 ;
- Case Device Of
- Monitor :
- Begin
- MultZ := 136 / ( Zmax - Zmin ) ;
- MaxX := 600; DeltH := 3;
- StepH := 3 ; StepV := 3 ;
- End ;
- Plotter, Printer :
- Begin
- MultZ := 400 / ( Zmax - Zmin ) ;
- MaxX := 800 ; DeltH := 4 ;
- StepH := 4 ; StepV := 8 ;
- End ;
- End ;
- LevZ := - Round ( Zmin * MultZ ) ;
- HorizLines ;
- VertLines ;
- End ;