home *** CD-ROM | disk | FTP | other *** search
/ CP/M / CPM_CDROM.iso / beehive / utilitys / gifpas.ark / PLOT.PAS < prev    next >
Pascal/Delphi Source File  |  1992-03-18  |  5KB  |  219 lines

  1. CONST    LineSpacing = #13#27'J'#24;
  2.          GrafMode    = #27'a'#1#27'*'#39;
  3.          PrintReset  = #27'@';
  4.          InitCalled  : Boolean = False;
  5.          xSize       = 1536;
  6.          ySize       = 1024;
  7.          xSizeM1     = 1535;
  8.          ySizeM1     = 1023;
  9.  
  10. TYPE     xRange  = 0..xSizeM1;
  11.          yRange  = 0..ySizeM1;
  12.          VMA     = ARRAY[yRange,0..2] OF Byte;
  13.          PlotRec = RECORD
  14.                      xB,yB,zB : Real;
  15.                      xM,yM,zM : Real;
  16.                      p,q,s,t  : Real
  17.                    END;
  18.  
  19. VAR      xPos,yPos : Integer;
  20.          Data3D    : PlotRec;
  21.          VMD       : FILE OF VMA;
  22.          Buff      : VMA;
  23.  
  24. PROCEDURE InitPlot;
  25. VAR      i,j  : Integer;
  26. BEGIN
  27.   IF NOT InitCalled THEN
  28.     BEGIN
  29.       Assign( VMD,'f:Dummy.$$$' );
  30.       InitCalled := True
  31.     END;
  32.   FillChar(Buff,SizeOf(Buff),#0);
  33.   Rewrite( VMD );
  34.   FOR i := 0 TO (xSizeM1 DIV 24) DO
  35.     Write( VMD,Buff );
  36.   Reset( VMD );
  37.   xPos := 0; yPos := 0
  38. END { InitPlot };
  39.  
  40. PROCEDURE Plot(x,y : Integer);
  41. VAR      i,j : Integer;
  42. BEGIN
  43.   IF InitCalled AND (0 <= x) AND (x <= xSizeM1) AND (0 <= y) AND (y <= ySizeM1) THEN
  44.     BEGIN
  45.       IF FilePos( VMD ) <> (x DIV 24) THEN
  46.         BEGIN
  47.           Write( VMD,Buff );
  48.           Seek( VMD,x DIV 24 );
  49.           Read(  VMD,Buff );
  50.           Seek( VMD,x DIV 24 )
  51.         END;
  52.       i := (x MOD 24) DIV 8;
  53.       j := x MOD 8;
  54.       Buff[y,i] := Buff[y,i] OR (128 SHR j)
  55.     END
  56. END { Plot };
  57.  
  58. PROCEDURE InvertDot(x,y : Integer);
  59. VAR      i,j : Integer;
  60. BEGIN
  61.   IF InitCalled AND (0 <= x) AND (x <= xSizeM1) AND (0 <= y) AND (y <= ySizeM1) THEN
  62.     BEGIN
  63.       IF FilePos( VMD ) <> (x DIV 24) THEN
  64.         BEGIN
  65.           Write( VMD,Buff );
  66.           Seek( VMD,x DIV 24 );
  67.           Read(  VMD,Buff );
  68.           Seek( VMD,x DIV 24 )
  69.         END;
  70.       i := (x MOD 24) DIV 8;
  71.       j := x MOD 8;
  72.       Buff[y,i] := Buff[y,i] XOR (128 SHR j)
  73.     END
  74. END { InvertDot };
  75.  
  76. PROCEDURE Line( x1,y1,x2,y2 : Integer );
  77. VAR      x,y,d,dx,dy,DirX,DirY,i : Integer;
  78. BEGIN
  79.   IF x1 < x2 THEN
  80.     DirX :=  1
  81.   ELSE
  82.     DirX := -1;
  83.   IF y1 < y2 THEN
  84.     DirY :=  1
  85.   ELSE
  86.     DirY := -1;
  87.   x := x1;
  88.   y := y1;
  89.   dx := Abs( x2 - x1 );
  90.   dy := Abs( y2 - y1 );
  91.   IF dx >= dy THEN
  92.     BEGIN
  93.       dy := dy SHL 1;
  94.       d  := dx - dy;
  95.       dx := dx SHL 1;
  96.       FOR i := 0 TO dx SHR 1 DO
  97.         BEGIN
  98.           Plot(x,y);
  99.           IF d > 0 THEN
  100.             BEGIN
  101.               y := y + DirY;
  102.               d := d + dy - dx
  103.             END
  104.           ELSE
  105.             d := d + dy;
  106.           x := x + DirX
  107.         END
  108.     END
  109.   ELSE
  110.     BEGIN
  111.       dx := dx SHL 1;
  112.       d  := dy - dx;
  113.       dy := dy SHL 1;
  114.       FOR i := 0 TO dy SHR 1 DO
  115.         BEGIN
  116.           Plot(x,y);
  117.           IF d > 0 THEN
  118.             BEGIN
  119.               x := x + DirX;
  120.               d  := d + dx - dy
  121.             END
  122.           ELSE
  123.             d := d + dx;
  124.           y := y + DirY
  125.         END
  126.     END
  127. END { Line };
  128.  
  129. PROCEDURE PlotAbs(x,y : Integer);
  130. BEGIN
  131.   Line(xPos,yPos,x,y);
  132.   xPos := x; yPos := y
  133. END { PlotAbs };
  134.  
  135. PROCEDURE PlotRel(dx,dy : Integer);
  136. BEGIN
  137.   PlotAbs(xPos + dx, yPos + dy)
  138. END { Plotrel };
  139.  
  140. PROCEDURE MoveAbs(x,y : Integer);
  141. BEGIN
  142.   xPos := x; yPos := y
  143. END { MoveAbs };
  144.  
  145. PROCEDURE MoveRel(dx,dy : Integer);
  146. BEGIN
  147.   xPos := xPos + dx; yPos := yPos + dy
  148. END { MoveRel };
  149.  
  150. PROCEDURE Cursor(x,y: Integer);
  151. BEGIN
  152.   MoveAbs(x,y);
  153.   MoveRel(5,0);
  154.   PlotRel(-10,0);
  155.   MoveRel(5,5);
  156.   PlotRel(0,-10);
  157.   MoveRel(0,5)
  158. END { Cursor };
  159.  
  160. PROCEDURE Cursor2(x,y: Integer);
  161. BEGIN
  162.   MoveAbs(x,y);
  163.   MoveRel(4,4);
  164.   PlotRel(-8,-8);
  165.   MoveRel(8,0);
  166.   PlotRel(-8,8);
  167.   MoveRel(4,-4)
  168. END { Cursor2 };
  169.  
  170. PROCEDURE ViewPoint(xBet,yBet,zBet,xFl,yFl,zFl : Real);
  171. BEGIN
  172.   WITH Data3D DO
  173.     BEGIN
  174.       xB := xBet; yB := yBet; zB := zBet;
  175.       xM := xFl;  yM := yFl;  zM := zFl;
  176.       p := Sqrt(Sqr(xM-xB) + Sqr(yM-yB));
  177.       q := Sqrt(Sqr(p) + Sqr(zM-zB));
  178.       IF p = 0 THEN s := 1 ELSE s := (yM-yB)/p;
  179.       IF p = 0 THEN t := 0 ELSE t := (xM-xB)/p
  180.     END
  181. END { ViewPoint };
  182.  
  183. PROCEDURE Calc3D(x,y,z : Real; VAR u,v,r : Real);
  184. BEGIN
  185.   WITH Data3D DO
  186.     BEGIN
  187.       r := (xM-xB)*(x-xB) + (yM-yB)*(y-yB) + (zM-zB)*(z-zB);
  188.       u := (s*q*(x-xB) - t*q*(y-yB))/r;
  189.       v := (-t*(zM-zB)*(x-xB) - s*(zM-zB)*(y-yB) + p*(z-zB))/r
  190.     END
  191. END { Calc3D };
  192.  
  193. PROCEDURE EndPlot;
  194. VAR      i,j : Integer;
  195. BEGIN
  196.   IF InitCalled THEN
  197.     BEGIN
  198.       Write( VMD,Buff );
  199.       Reset( VMD );
  200.       WriteLn( LST );
  201.       REPEAT
  202.         Read( VMD,Buff );
  203.         Write( LST, GrafMode, Chr((ySize) MOD 256), Chr((ySize) DIV 256) );
  204.         FOR i := 0 TO ySize-1 DO
  205.           FOR j := 0 TO 2 DO
  206.             Write( LST,Chr(Buff[i,j]) );
  207.         Write( LST, LineSpacing)
  208.       UNTIL EOF( VMD );
  209.       Write( LST, #12, PrintReset );
  210.       Close( VMD )
  211.     END
  212. END { EndPlot };
  213.  
  214. PROCEDURE DonePlot;
  215. BEGIN
  216.   IF InitCalled THEN
  217.     Erase( VMD )
  218. END { DonePlot };
  219.