home *** CD-ROM | disk | FTP | other *** search
/ Programmer 7500 / MAX_PROGRAMMERS.iso / CLIPPER / MISC / EMXLIB8F.ZIP / EMX / LIB / GRAPH / GTRIANGL.C < prev    next >
Encoding:
C/C++ Source or Header  |  1993-01-02  |  5.1 KB  |  266 lines

  1. /* gtriangl.c (emx+gcc) -- Copyright (c) 1987-1993 by Eberhard Mattes */
  2.  
  3. #include <stdlib.h>
  4. #include <graph.h>
  5. #define INCL_VIO
  6. #include <os2emx.h>
  7. #include "graph2.h"
  8.  
  9. static void set3a (int x1, int y1, int x2, int y2, int x3, int y3, int color)
  10. {
  11.   int xl, xincl, errl, xdl, ydl;
  12.   int xr, xincr, errr, xdr, ydr;
  13.   int xxl, xxr, oxl, oxr, minx, maxx;
  14.   int y;
  15.  
  16.   ydr = 1 + y3 - y1;
  17.   if (x1 < x3)
  18.     {
  19.       xincr = 1;
  20.       xdr = 1 + x3 - x1;
  21.     }
  22.   else
  23.     {
  24.       xincr = -1;
  25.       xdr = 1 + x1 - x3;
  26.     }
  27.   if (xdr <= ydr)
  28.     errr = xdr/2;
  29.   else
  30.     errr = ydr/2;
  31.   xl = x1;
  32.   xr = x1;
  33.  
  34.   ydl = 1 + y2 - y1;
  35.   if (x1 < x2)
  36.     {
  37.       xincl = 1;
  38.       xdl = 1 + x2 - x1;
  39.     }
  40.   else
  41.     {
  42.       xincl = -1;
  43.       xdl = 1 + x1 - x2;
  44.     }
  45.   if (xdl <= ydl)
  46.     errl = xdl/2;
  47.   else
  48.     errl = ydl/2;
  49.  
  50.   for (y = y1; y <= y2; ++y)
  51.     {
  52.       oxl = xl; oxr = xr;
  53.       if (xdl <= ydl)
  54.         {
  55.           xxl = xl;
  56.           errl += xdl;
  57.           if (errl >= ydl)
  58.             {
  59.               errl -= ydl;
  60.               xl += xincl;
  61.             }
  62.         }
  63.       else
  64.         for (;;)
  65.           {
  66.             xxl = xl;
  67.             xl += xincl;
  68.             errl += ydl;
  69.             if (errl >= xdl)
  70.               {
  71.                 errl -= xdl;
  72.                 break;
  73.               }
  74.           }
  75.       if (xdr <= ydr)
  76.         {
  77.           xxr = xr;
  78.           errr += xdr;
  79.           if (errr >= ydr)
  80.             {
  81.               errr -= ydr;
  82.               xr += xincr;
  83.             }
  84.         }
  85.       else
  86.         for (;;)
  87.           {
  88.             xxr = xr;
  89.             xr += xincr;
  90.             errr += ydr;
  91.             if (errr >= xdr)
  92.               {
  93.                 errr -= xdr;
  94.                 break;
  95.               }
  96.           }
  97.       if (oxl < oxr)
  98.         minx = oxl;
  99.       else
  100.         minx = oxr;
  101.       if (xxl < minx)
  102.         minx = xxl;
  103.       if (xxr < minx)
  104.         minx = xxr;
  105.       if (oxl > oxr)
  106.         maxx = oxl;
  107.       else
  108.         maxx = oxr;
  109.       if (xxl > maxx)
  110.         maxx = xxl;
  111.       if (xxr > maxx)
  112.         maxx = xxr;
  113.       g_hline (y, minx, maxx, color);
  114.     }
  115.  
  116.   xl = x2;
  117.   ydl = 1 + y3 - y2;
  118.   if (x2 < x3)
  119.     {
  120.       xincl = 1;
  121.       xdl = 1 + x3 - x2;
  122.     }
  123.   else
  124.     {
  125.       xincl = -1;
  126.       xdl = 1 + x2 - x3;
  127.         }
  128.   if (xdl <= ydl)
  129.     errl = xdl/2;
  130.   else
  131.     errl = ydl/2;
  132.  
  133.   if (xdl <= ydl)
  134.     {
  135.       errl += xdl;
  136.       if (errl >= ydl)
  137.         {
  138.           errl -= ydl;
  139.           xl += xincl;
  140.         }
  141.     }
  142.   else
  143.     for (;;)
  144.       {
  145.         xl += xincl;
  146.         errl += ydl;
  147.         if (errl >= xdl)
  148.           {
  149.             errl -= xdl;
  150.             break;
  151.           }
  152.       }
  153.  
  154.   for (y = y2+1; y <= y3; ++y)
  155.     {
  156.       oxl = xl; oxr = xr;
  157.       if (xdl <= ydl)
  158.         {
  159.           xxl = xl;
  160.           errl += xdl;
  161.           if (errl >= ydl)
  162.             {
  163.               errl -= ydl;
  164.               xl += xincl;
  165.             }
  166.         }
  167.       else
  168.         for (;;)
  169.           {
  170.             xxl = xl;
  171.             xl += xincl;
  172.             errl += ydl;
  173.             if (errl >= xdl)
  174.               {
  175.                 errl -= xdl;
  176.                 break;
  177.               }
  178.           }
  179.       if (xdr <= ydr)
  180.         {
  181.           xxr = xr;
  182.           errr += xdr;
  183.           if (errr >= ydr)
  184.             {
  185.               errr -= ydr;
  186.               xr += xincr;
  187.             }
  188.         }
  189.       else
  190.         for (;;)
  191.           {
  192.             xxr = xr;
  193.             xr += xincr;
  194.             errr += ydr;
  195.             if (errr >= xdr)
  196.               {
  197.                 errr -= xdr;
  198.                 break;
  199.               }
  200.           }
  201.       if (oxl < oxr)
  202.         minx = oxl;
  203.       else
  204.         minx = oxr;
  205.       if (xxl < minx)
  206.         minx = xxl;
  207.       if (xxr < minx)
  208.         minx = xxr;
  209.       if (oxl > oxr)
  210.         maxx = oxl;
  211.       else
  212.         maxx = oxr;
  213.       if (xxl > maxx)
  214.         maxx = xxl;
  215.       if (xxr > maxx)
  216.         maxx = xxr;
  217.       g_hline (y, minx, maxx, color);
  218.     }
  219. }
  220.  
  221.  
  222. void g_triangle (int x1, int y1, int x2, int y2, int x3, int y3, int color,
  223.                  int fill_flag)
  224. {
  225.   int temp, xmin, xmax;
  226.  
  227.   GLOCK;
  228.   if (fill_flag)
  229.     {
  230.       if (y1 > y2)
  231.         {
  232.           temp = y2; y2 = y1; y1 = temp;
  233.           temp = x2; x2 = x1; x1 = temp;
  234.         }
  235.       if (y1 > y3)
  236.         {
  237.           temp = y3; y3 = y1; y1 = temp;
  238.           temp = x3; x3 = x1; x1 = temp;
  239.         }
  240.       if (y2 > y3)
  241.         {
  242.           temp = y3; y3 = y2; y2 = temp;
  243.           temp = x3; x3 = x2; x2 = temp;
  244.         }
  245.       if (y1 == y3) /* y1 == y2 && y2 == y3 */
  246.         {
  247.           xmin = x1;
  248.           if (x2 < xmin) xmin = x2;
  249.           if (x3 < xmin) xmin = x3;
  250.           xmax = x1;
  251.           if (x2 > xmax) xmax = x2;
  252.           if (x3 > xmax) xmax = x3;
  253.           g_hline (y1, xmin, xmax, color);
  254.         }
  255.       else
  256.         set3a (x1, y1, x2, y2, x3, y3, color);
  257.     }
  258.   else
  259.     {
  260.       g_line (x3, y3, x1, y1, color);
  261.       g_line (x1, y1, x2, y2, color);
  262.       g_line (x2, y2, x3, y3, color);
  263.     }
  264.   GUNLOCK;
  265. }
  266.