home *** CD-ROM | disk | FTP | other *** search
/ Turbo Toolbox / Turbo_Toolbox.iso / 1989 / 04 / extra / fungr.pas < prev    next >
Encoding:
Pascal/Delphi Source File  |  1989-01-25  |  2.4 KB  |  93 lines

  1. {************************************************}
  2. {*                   FUNGR.PAS                  *}
  3. {*    3D-Funktionsplotter für das Grafiksystem  *}
  4. {*          (C) 1989 S.Szkaradnik & TOOLBOX     *}
  5. {************************************************}
  6.  
  7. Function Zfun ( X, Y : Real ) : Real ;
  8. Begin
  9.   Zfun := EXP(-SQR(X)-SQR(Y))
  10. End ;
  11.  
  12. Procedure FnGraph ( Xmin, Xmax, Ymin, Ymax,
  13.                     Zmin, Zmax : Real) ;
  14.  
  15. Var
  16.   OldL, NewL : PolyPoint ;
  17.   J, K, MaxX, LevZ : Integer ;
  18.   StepH, StepV, DeltH : Integer ;
  19.   X, Y, Fun, MultZ, StepX, StepY : REAL;
  20.  
  21. Procedure HorizLines ;
  22. Begin
  23.   For K := 0 To 200 Do OldL.Co[K].Y := 0 ;
  24.   Y := Ymin ;
  25.   For J := 0 To 40 Do
  26.     Begin
  27.       X := Xmin ;
  28.       For K := 0 To 200 Do
  29.         Begin
  30.           Fun := ZFun(X,Y);
  31.           NewL.Co[k].X := K * StepH + J * DeltH ;
  32.           NewL.Co[k].Y := Round(MultZ*Fun)
  33.                           + J * StepV + LevZ ;
  34.           X := X + StepX ;
  35.         End ;
  36.       NewL.N := K ;
  37.       For K := 1 To 200 Do
  38.         If OldL.Co[K].Y > NewL.Co[K-1].Y Then
  39.           NewL.Co[K-1].Y := OldL.Co[K].Y ;
  40.       OldL := NewL ;
  41.       If J Mod 2 = 0 Then Line ( NewL ) ;
  42.       Y := Y + StepY ;
  43.     End ;
  44. End ;
  45.  
  46. Procedure VertLines ;
  47. Begin
  48.   For K := 0 To 200 Do OldL.Co[K].Y := 0 ;
  49.   X := Xmax ;
  50.   For J := 0 To 200 Do
  51.     Begin
  52.       Y := Ymin ;
  53.       For K := 0 To 40 Do
  54.         Begin
  55.           Fun := ZFun(X,Y);
  56.           NewL.Co[k].X := MaxX - J * DeltH
  57.                           + K * StepH ;
  58.           NewL.Co[k].Y := Round ( MultZ * Fun )
  59.                           + K * StepV + LevZ ;
  60.           Y := Y + StepY ;
  61.         End ;
  62.       NewL.N := K ;
  63.       For K := 0 To 39 Do
  64.         If OldL.Co[K].Y > NewL.Co[K+1].Y Then
  65.           NewL.Co[K+1].Y := OldL.Co[K].Y ;
  66.       OldL := NewL ;
  67.       If J Mod 5 = 0 Then Line ( NewL ) ;
  68.       X := X - StepX ;
  69.     End ;
  70. End ;
  71.  
  72. Begin
  73.   StepX := ( Xmax - Xmin ) / 200 ;
  74.   StepY := ( Ymax - Ymin ) / 40 ;
  75.   Case Device Of
  76.     Monitor :
  77.       Begin
  78.         MultZ := 136 / ( Zmax - Zmin ) ;
  79.         MaxX :=  600; DeltH := 3;
  80.         StepH := 3 ; StepV := 3 ;
  81.       End ;
  82.     Plotter, Printer :
  83.       Begin
  84.         MultZ := 400 / ( Zmax - Zmin ) ;
  85.         MaxX := 800 ; DeltH := 4 ;
  86.         StepH := 4 ; StepV := 8 ;
  87.       End ;
  88.   End ;
  89.   LevZ  := - Round ( Zmin * MultZ ) ;
  90.   HorizLines ;
  91.   VertLines ;
  92. End ;
  93.