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

  1. /* gellipse.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 gcirfx (int cx, int cy, int rx, int ry, int color)
  10. {
  11.   int x, y, r, x1, y1, oy, ox, y0, qr, qx, qy, z;
  12.  
  13.   r = rx + 1;
  14.   x = r - 1; y = 0; qy = 0; qx = x * x; qr = r * r;
  15.   ox = -1; oy = -1; y0 = -1;
  16.   for (;;)
  17.     {
  18.       z = y * ry; y1 = z / rx;
  19.       z = x * ry; x1 = z / rx;
  20.       if (y1 != oy)
  21.         {
  22.           g_hline (cy-y1, cx-x, cx+x, color);
  23.           if (y1 != 0)    /* draw diameter only once */
  24.             g_hline (cy+y1, cx-x, cx+x, color);
  25.         }
  26.       if (x1 != ox)
  27.         {
  28.           if (y0 != -1 && y1 < ox)
  29.             {
  30.               g_hline (cy-ox, cx-y0, cx+y0, color);
  31.               g_hline (cy+ox, cx-y0, cx+y0, color);
  32.             }
  33.         }
  34.       oy = y1; ox = x1; y0 = y;
  35.       if (x <= y)
  36.         break;
  37.       qy = qy + 2 * y + 1;
  38.       ++y;
  39.       if (qx+qy > qr)
  40.         {
  41.           qx = qx - 2 * x + 1;
  42.           --x;
  43.         }
  44.     }
  45. }
  46.  
  47.  
  48. static void gcirpx (int cx, int cy, int rx, int ry, int color)
  49. {
  50.   int x, y, r, x1, y1, oy, ox, y0, x2, y2, qr, qx, qy, z;
  51.  
  52.   r = rx + 1;
  53.   x = r - 1; y = 0; qy = 0; qx = x * x; qr = r * r;
  54.   ox = -1; oy = -1; y0 = -1; x2 = rx; y2 = 0;
  55.   for (;;)
  56.     {
  57.       z = y * ry; y1 = z / rx;
  58.       z = x * ry; x1 = z / rx;
  59.       if (y1 != oy)
  60.         {
  61.           if (x > x2)
  62.             {
  63.               g_set (cx-x, cy-y1, color);
  64.               g_set (cx+x, cy-y1, color);
  65.               if (y1 != 0)  /* set these points only once */
  66.                 {
  67.                   g_set (cx-x, cy+y1, color);
  68.                   g_set (cx+x, cy+y1, color);
  69.                 }
  70.             }
  71.           else
  72.             {
  73.               g_hline (cy-y1, cx-x, cx-x2, color);
  74.               g_hline (cy-y1, cx+x, cx+x2, color);
  75.               if (y1 != 0)   /* set these 'points' only once */
  76.                 {
  77.                   g_hline (cy+y1, cx-x, cx-x2, color);
  78.                   g_hline (cy+y1, cx+x, cx+x2, color);
  79.                 }
  80.             }
  81.           x2 = x-1;
  82.         }
  83.       if (x1 != ox)
  84.         {
  85.           if (y0 != -1 && y1 < ox)
  86.             {
  87.               g_hline (cy-ox, cx-y0, cx-y2, color);
  88.               g_hline (cy+ox, cx-y0, cx-y2, color);
  89.               if (y2 == 0)  /* draw the dots only once */
  90.                 y2 = 1;
  91.               g_hline (cy-ox, cx+y0, cx+y2, color);
  92.               g_hline (cy+ox, cx+y0, cx+y2, color);
  93.               y2 = y0+1;
  94.             }
  95.         }
  96.       oy = y1; ox = x1; y0 = y;
  97.       if (x <= y)
  98.         break;
  99.       qy = qy + 2 * y + 1;
  100.       ++y;
  101.       if (qx+qy > qr)
  102.         {
  103.           qx = qx - 2 * x + 1;
  104.           --x;
  105.         }
  106.     }
  107.   if (x2 >= y2)
  108.     {
  109.       g_hline (cy-y1, cx-y2, cx-x2, color);
  110.       g_hline (cy-y1, cx+y2, cx+x2, color);
  111.       if (y1 != 0)
  112.         {
  113.           g_hline (cy+y1, cx-y2, cx-x2, color);
  114.           g_hline (cy+y1, cx+y2, cx+x2, color);
  115.         }
  116.     }
  117. }
  118.  
  119.  
  120. static void gcirfy (int cx, int cy, int rx, int ry, int color)
  121. {
  122.   int x, y, r, x1, y1, oy, ox, x0, qr, qx, qy, z;
  123.  
  124.   r = ry + 1;
  125.   x = r - 1; y = 0; qy = 0; qx = x * x; qr = r * r;
  126.   ox = -1; oy = -1; x0 = -1;
  127.   for (;;)
  128.     {
  129.       z = y * rx; y1 = z / ry;
  130.       z = x * rx; x1 = z / ry;
  131.       if (x != ox)
  132.         {
  133.           g_hline (cy-x, cx-y1, cx+y1, color);
  134.           g_hline (cy+x, cx-y1, cx+y1, color);
  135.         }
  136.       if (y != oy)
  137.         {
  138.           if (x0 != -1 && x > oy)
  139.             {
  140.               g_hline (cy-oy, cx-x0, cx+x0, color);
  141.               if (oy != 0)   /* draw diameter only once */
  142.                 g_hline (cy+oy, cx-x0, cx+x0, color);
  143.             }
  144.         }
  145.       ox = x; oy = y; x0 = x1;
  146.       if (x <= y)
  147.         break;
  148.       qy = qy + 2 * y + 1;
  149.       ++y;
  150.       if (qx+qy > qr)
  151.         {
  152.           qx = qx - 2 * x + 1;
  153.           --x;
  154.         }
  155.     }
  156. }
  157.  
  158.  
  159. static void gcirpy (int cx, int cy, int rx, int ry, int color)
  160. {
  161.   int x, y, r, x1, y1, oy, ox, y0, x2, y2, qr, qx, qy, z;
  162.  
  163.   r = ry + 1;
  164.   x = r - 1; y = 0; qy = 0; qx = x * x; qr = r * r;
  165.   ox = -1; oy = -1; y0 = -1; x2 = rx; y2 = 0;
  166.   for (;;)
  167.     {
  168.       z = y * rx; y1 = z / ry;
  169.       z = x * rx; x1 = z / ry;
  170.       if (y1 != oy)
  171.         {
  172.           if (x > x2)
  173.             {
  174.               g_set (cx-y1, cy-x, color);
  175.               g_set (cx-y1, cy+x, color);
  176.               if (y1 != 0)  /* set these points only once */
  177.                 {
  178.                   g_set (cx+y1, cy-x, color);
  179.                   g_set (cx+y1, cy+x, color);
  180.                 }
  181.             }
  182.           else
  183.             {
  184.               g_vline (cx-y1, cy-x, cy-x2, color);
  185.               g_vline (cx-y1, cy+x, cy+x2, color);
  186.               if (y1 != 0)   /* set these 'points' only once */
  187.                 {
  188.                   g_vline (cx+y1, cy-x, cy-x2, color);
  189.                   g_vline (cx+y1, cy+x, cy+x2, color);
  190.                 }
  191.             }
  192.           x2 = x-1;
  193.         }
  194.       if (x1 != ox)
  195.         {
  196.           if (y0 != -1 && y1 < ox)
  197.             {
  198.               g_vline (cx-ox, cy-y0, cy-y2, color);
  199.               g_vline (cx+ox, cy-y0, cy-y2, color);
  200.               if (y2 == 0)  /* draw the dots only once */
  201.                 y2 = 1;
  202.               g_vline (cx-ox, cy+y0, cy+y2, color);
  203.               g_vline (cx+ox, cy+y0, cy+y2, color);
  204.               y2 = y0+1;
  205.             }
  206.         }
  207.       oy = y1; ox = x1; y0 = y;
  208.       if (x <= y)
  209.         break;
  210.       qy = qy + 2 * y + 1;
  211.       ++y;
  212.       if (qx+qy > qr)
  213.         {
  214.           qx = qx - 2 * x + 1;
  215.           --x;
  216.         }
  217.     }
  218.   if (x2 >= y2)
  219.     {
  220.       g_vline (cx-y1, cy-y2, cy-x2, color);
  221.       g_vline (cx-y1, cy+y2, cy+x2, color);
  222.       if (y1 != 0)
  223.         {
  224.           g_vline (cx+y1, cy-y2, cy-x2, color);
  225.           g_vline (cx+y1, cy+y2, cy+x2, color);
  226.         }
  227.     }
  228. }
  229.  
  230.  
  231. void g_ellipse (int cx, int cy, int rx, int ry, int color, int fill_flag)
  232. {
  233.   if (rx == 0 && ry == 0)
  234.     g_set (cx, cy, color);
  235.   else if (rx == 0)
  236.     g_vline (cx, cy-ry, cy+ry, color);
  237.   else if (ry == 0)
  238.     g_hline (cy, cx-rx, cx+rx, color);
  239.   else
  240.     {
  241.       GLOCK;
  242.       if (rx >= ry)
  243.         if (fill_flag)
  244.           gcirfx (cx, cy, rx, ry, color);
  245.         else
  246.           gcirpx (cx, cy, rx, ry, color);
  247.       else
  248.         if (fill_flag)
  249.           gcirfy (cx, cy, rx, ry, color);
  250.         else
  251.           gcirpy (cx, cy, rx, ry, color);
  252.       GUNLOCK;
  253.     }
  254. }
  255.