home *** CD-ROM | disk | FTP | other *** search
/ ARM Club 1 / ARM_CLUB_CD.iso / contents / education / a / autopcb / !AutoPCB / c / Plot < prev    next >
Text File  |  1991-04-06  |  3KB  |  135 lines

  1. #include <stdio.h>
  2.  
  3. #include "werr.h"
  4.  
  5. #include "cell.h"
  6.  
  7. extern long GetCell(int, int, int);
  8.  
  9. extern void move(int, int);
  10. extern void draw(int, int);
  11. extern void circle(int, int, int);
  12.  
  13. struct _travel
  14. {
  15.   int mask;
  16.   int x0, y0, x1, y1;
  17. };
  18.  
  19. static struct
  20. {
  21.   int mask;
  22.   int x0, y0;
  23. } circle_travel[] =
  24. {
  25.   { HOLE_NORTH,        0,  1 },
  26.   { HOLE_NORTHEAST,    1,  1 },
  27.   { HOLE_EAST,         1,  0 },
  28.   { HOLE_SOUTHEAST,    1, -1 },
  29.   { HOLE_SOUTH,        0, -1 },
  30.   { HOLE_SOUTHWEST,   -1, -1 },
  31.   { HOLE_WEST,        -1,  0 },
  32.   { HOLE_NORTHWEST,   -1,  1 },
  33.  
  34.   { 0,                 0,  0 }
  35. }; 
  36.  
  37. static struct
  38. {
  39.   int mask;
  40.   int x0, y0, x1, y1;
  41. } line_travel[] =
  42. {
  43.   { LINE_HORIZONTAL,  -1,  0,  1,  0 },
  44.   { LINE_VERTICAL,     0, -1,  0,  1 },
  45.  
  46.   { DIAG_NEtoSW,       1,  1, -1, -1 },
  47.   { DIAG_SEtoNW,      -1,  1, -1,  1 },
  48.  
  49.   { CORNER_NORTHEAST,  0,  1,  1,  0 },
  50.   { CORNER_SOUTHEAST,  0, -1,  1,  0 },
  51.   { CORNER_SOUTHWEST,  0, -1, -1,  0 },
  52.   { CORNER_NORTHWEST,  0,  1, -1,  0 },
  53.  
  54.   { BENT_NtoSE,        0,  1,  1, -1 },
  55.   { BENT_NtoSW,        0,  1, -1, -1 },
  56.   { BENT_EtoSW,        1,  0, -1, -1 },
  57.   { BENT_EtoNW,        1,  0, -1,  1 },
  58.   { BENT_StoNW,        0, -1, -1,  1 },
  59.   { BENT_StoNE,        0, -1,  1,  1 },
  60.   { BENT_WtoNE,       -1,  0,  1,  1 },
  61.   { BENT_WtoSE,       -1,  0,  1, -1 },
  62.  
  63.   { ANGLE_NEtoSE,      1,  1,  1, -1 },
  64.   { ANGLE_SEtoSW,      1, -1, -1, -1 },
  65.   { ANGLE_SWtoNW,     -1, -1, -1,  1 },
  66.   { ANGLE_NWtoNE,     -1,  1,  1,  1 },
  67.  
  68.   { SHARP_NtoNE,       0,  1,  1,  1 },
  69.   { SHARP_EtoNE,       1,  0,  1,  1 },
  70.   { SHARP_EtoSE,       1,  0,  1, -1 },
  71.   { SHARP_StoSE,       0, -1,  1, -1 },
  72.   { SHARP_StoSW,       0, -1, -1, -1 },
  73.   { SHARP_WtoSW,      -1,  0, -1, -1 },
  74.   { SHARP_WtoNW,      -1,  0, -1,  1 },
  75.   { SHARP_NtoNW,       0,  1, -1,  1 },
  76.  
  77.   { 0,                 0,  0,  0,  0 }
  78. };
  79.  
  80. static void traverse(int x0, int y0, int *col, int *row, int side)
  81. {
  82.   int i, x, fromcol, fromrow;
  83.  
  84.   fromcol = *col;
  85.   fromrow = *row;
  86.  
  87.   *col += x0;
  88.   *row += y0;
  89.  
  90.   x = GetCell(*row, *col, side);
  91.   if (x & HOLE)
  92.   {
  93.     draw(*col * 50 + 25, *row * 50 + 25);
  94.   }
  95.   else
  96.     for (i = 0; line_travel[i].mask != 0; i++)
  97.       if (x & line_travel[i].mask)
  98.       {
  99.         if (line_travel[i].x0 == x0 && line_travel[i].y0 == y0)
  100.         {
  101.           traverse(x0, y0, col, row, side);
  102.         }
  103.         else if (line_travel[i].x1 == x0 && line_travel[i].y1 == y0)
  104.         {
  105.           traverse(x0, y0, col, row, side);
  106.         }
  107.         else if (line_travel[i].x0 == -x0 && line_travel[i].y0 == -y0)
  108.         {
  109.           draw(*col * 50 + 25, *row * 50 + 25);
  110.           traverse(line_travel[i].x1, line_travel[i].y1, col, row, side);
  111.         }
  112.         else if (line_travel[i].x1 == -x0 && line_travel[i].y1 == -y0)
  113.         {
  114.           draw(*col * 50 + 25, *row * 50 + 25);
  115.           traverse(line_travel[i].x0, line_travel[i].y0, col, row, side);
  116.         }
  117.         else
  118.           werr(0, "Unable to traverse at (%d, %d) from (%d, %d)",
  119.                   *col, *row, fromcol, fromrow);
  120.       }
  121. }
  122.  
  123. void PlotLine(int x, int col, int row, int side)
  124. {
  125.   int i;
  126.  
  127.   if (x & ~HOLE)
  128.   {
  129.     move(col * 50 + 25, row * 50 + 25);
  130.     for (i = 0; circle_travel[i].mask != 0; i++)
  131.       if (x & circle_travel[i].mask)
  132.         traverse(circle_travel[i].x0, circle_travel[i].y0, &col, &row, side);
  133.   }
  134. }
  135.