home *** CD-ROM | disk | FTP | other *** search
/ SuperHack / SuperHack CD.bin / CODING / GRAPHICS / COMMON.ZIP / LINE.TXT < prev    next >
Encoding:
Text File  |  1996-01-09  |  5.1 KB  |  243 lines

  1. /*
  2.  
  3.     line.h
  4.  
  5.     Copyright 1994, August 22 by Alec Russell, ALL rights reserved
  6.     Permission granted to use as you wish.
  7.  
  8.     Created - 1994/8/22
  9.  
  10.     A slow hi-level line drawing func. Handy to move sprites
  11.     along arbitrary straight line paths.
  12.  
  13.     History:
  14.         New file
  15.  
  16. */
  17.  
  18. #ifndef DEF_LINE
  19. #define DEF_LINE 1
  20.  
  21. #include <g_def.h>  // BYTE etc...
  22.  
  23. enum QUAD
  24. {
  25.    Q_ZERO,
  26.    Q_ONE,
  27.    Q_TWO,
  28.    Q_THREE,
  29.    Q_VERT,
  30.    Q_HORZ,
  31.    Q_SAME
  32. };
  33.  
  34. typedef struct
  35.    {
  36.    BYTE quad;
  37.    short step;
  38.    short x, y, x1, y1;
  39.    short ai, bi, yi, d, dx, dy;
  40.    }
  41. d_line_t;
  42.  
  43. void init_dline(short x0, short y0, short x1, short y1, short step, d_line_t *dl);
  44. short next_dline(d_line_t *dl);
  45.  
  46. #endif
  47.  
  48. /* ------------------------------ EOF -------------------------------- */
  49.  
  50.  
  51.  
  52. /*
  53.  
  54.     line.c
  55.  
  56.     Copyright 1994, August 22 by Alec Russell, ALL rights reserved
  57.     Permission granted to use as you wish.
  58.  
  59.     Created - 1994/8/22
  60.  
  61.     generic line drawing, pretty slow, but good for smooth
  62.     animation for items following arbitrary lines
  63.  
  64.     History:
  65.         New file
  66.  
  67. */
  68.  
  69. #include <line.h>
  70. #include <stdlib.h>
  71.  
  72.  
  73. /* ---------------------- init_dline() ------------------ August 22,1994 */
  74. void init_dline(short x0, short y0, short x1, short y1, short step, d_line_t *dl)
  75. {
  76.  
  77.    dl->step=step;
  78.    dl->x=x0;
  79.    dl->y=y0;
  80.  
  81.    dl->x1=x1;
  82.    dl->y1=y1;
  83.  
  84.    dl->dy=abs(y1 - y0);
  85.    dl->dx=abs(x1 - x0);
  86.  
  87.    if ( x1 == x0 && y0 == y1 )
  88.       {
  89.       dl->quad=Q_SAME;
  90.       }
  91.    else
  92.       {
  93.       if ( x1 == x0 )
  94.          {
  95.          dl->quad=Q_VERT;
  96.          if ( y1 > y0 )
  97.             dl->dy=1;
  98.          else
  99.             dl->dy=-1;
  100.          }
  101.       else
  102.          {
  103.          if ( y1 == y0 )
  104.             {
  105.             dl->quad=Q_HORZ;
  106.             if ( x1 > x0 )
  107.                dl->dy=1;
  108.             else
  109.                dl->dy=-1;
  110.             }
  111.          else
  112.             {
  113.             if ( x1 > x0 && dl->dy < dl->dx )
  114.                {
  115. pr2("quad = zero");
  116.                dl->quad=Q_ZERO;
  117.                dl->yi=y1 > y0 ? 1 : -1;
  118.                dl->dx=x1 - x0;
  119.                dl->dy=abs(y1 - y0);
  120.                dl->d=(dl->dy<<1) - dl->dx;
  121.                dl->ai=(dl->dy - dl->dx)<<1;
  122.                dl->bi=dl->dy<<1;
  123.                }
  124.             else
  125.                {
  126.                if ( x1 < x0 && dl->dy < dl->dx )
  127.                   {
  128.                   dl->quad=Q_TWO;
  129. pr2("quad = two");
  130.                   dl->yi=y1 > y0 ? 1 : -1;
  131.                   dl->dx=x0 - x1;
  132.                   dl->dy=abs(y1 - y0);
  133.                   dl->d=(dl->dy<<1) - dl->dx;
  134.                   dl->ai=(dl->dy - dl->dx)<<1;
  135.                   dl->bi=dl->dy<<1;
  136.                   }
  137.                else
  138.                   {
  139.                   if ( y1 < y0 )
  140.                      {
  141. pr2("quad = one");
  142.                      dl->quad=Q_ONE;
  143.                      dl->yi=x1 > x0 ? 1 : -1;
  144.                      dl->dx=y0 - y1;
  145.                      dl->dy=abs(x1 - x0);
  146.                      dl->d=(dl->dy<<1) - dl->dx;
  147.                      dl->ai=(dl->dy - dl->dx)<<1;
  148.                      dl->bi=dl->dy<<1;
  149.                      }
  150.                   else
  151.                      {
  152. pr2("quad = three");
  153.                      dl->quad=Q_THREE;
  154.                      dl->yi=x1 > x0 ? 1 : -1;
  155.                      dl->dx=y1 - y0;
  156.                      dl->dy=abs(x1 - x0);
  157.                      dl->d=(dl->dy<<1) - dl->dx;
  158.                      dl->ai=(dl->dy - dl->dx)<<1;
  159.                      dl->bi=dl->dy<<1;
  160.                      }
  161.                   }
  162.                }
  163.             }
  164.  
  165.          }
  166.       }
  167. }
  168.  
  169.  
  170. /* ---------------------- next_dline() ------------------ August 22,1994 */
  171. short next_dline(d_line_t *dl)
  172. {
  173.    short done=0;
  174.    short i;
  175.  
  176.    i=dl->step;
  177.    while ( i && !done )
  178.       {
  179.       switch ( dl->quad )
  180.          {
  181.          case Q_ZERO:
  182.             if ( dl->d >= 0 )
  183.                {
  184.                dl->y+=dl->yi;
  185.                dl->d+=dl->ai;
  186.                }
  187.             else
  188.                dl->d+=dl->bi;
  189.             dl->x++;
  190.             break;
  191.  
  192.          case Q_ONE:
  193.             if ( dl->d >= 0 )
  194.                {
  195.                dl->x+=dl->yi;
  196.                dl->d+=dl->ai;
  197.                }
  198.             else
  199.                dl->d+=dl->bi;
  200.             dl->y--;
  201.             break;
  202.  
  203.          case Q_TWO:
  204.             if ( dl->d >= 0 )
  205.                {
  206.                dl->y+=dl->yi;
  207.                dl->d+=dl->ai;
  208.                }
  209.             else
  210.                dl->d+=dl->bi;
  211.             dl->x--;
  212.             break;
  213.  
  214.          case Q_THREE:
  215.             if ( dl->d >= 0 )
  216.                {
  217.                dl->x+=dl->yi;
  218.                dl->d+=dl->ai;
  219.                }
  220.             else
  221.                dl->d+=dl->bi;
  222.             dl->y++;
  223.             break;
  224.  
  225.          case Q_VERT:
  226.             dl->y+=dl->dy;
  227.             break;
  228.  
  229.          case Q_HORZ:
  230.             dl->x+=dl->dy;
  231.             break;
  232.          }
  233.  
  234.       if ( dl->x == dl->x1 && dl->y == dl->y1 )
  235.          done=1;
  236.  
  237.       i--;
  238.       }
  239.  
  240.    return done;
  241. }
  242.  
  243.