00001
00002
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
00010
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
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 }