home *** CD-ROM | disk | FTP | other *** search
/ Simtel MSDOS 1992 September / Simtel20_Sept92.cdr / msdos / ddjmag / ddj8605.arc / GRAPHCS.MAY < prev    next >
Text File  |  1986-05-31  |  8KB  |  271 lines

  1. /*
  2.  *  SINE.C
  3.  *
  4.  *  Plot sin(x) vs. x on an enhanced color display with
  5.  *  an IBM enhanced graphics adapter in the high resolution mode.
  6.  *  Purpose is to test the video routines.
  7.  *
  8.  *  by Nabajyoti Barkakati, Silver Spring, MD 20904.
  9.  *
  10.  */
  11.  
  12. #include <stdio.h>
  13. #include <math.h>
  14.  
  15. #define BLUE   1                       /* Color number 1 is BLUE     */
  16. #define RED    4                       /* Color number 4 is RED      */
  17. #define BOTTOM 4                       /* Bottom margin              */
  18. #define TOP    345                     /* Top margin                 */
  19. #define LEFT   4                       /* Left margin                */
  20. #define RIGHT  635                     /* Right margin               */
  21. #define TWOPI  6.283                   /* Approximate value of 2 Pi  */
  22. #define MAXPNT 100                     /* Points on the sinusoid     */
  23.  
  24. main()
  25. {
  26.     int i, x, y, oldx, oldy, midpoint;
  27.     double xd, yd, ampl;
  28.  
  29.     v_init (RED);                      /* Initialize the display     */
  30.  
  31.     midpoint = (TOP - BOTTOM)/2;
  32.     ampl = (double)midpoint - (double)BOTTOM;
  33.  
  34.     oldx = LEFT;
  35.     oldy = midpoint;
  36.  
  37.     for (i=0; i<=MAXPNT; i++)
  38.     {
  39.         yd = ampl * sin(TWOPI * ((double)i)/((double)MAXPNT));
  40.         xd = ((double)RIGHT - (double)LEFT)* (double)i / (double)MAXPNT;
  41.         x  = LEFT + (int)xd;
  42.         y  = midpoint + (int)yd;
  43.  
  44. /* Draw a line from the old point to the new point */
  45.  
  46.         v_draw (oldx, oldy, x, y, BLUE);
  47.  
  48. /* Save the new coordinates */
  49.  
  50.         oldx = x;
  51.         oldy = y;
  52.     }
  53.  
  54. /* Draw a box around the plot */
  55.  
  56.     v_draw (LEFT, BOTTOM, RIGHT, BOTTOM, BLUE);
  57.     v_draw (RIGHT, BOTTOM, RIGHT, TOP, BLUE);
  58.     v_draw (RIGHT, TOP, LEFT, TOP, BLUE);
  59.     v_draw (LEFT, TOP, LEFT, BOTTOM, BLUE);
  60.  
  61. /* Done */
  62.  
  63. }
  64.  
  65.  
  66.  
  67.  
  68.  
  69.  
  70.  
  71. /*
  72.  *  VIDEO.C
  73.  *
  74.  *  This file contains the video display modules. Uses the int86
  75.  *  function of Lattice C 2.14 to draw graphs on an enhanced color
  76.  *  display with the IBM enhanced graphics adapter.
  77.  *
  78.  *  by N. Barkakati, Silver Spring, MD 20904.
  79.  *
  80.  */
  81.  
  82. #include <dos.h>
  83. #define void       int
  84. #define EGAMODE    16                   /* EGA in high resolution      */
  85. #define MAXROW     24
  86. #define MAXCOL     79
  87. #define MAXYDOT    349                  /* Max. columns and rows on    */
  88. #define MAXXDOT    639                  /* enhanced color display      */
  89.  
  90. #define BIOS_VIDEO 16                   /* BIOS Video service int. no. */
  91. #define SETMODE    0                    /* Service: set video mode     */
  92. #define SETCOLOR   11                   /* Service: set color pallette */
  93. #define WRITE_PIX  12                   /* Service: write pixel        */
  94.  
  95. static union REGS  xr,yr;               /* See dos.h for explanation   */
  96.  
  97. /*  v _ i n i t
  98.  *
  99.  *  Initialize the display. Put it in EGA hi-resolution mode.
  100.  *  Set background color.
  101.  *
  102.  */
  103. void v_init(bgcolor)
  104. int bgcolor;
  105. {
  106. /*  ROM BIOS Video functions -- mode 16 is EGA in high-resolution
  107.  *  (640x350 pixels)
  108.  */
  109.     xr.h.ah = SETMODE;
  110.     xr.h.al = EGAMODE;
  111.     int86 (BIOS_VIDEO, &xr, &yr);
  112.  
  113. /*  Set color.
  114.  */
  115.     xr.h.ah = SETCOLOR;
  116.     xr.h.bh = 0;
  117.     xr.h.bl = bgcolor;
  118.     int86 (BIOS_VIDEO, &xr, &yr);
  119.  
  120. /* Done */
  121. }
  122. /*-------------------------------------------------------------------*/
  123.  
  124. /*
  125.  *  v _ d r a w
  126.  *
  127.  *  Draw a line of specified color between the two points (x1,y1) 
  128.  *  and (x2,y2). Uses Bresenham's Algorithm described in:
  129.  *  J.D. Foley and A. Van Dam, FUNDAMENTALS OF INTERACTIVE 
  130.  *  COMPUTER GRAPHICS, Addison-Wesley, 1982, pp.433-435.
  131.  *
  132.  */
  133. void v_draw(x1, y1, x2, y2, color)
  134. int x1, y1, x2, y2, color;
  135. {
  136.     int dx, dy, incr1, incr2, incr3, d, x, y, xend, yend;
  137.     dx = abs(x2-x1);
  138.     dy = abs(y2-y1);
  139.     if (dy<=dx)
  140.     {               /* Absolute value of slope of line is less than 1 */
  141.         if (x1>x2)
  142.         {                 /* Start at point with smaller x coordinate */
  143.             x = x2;
  144.             y = y2;
  145.             xend = x1;
  146.             dy = y1-y2;
  147.         }
  148.         else
  149.         {
  150.             x = x1;
  151.             y = y1;
  152.             xend = x2;
  153.             dy = y2-y1;
  154.         }
  155.         d = 2*dy-dx;
  156.         incr1 = 2*dy;
  157.         incr2 = 2*(dy-dx);
  158.         incr3 = 2*(dy+dx);
  159.         putdot (x, y, color);  
  160.         while (x < xend)
  161.         {
  162.             x += 1;
  163.             if (d >= 0)
  164.             {
  165.                 if (dy<=0)
  166.                 {                          /* Negative or zero slope */
  167.                     d += incr1;
  168.                 }
  169.                 else
  170.                 {                                  /* Positive slope */
  171.                     y += 1;
  172.                     d += incr2;
  173.                 }
  174.             }
  175.             else
  176.             {
  177.                 if (dy>=0)
  178.                 {                          /* Negative or zero slope */
  179.                     d += incr1;
  180.                 }
  181.                 else
  182.                 {                                  /* Positive slope */
  183.                 y -= 1;
  184.                 d += incr3;
  185.                 }
  186.             }
  187.             putdot (x, y, color);
  188.         }                                               /* end while */
  189.     }                                                   /* end if    */
  190.     else                /* Absolute value of slope is greater than 1 */
  191.     {
  192.         if (y1>y2)            
  193.         {              /* Start with point with samller y coordinate */
  194.             y = y2;
  195.             x = x2;
  196.             yend = y1;
  197.             dx = x1-x2;
  198.         }
  199.         else
  200.         {
  201.             y = y1;
  202.             x = x1;
  203.             yend = y2;
  204.         }
  205.         d = 2*dx-dy;
  206.         incr1 = 2*dx;
  207.         incr2 = 2*(dx-dy);
  208.         incr3 = 2*(dx+dy);
  209.         putdot (x, y, color);
  210.         while (y < yend)
  211.         {
  212.             y += 1;
  213.             if(d >= 0)
  214.             {
  215.                 if (dx <= 0)
  216.                 {                          /* Negative or zero slope */
  217.                     d += incr1;
  218.                 }
  219.                 else
  220.                 {                                  /* Positive slope */
  221.                     x += 1;
  222.                     d += incr2;
  223.                 }
  224.             }
  225.             else
  226.             {
  227.                 if (dx >= 0)
  228.                 {                          /* Negative or zero slope */
  229.                     d += incr1;
  230.                 }
  231.                 else
  232.                 {                                  /* Positive slope */
  233.                     x -= 1;
  234.                     d += incr3;
  235.                 }
  236.             }
  237.             putdot (x, y, color);
  238.         }                                               /* end while */
  239.     }                                                   /* end else  */
  240. /* Done */
  241. }
  242. /*-------------------------------------------------------------------*/
  243.  
  244. /*
  245.  *  p u t d o t
  246.  *
  247.  *  Put a dot of specified color at location (x,y) on screen.
  248.  *  Check if dot coordinates are within screen bounds.
  249.  *                
  250.  *                ^ y-axis
  251.  *                |_________
  252.  *  Convention:   |        |   Origin at lower left corner of screen.
  253.  *                |        |
  254.  *         (0,0)->|________| x axis
  255.  *
  256.  */
  257. void putdot(x, y, color)
  258. int x, y, color;
  259. {
  260.     if ( x<0 | x>MAXXDOT | y<0 | y>MAXYDOT ) return;
  261.  
  262.     xr.x.dx = MAXYDOT - y;
  263.     xr.x.cx = x;
  264.     xr.h.ah = WRITE_PIX;
  265.     xr.h.al = color;
  266.     int86 (BIOS_VIDEO, &xr, &yr);
  267.  
  268. /* Done */
  269.  
  270. }
  271.