plotCircle function
Implementation
void plotCircle(double xm, double ym, double r, SetPixel setPixel) {
var x = r, y = 0; /* II. quadrant from bottom left to top right */
int i;
double x2;
double e2;
double err = 2 - 2 * r; /* error of 1.step */
r = 1 - err;
for (;;) {
i = (255 * (err + 2 * (x + y) - 2).abs() / r).round(); /* get blend value of pixel */
setPixel(xm + x, ym - y, i); /* I. Quadrant */
setPixel(xm + y, ym + x, i); /* II. Quadrant */
setPixel(xm - x, ym + y, i); /* III. Quadrant */
setPixel(xm - y, ym - x, i); /* IV. Quadrant */
if (x == 0) {
break;
}
e2 = err;
x2 = x; /* remember values */
if (err > y) {
/* x step */
i = (255 * (err + 2 * x - 1) / r).round(); /* outward pixel */
if (i < 255) {
setPixel(xm + x, ym - y + 1, i);
setPixel(xm + y - 1, ym + x, i);
setPixel(xm - x, ym + y - 1, i);
setPixel(xm - y + 1, ym - x, i);
}
err -= --x * 2 - 1;
}
if (e2 <= x2--) {
/* y step */
i = (255 * (1 - 2 * y - e2) / r).round(); /* inward pixel */
if (i < 255) {
setPixel(xm + x2, ym - y, i);
setPixel(xm + y, ym + x2, i);
setPixel(xm - x2, ym + y, i);
setPixel(xm - y, ym - x2, i);
}
err -= --y * 2 - 1;
}
}
}