home *** CD-ROM | disk | FTP | other *** search
/ Mega CD-ROM 1 / megacd_rom_1.zip / megacd_rom_1 / PLOT / MVIS.ZIP / MVIS.PAS < prev    next >
Pascal/Delphi Source File  |  1991-07-01  |  5KB  |  159 lines

  1. program visualise_matrix;
  2. {look for the word "tuning" in this file to know what you can
  3. play around with}
  4.  
  5. uses crt, graph, time;
  6.  
  7. type
  8.     m2 = array[1..2, 1..2] of double;
  9.  
  10. procedure waitkey;
  11. var c:char;
  12. begin
  13.      while keypressed do c := readkey;
  14.      c := readkey;
  15. end;
  16.  
  17. function GetM(var M:m2):boolean;
  18.          {prompt user for 2 x 2 matrix.  If he hits <CR> return true
  19.           (meaning "quit") otherwise return false.}
  20. var
  21.    i, j:integer;
  22.    quit : boolean;
  23. begin
  24.      fillchar(M, sizeof(M), 0);
  25.      RestoreCrtMode;
  26.      write('Enter first row of matrix: ');
  27.      read(M[1, 1], M[1, 2]);
  28.      write('Enter 2nd row of matrix: ');
  29.      read(M[2, 1], M[2, 2]);
  30.      quit := true;
  31.      for i := 1 to 2 do
  32.          for j := 1 to 2 do
  33.              if M[i, j] <> 0.0 then quit := false;
  34.      GetM := quit;
  35. end;
  36.  
  37. procedure V(M:m2);
  38.  
  39.      procedure PutAxes;
  40.      begin
  41.           line(GetMaxX div 2, 0, GetMaxX div 2, GetMaxY);
  42.           line(0, GetMaxY div 2, GetMaxX, GetMaxY div 2);
  43.      end;
  44.  
  45.      procedure PutM(M:m2);
  46.      var s1, s2:string[5];
  47.      begin
  48.           str(M[1, 1]:3:1, s1);
  49.           str(M[1, 2]:3:1, s2);
  50.           OutTextXY(30, GetMaxY-50, s1);
  51.           OutTextXY(70, GetMaxY-50, s2);
  52.  
  53.           str(M[2, 1]:3:1, s1);
  54.           str(M[2, 2]:3:1, s2);
  55.           OutTextXY(30, GetMaxY-30, s1);
  56.           OutTextXY(70, GetMaxY-30, s2);
  57.      end;
  58.  
  59.      {Define world coordinate system:}
  60.      const
  61.           XMIN = -10.0; XMAX = 10.0;
  62.           YMIN = -10.0; YMAX = 10.0;
  63.  
  64.      procedure PutPoint(x, y :double);
  65.      var
  66.         locx, locy : integer;
  67.      begin
  68.           locx := round((x+XMAX)*GetMaxX/(XMAX-XMIN));
  69.           locy := round((YMAX-y)*GetMaxY/(YMAX-YMIN));
  70.           PutPixel(locx, locy, GetMaxColor);
  71.      end;
  72.  
  73.      procedure PutLine(s:string; x1, y1, x2, y2 : double);
  74.      var
  75.         lx1, lx2, ly1, ly2 : integer;
  76.      begin
  77.           lx1 := round((x1+XMAX)*GetMaxX/(XMAX-XMIN));
  78.           lx2 := round((x2+XMAX)*GetMaxX/(XMAX-XMIN));
  79.           ly1 := round((YMAX-y1)*GetMaxY/(YMAX-YMIN));
  80.           ly2 := round((YMAX-y2)*GetMaxY/(YMAX-YMIN));
  81.           line(lx1, ly1, lx2, ly2);
  82.           OutTextXY(lx2+10, ly2+10, s);
  83.      end;
  84.  
  85.      procedure Plot(M:m2);
  86.      const
  87.           TWOPI = 6.2830;
  88.           delta = 0.01;
  89.           TIME_PER_PICTURE = 10.0;
  90.           {delta and TIME_PER_PICTURE are your tuning parameters.
  91.           delta controls the resolution.  The number of pixels plotted
  92.           will be 2*pi/delta.  A smaller delta means more resolution, but
  93.           it'll get slower.
  94.  
  95.           TIME_PER_PICTURE is a lower-bound.  Normally, on fast processors,
  96.           the whole picture is created too quickly.  This program ensures
  97.           that the process of drawing the picture takes ATLEAST
  98.           TIME_PER_PICTURE seconds.  It might take more on a slow machine,
  99.           but it won't take less time than this limit.}
  100.      var
  101.         theta, x, y, tx, ty : double;
  102.         iterations : integer;
  103.         needed, spacing, waste : integer;
  104.         actually, shouldhave : real;
  105.      begin
  106.           PutAxes; PutM(M);
  107.           PutLine('col1', 0.0, 0.0, M[1, 1], M[2, 1]);
  108.           PutLine('col2', 0.0, 0.0, M[1, 2], M[2, 2]);
  109.           if (not keypressed) then delay(1000);
  110.           theta := 0.0;
  111.           iterations := 0;
  112.           needed := round(TWOPI/delta);  {it's going to take so many iterations}
  113.           spacing := needed div 100; {we're going to check on speed 100 times}
  114.  
  115.           RestartTimer;
  116.           repeat
  117.                 inc(iterations);
  118.                 if (not keypressed) and ((iterations mod spacing) = 0) then
  119.                 begin
  120.                      actually := Elapsed;
  121.                      shouldhave := TIME_PER_PICTURE*iterations/needed;
  122.                      waste := round((shouldhave - actually)*1000);
  123.                      if (waste > 0) then delay(waste);
  124.                 end;
  125.                 x := cos(theta); y := sin(theta);
  126.                 PutPoint(x, y);
  127.                 tx := M[1, 1]*x + M[1, 2]*y;
  128.                 ty := M[2, 1]*x + M[2, 2]*y;
  129.                 PutPoint(tx, ty);
  130.                 theta := theta + delta;
  131.           until theta > TWOPI;
  132.           waitkey;
  133.      end;
  134.  
  135. var
  136.    grDriver : Integer;
  137.    grMode   : Integer;
  138.    ErrCode  : Integer;
  139.  
  140. begin
  141.      grDriver := Detect;
  142.      InitGraph(grDriver,grMode,'.'); ErrCode := GraphResult;
  143.      if ErrCode = grOk then Plot(M)
  144.      else write('Graphics initialisation failed.');
  145. end;
  146.  
  147. var
  148.    quit : boolean;
  149.    M : m2;
  150. begin
  151.      clrscr;
  152.      quit := false;
  153.      repeat
  154.            quit := GetM(M);
  155.            if (not quit) then V(M);
  156.      until quit;
  157.      RestoreCrtMode;
  158. end.
  159.