home *** CD-ROM | disk | FTP | other *** search
/ Oakland CPM Archive / oakcpm.iso / sigm / vol131 / plot.pas < prev    next >
Encoding:
Pascal/Delphi Source File  |  1984-04-29  |  3.3 KB  |  167 lines

  1.  
  2.  
  3.  
  4.  
  5. PROCEDURE PLOT(VAR M:INTEGER;VAR X,Y,YCALC:DATA_ARRAY);
  6.  
  7. {M is the number of data points in the transmitted arrays.}
  8. {X is the array of the independent variable.}
  9. {Y is the array of the dependent variable.}
  10. {YCALC is the array of the Expected values of Y.}
  11.  
  12. {This procedure plots Y and YCALC as functions of X for M points.}
  13. {If M is negative,only Y is plotted.}
  14.  
  15. {From: MILLER,A.R;PASCAL PROGRAMS FOR SCIENTISTS AND ENGINEERS      }
  16. {          Berkeley,CA;SYBEX 1981;   p.146                          }
  17.  
  18.             {MODIFIED BY G.M.ACLAND:AUGUST 1981.}
  19.  
  20. CONST
  21.    BLANK=' ';
  22.    LINEL=51;
  23.  
  24. VAR
  25.    YLABEL:ARRAY[1..6] OF REAL;
  26.    OUT:ARRAY[1..LINEL] OF CHAR;
  27.    LINES,I,J,JP,L,N:INTEGER;
  28.    ISKIP,YONLY:BOOLEAN;
  29.    XLOW,XHIGH,XNEXT,XLABEL,XSCALE,SIGNXS,
  30.    YMIN,YMAX,CHANGE,YSCALE,YS10:REAL;
  31.  
  32. FUNCTION PSCALE(P:REAL):INTEGER;
  33.  
  34. BEGIN {PSCALE}
  35.   PSCALE:=TRUNC((P-YMIN)/YSCALE + 1)
  36. END {PSCALE};
  37.  
  38. PROCEDURE OUTLIN(XNAME: REAL);
  39. {OUTPUT A LINE}
  40.  
  41. VAR
  42.   I,MAX:INTEGER;
  43.  
  44. BEGIN {OUTLIN}
  45.   WRITE(XNAME:8:2,'|') {LINE LABEL};
  46.   MAX:= LINEL + 1;
  47.   REPEAT  {SKIP BLANKS ON END OF LINE}
  48.     MAX:=MAX-1
  49.   UNTIL(OUT[MAX]<>BLANK)OR(MAX=1);
  50. FOR I:=1 TO MAX DO
  51.   WRITE(OUT[I]);
  52. WRITELN;
  53. FOR I:=1 TO MAX DO
  54.   OUT[I]:=BLANK  {BLANK NEXT LINE}
  55. END {OUTLIN};
  56.  
  57. PROCEDURE SETUP(INDEX:INTEGER);
  58. {SETUP THE SYMBOLS FOR PLOTTING Y AND YCALC}
  59.  
  60. CONST
  61.   STAR='*';
  62.   PLUS='+';
  63.  
  64. VAR
  65.   I:INTEGER;
  66.  
  67. BEGIN {SETUP}
  68.   I:= PSCALE(Y[INDEX]);
  69.   OUT[I]:=PLUS;
  70.   IF NOT YONLY THEN
  71.     BEGIN {SETUP FOR YCALC ALSO}
  72.       I:=PSCALE(YCALC[INDEX]);
  73.       OUT[I]:= STAR
  74.     END  {SETUP FOR YCALC}
  75. END {SETUP};
  76.  
  77. BEGIN  {MAIN PLOTTING ALGORITHM}
  78.   IF M>0 THEN  {PLOT BOTH Y AND YCALC}
  79.     BEGIN
  80.       N:=M;
  81.       YONLY:=FALSE
  82.     END
  83.   ELSE  {ONLY PLOT Y}
  84.     BEGIN
  85.       N:=-M;
  86.       YONLY:=TRUE
  87.     END;
  88. {NOW SPACE OUT ALTERNATE LINES}
  89. LINES:=2*(N-1)+1;
  90. WRITELN;
  91. XLOW:=X[1];
  92. XHIGH:=X[N];
  93. YMAX:=Y[1];
  94. YMIN:=YMAX;
  95. XSCALE:=(XHIGH-XLOW)/(LINES-1);
  96. SIGNXS:=1.0;
  97. IF XSCALE <0.0 THEN SIGNXS:=-1.0;
  98. FOR I := 1 TO N DO
  99.   BEGIN
  100.     IF Y[I]<YMIN THEN YMIN:=Y[I];
  101.     IF Y[I]>YMAX THEN YMAX:=Y[I];
  102.     IF NOT YONLY THEN
  103.       BEGIN
  104.         IF YCALC[I]<YMIN THEN YMIN:=YCALC[I];
  105.         IF YCALC[I]>YMAX THEN YMAX:=YCALC[I]
  106.       END {IF YONLY}
  107.   END;
  108. YSCALE:=(YMAX-YMIN)/(LINEL-1);
  109. YS10:=YSCALE*10;
  110. YLABEL[1]:=YMIN  {Y AXIS};
  111. FOR I:=1 TO 4 DO
  112.   YLABEL[I+1]:=YLABEL[I]+YS10;
  113. YLABEL[6]:=YMAX;
  114. FOR I:=1 TO LINEL DO
  115.   OUT[I]:=BLANK  {BLANK LINE};
  116. SETUP(1);
  117. L:=1;
  118. XLABEL:=XLOW;
  119. ISKIP:= FALSE;
  120.  
  121. WRITE('Y=');
  122. FOR I:= 1 TO 6 DO
  123.   WRITE(YLABEL[I]:8:1,'  ');
  124. WRITELN;
  125. WRITE(' ');
  126. FOR I:= 1 TO 6 DO
  127.   WRITE(' - - - -|-');
  128. WRITELN;
  129. WRITELN('     X  |');
  130. WRITELN('     "  |');
  131. FOR I:= 2 TO LINES DO  {SET UP A LINE}
  132.   BEGIN
  133.     XNEXT:=XLOW + XSCALE*(I-1);
  134.     IF ISKIP THEN WRITELN('     -  |')
  135.     ELSE
  136.       BEGIN
  137.        L:=L+1;
  138.        WHILE
  139.         (X[L]-(XNEXT-0.5*XSCALE))*SIGNXS <= 0.0
  140.        DO BEGIN
  141.          SETUP(L)  {SETUP PRINT LINE};
  142.          L:=L+1
  143.        END {WHILE LOOP};
  144.        OUTLIN(XLABEL)  {PRINT A LINE};
  145.        FOR J:=1 TO LINEL DO
  146.          OUT[J]:= BLANK  {BLANK LINE}
  147.     END {IF ISKIP BLOCK};
  148.   IF (X[L]-(XNEXT+0.5*XSCALE))*SIGNXS>0.0
  149.    THEN ISKIP:=TRUE
  150.   ELSE
  151.    BEGIN
  152.      ISKIP:=FALSE;
  153.      XLABEL:=XNEXT;
  154.      SETUP(L)  {SETUP PRINT LINE}
  155.    END
  156.   END {FOR LOOP};
  157.  OUTLIN(XHIGH)  {LAST LINE};
  158.  WRITE(' ');
  159.  FOR I:=1 TO 6 DO
  160.    WRITE(' - - - -|-');
  161.  WRITELN;
  162.  WRITE(' ');
  163.  FOR I:= 1 TO 6 DO
  164.    WRITE(YLABEL[I]:9:1,BLANK);
  165.  WRITELN;
  166. END {PLOT};
  167.