lib/mgCircle.c

Go to the documentation of this file.
00001 /* mgCircle.c - Simple stepping draw a circle algorithm.  
00002         Don't even correct aspect ratio. */
00003 
00004 #include "common.h"
00005 #include "memgfx.h"
00006 
00007 void mgCircle(struct memGfx *mg, int xCen, int yCen, int rad, 
00008         Color color, boolean filled)
00009 /* Draw a circle using a stepping algorithm.  Doesn't correct
00010  * for non-square pixels. */
00011 {
00012 int err;
00013 int derr, yerr, xerr;
00014 int aderr, ayerr, axerr;
00015 register int x,y;
00016 int lasty;
00017 
00018 if (rad <= 0)
00019     {
00020     mgPutDot(mg, xCen, yCen, color);
00021     return;
00022     }
00023 err = 0;
00024 x = rad;
00025 lasty = y = 0;
00026 for (;;)
00027     {
00028     if (filled)
00029         {
00030         if (y == 0)
00031             mgLineH(mg, yCen, xCen-x, xCen+x, color);
00032         else
00033             {
00034             if (lasty != y)
00035                 {
00036                 mgLineH(mg, yCen-y, xCen-x, xCen+x, color);
00037                 mgLineH(mg, yCen+y, xCen-x, xCen+x, color);
00038                 lasty = y;
00039                 }
00040             }
00041         }
00042     else
00043         {
00044         /* draw 4 quadrandts of a circle */
00045         mgPutDot(mg, xCen+x, yCen+y, color);
00046         mgPutDot(mg, xCen+x, yCen-y, color);
00047         mgPutDot(mg, xCen-x, yCen+y, color);
00048         mgPutDot(mg, xCen-x, yCen-y, color);
00049         }
00050     axerr = xerr = err -x-x+1;
00051     ayerr = yerr = err +y+y+1;
00052     aderr = derr = yerr+xerr-err;
00053     if (aderr < 0)
00054         aderr = -aderr;
00055     if (ayerr < 0)
00056         ayerr = -ayerr;
00057     if (axerr < 0)
00058         axerr = -axerr;
00059     if (aderr <= ayerr && aderr <= axerr)
00060         {
00061         err = derr;
00062         x -= 1;
00063         y += 1;
00064         }
00065     else if (ayerr <= axerr)
00066         {
00067         err = yerr;
00068         y += 1;
00069         }
00070     else
00071         {
00072         err = xerr;
00073         x -= 1;
00074         }
00075     if (x < 0)
00076         break;
00077     }
00078 }

Generated on Tue Dec 25 18:39:31 2007 for blat by  doxygen 1.5.2