home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: 10 Tools / 10-Tools.zip / pmos2002.zip / DEMO / SRC / GRAFDEMO.MOD < prev    next >
Text File  |  1996-11-10  |  10KB  |  281 lines

  1. MODULE GrafDemo;
  2.  
  3.         (********************************************************)
  4.         (*                                                      *)
  5.         (*              Test of module WGraph                   *)
  6.         (*              Draws some graphs                       *)
  7.         (*                                                      *)
  8.         (*  Programmer:         S.P. Lontis, P. Moylan.         *)
  9.         (*  Last edited:        11 November 1996                *)
  10.         (*  Status:             Working                         *)
  11.         (*      This was a copy of the Lontis version,          *)
  12.         (*      but by now has been substantially modified.     *)
  13.         (*                                                      *)
  14.         (********************************************************)
  15.  
  16. FROM GWindows IMPORT
  17.     (* type *)  Window, BorderType,
  18.     (* proc *)  WriteString, WriteLn, SetCursor,
  19.                 GString, GStringUp, Line, PutPixel, OpenWindow, CloseWindow,
  20.                 ClearWindow;
  21.  
  22. FROM WGraph IMPORT
  23.     (* type *)  Graph, BarType, GraphType, LineType, MarkType,
  24.     (* proc *)  OpenGraph, DrawLines, DrawAxes, DrawXAxis, DrawYAxis,
  25.                 AddPoint, BarGraph;
  26.  
  27. FROM MATHLIB IMPORT
  28.     (* proc *)  Sin, Cos, Log, Exp, ATan;
  29.  
  30. FROM Timer IMPORT
  31.     (* proc *)  Sleep;
  32.  
  33. (************************************************************************)
  34.  
  35. PROCEDURE Pause;
  36.  
  37.     BEGIN
  38.         Sleep(3500);
  39.     END Pause;
  40.  
  41. (************************************************************************)
  42.  
  43. PROCEDURE BodeDemo (w: Window);
  44.  
  45.     (* Plots a log-linear graph.        *)
  46.  
  47.     VAR G: Graph;
  48.         i: [1..100];
  49.  
  50.     BEGIN
  51.         OpenGraph(G,w,loglinear,joined,50,30,570,140,1.0,-20.0,100.0,0.0,none);
  52.         ClearWindow(w);
  53.         WriteString(w,'                   BODE DIAGRAM ');
  54.         DrawAxes (G, 1.0, 0, 3, TRUE, 5.0, 0, 2, TRUE);
  55.         GString (w, 200, 5, 'Frequency (Hz)');
  56.         GStringUp (w, 10, 30, 'Magnitude (dB)');
  57.         FOR i := 1 TO 100 BY 5 DO
  58.             IF (i<=20) THEN AddPoint (G, VAL(LONGREAL,i), 0.0)
  59.             ELSE
  60.                 AddPoint(G, VAL(LONGREAL,i), -0.25*VAL(LONGREAL,i-20))
  61.             END (* IF *)
  62.         END (* FOR *);
  63.         Pause;
  64.     END BodeDemo;
  65.  
  66. (************************************************************************)
  67.  
  68. PROCEDURE TransferFunctionDemo;
  69.  
  70.     VAR w4, w5, w6, w7: Window;
  71.         s1, s2, s3, s4: Graph;
  72.         t, t1, t2: LONGREAL;
  73.  
  74.     BEGIN
  75.         OpenWindow(w4,10,10,315,100,1,3,double);
  76.         GString (w4, 100, 4, 'time (secs)');
  77.         OpenGraph(s1,w4,linear,joined,40,30,275,70,0.0,0.0,0.5,10.0,none);
  78.         DrawAxes (s1, 0.125, 0, 2, TRUE, 5.0, 0, 2, TRUE);
  79.  
  80.         OpenWindow(w5,325,10,630,100,1,3,double);
  81.         WriteString(w5,'Transfer Function-');WriteLn(w5);WriteLn(w5);
  82.         WriteString(w5,'   H(s) =   10 / ( s + 10) ');
  83.         GString (w5, 100, 4, 'Re(H)');
  84.         GStringUp (w5, 9, 20, 'Im(H)');
  85.         OpenGraph(s4,w5,linear,dots,40,30,275,50,-20.0,0.0,0.0,5.0,cross);
  86.         DrawAxes (s4, 10.0, 0, 2, TRUE, 5.0, 0, 2, TRUE);
  87.         AddPoint (s4,-10.0,0.0);
  88.  
  89.         OpenWindow(w6,10,110,315,200,1,3,double);
  90.         GString (w6, 100, 4, 'w (rad/sec)');
  91.         GStringUp (w6, 9, 4, 'Mag H (dB)');
  92.         OpenGraph (s2,w6,loglinear,joined,40,30,275,70,1.0,-50.0,100.0,0.0,none);
  93.         DrawAxes (s2, 1.0, 0, 2, TRUE, 25.0, 0, 2, TRUE);
  94.  
  95.         OpenWindow(w7,325,110,630,200,1,3,double);
  96.         GString (w7, 100, 4, 'w (rad/sec)');
  97.         GStringUp (w7, 9, 20, 'Phase');
  98.         OpenGraph (s3,w7,loglinear,joined,40,30,275,70,1.0,-90.0,1000.0,20.0,none);
  99.         DrawAxes (s3, 1.0, 0, 2, TRUE, 45.0, 0, 2, TRUE);
  100.  
  101.         t := 0.0;  t1 := 1.0;  t2 := 1.0;
  102.  
  103.         WHILE (t<=0.5) OR (t1<=100.0) OR (t2<=1000.0) DO
  104.  
  105.             AddPoint(s1,t,10.0*Exp(-10.0*t));
  106.             AddPoint(s2,t1,-10.0*Log(1.0+0.01*t1*t1));
  107.             AddPoint(s3,t2,-57.295*ATan(0.01*t2));
  108.             t := t + 0.025;
  109.             t1 := t1 + 5.0;
  110.             IF t2>100.0 THEN t2:=t2+100.0
  111.             ELSE t2:= t2 + 10.0
  112.             END (* IF *);
  113.  
  114.         END (* WHILE *);
  115.  
  116.         Pause;
  117.         CloseWindow (w4);
  118.         CloseWindow (w5);
  119.         CloseWindow (w6);
  120.         CloseWindow (w7);
  121.  
  122.     END TransferFunctionDemo;
  123.  
  124. (************************************************************************)
  125.  
  126. PROCEDURE LogLogDemo (w: Window);
  127.  
  128.     VAR i: INTEGER;
  129.         G8: Graph;
  130.  
  131.     BEGIN
  132.         OpenGraph(G8,w,loglog,joined,30,20,570,150,1.0,1.0,100.0,100.0,none);
  133.         DrawAxes (G8, 1.0, 0, 3, TRUE, 1.0, 0, 3, TRUE);
  134.         FOR i := 1 TO 100 BY 2 DO
  135.             IF i <= 8 THEN
  136.                 AddPoint (G8, VAL(LONGREAL,i), 1.0);
  137.             ELSE
  138.                 AddPoint (G8, VAL(LONGREAL,i), 10.0*Log(VAL(LONGREAL,i))-20.0)
  139.             END (* IF *)
  140.         END (* FOR *);
  141.         Pause;
  142.     END LogLogDemo;
  143.  
  144. (************************************************************************)
  145.  
  146. PROCEDURE ScaleDemo;
  147.  
  148.     VAR a1, a2, a3, a4: Graph;
  149.         w: Window;
  150.  
  151.     BEGIN
  152.         OpenWindow (w, 55, 50, 580, 310, 14, 3, double);
  153.         SetCursor (w, 7, 17);
  154.         WriteString (w, 'Scales can be offset from the graph origin');
  155.         OpenGraph(a1,w,linear,joined,100,60,400,250,0.0,0.0,5.0,5.0,none);
  156.         OpenGraph(a2,w,linear,joined,100,60,400,250,-10.0,0.0,5.0,5.0,none);
  157.         OpenGraph(a3,w,linear,joined,100,60,400,250,-5.0,-5.0,5.0,5.0,none);
  158.         OpenGraph(a4,w,linear,joined,100,60,400,250,-5.0,-5.0,5.0,10.0,none);
  159.         DrawAxes (a1, 1.0, 0, 2, TRUE, 1.0, 0, 2, TRUE);
  160.         DrawXAxis (a2, 2.0, 15, 2, TRUE);
  161.         DrawAxes (a3, 1.0, 30, 2, TRUE, 1.0, 28, 2, TRUE);
  162.         DrawYAxis (a4, 1.0, 56, 2, TRUE);
  163.         Pause;
  164.         CloseWindow (w);
  165.     END ScaleDemo;
  166.  
  167. (************************************************************************)
  168.  
  169. PROCEDURE RunTheDemo;
  170.  
  171.     (* Note that this procedure is badly designed (in the original      *)
  172.     (* version, the entire demo was a single main program (!), and I    *)
  173.     (* have not yet finished breaking it up into procedures.            *)
  174.  
  175.     VAR background, text, w3: Window;
  176.         g1, g2, g3, g4, g5: Graph;
  177.         G4, G5, G6: Graph;
  178.         i: [0..63];
  179.         x: INTEGER;
  180.         t: LONGREAL;
  181.         qx, q1y, q2y, q3y: ARRAY [0..63] OF LONGREAL;
  182.  
  183.     BEGIN
  184.  
  185.         OpenWindow (background, 0, 0, 800, 500, 0, 7, single);
  186.         OpenWindow (text, 15, 210, 620, 310, 14, 0, double);
  187.         WriteString (text,'   Different types of graphs can be drawn. ');
  188.         WriteLn (text);
  189.         WriteString (text, '   For example:');  WriteLn(text);
  190.         WriteString (text, '              Simple linear-linear Plots');
  191.         WriteLn (text);
  192.  
  193.         (* Straight-line graph: g1 in w3.       *)
  194.  
  195.         OpenWindow (w3, 25, 30, 610, 190, 2, 4, double);
  196.         OpenGraph(g1,w3,linear,joined,30,20,570,150,0.0,0.0,10.0,10.0,none);
  197.         DrawAxes(g1, 2.0, 0, 2, TRUE, 2.0, 0, 2, TRUE);
  198.         FOR x := 0 TO 8 DO
  199.             AddPoint(g1, VAL(LONGREAL,x), VAL(LONGREAL,x-2))
  200.         END (* FOR *);
  201.         Pause;
  202.  
  203.         WriteString(text, '              with 5 different types of markers. ');
  204.         WriteLn(text);
  205.  
  206.         (* Add a few more graphs in the same window.    *)
  207.  
  208.         OpenGraph(g2,w3,linear,joined,30,20,570,150,0.0,0.0,10.0,10.0,square);
  209.         OpenGraph(g3,w3,linear,joined,30,20,570,150,0.0,0.0,10.0,10.0,cross);
  210.         OpenGraph(g4,w3,linear,joined,30,20,570,150,0.0,0.0,10.0,10.0,plus);
  211.         OpenGraph(g5,w3,linear,joined,30,20,570,150,0.0,0.0,10.0,10.0,diamond);
  212.  
  213.         FOR x := 0 TO 8 DO
  214.             AddPoint (g2, VAL(LONGREAL,x), VAL(LONGREAL,x-1));
  215.             AddPoint (g4, VAL(LONGREAL,x), VAL(LONGREAL,x+1));
  216.             AddPoint (g3, VAL(LONGREAL,x), VAL(LONGREAL,x));
  217.             AddPoint(g5, VAL(LONGREAL,x), VAL(LONGREAL,x+2));
  218.         END (* FOR *);
  219.  
  220.         OpenGraph(G6,w3,linear,joined,30,20,570,150,0.0,0.0,10.0,10.0,none);
  221.         OpenGraph(G5,w3,linear,joined,30,20,570,150,0.0,0.0,10.0,10.0,none);
  222.  
  223.         OpenGraph(G4,w3,linear,joined,30,20,570,150,0.0,0.0,10.0,10.0,none);
  224.  
  225.         t := 0.0;
  226.         FOR i := 0 TO 63 DO
  227.             qx[i] := 4.0*Sin(t)+5.0;
  228.             q1y[i] := 4.0*Cos(t)+5.0;
  229.             q2y[i] := 4.0*Cos(3.0*t)+5.0;
  230.             q3y[i] := 4.0*Cos(5.0*t)+5.0;
  231.             t := t+0.1;
  232.         END (* FOR *);
  233.  
  234.         Pause;
  235.         ClearWindow(w3);
  236.         WriteLn (text);
  237.         WriteString(text,
  238.                 '   It is also possible to plot arrays of x and y values.');
  239.         WriteLn(text);
  240.  
  241.         DrawAxes (G6, 2.0, 0, 2, TRUE, 2.0, 0, 2, TRUE);
  242.         DrawLines(G6,qx,q1y); Pause; ClearWindow(w3);
  243.         DrawAxes (G5, 2.0, 0, 2, TRUE, 2.0, 0, 2, TRUE);
  244.         DrawLines(G5,qx,q2y); Pause; ClearWindow(w3);
  245.         DrawAxes (G4, 2.0, 0, 2, TRUE, 2.0, 0, 2, TRUE);
  246.         DrawLines(G4,qx,q3y); Pause;
  247.  
  248.         (* Demonstration of graphs with different scales.       *)
  249.  
  250.         ScaleDemo;
  251.  
  252.         ClearWindow(text);
  253.         WriteString(text,'You can draw semi-log graphs ');
  254.  
  255.         BodeDemo (w3);
  256.  
  257.         WriteString(text,'and log-log graphs');
  258.         ClearWindow(w3);
  259.         LogLogDemo (w3);
  260.  
  261.         CloseWindow (w3);
  262.  
  263.         WriteLn(text);
  264.         WriteString(text,'And of course you can have multiple graphs on the screen.');
  265.  
  266.         TransferFunctionDemo;
  267.  
  268.         WriteLn (text);
  269.         WriteString (text,'End of graph demonstration');  Pause;
  270.         CloseWindow (text);
  271.         CloseWindow (background);
  272.  
  273.     END RunTheDemo;
  274.  
  275. (************************************************************************)
  276.  
  277. BEGIN
  278.     RunTheDemo;
  279. END GrafDemo.
  280.  
  281.