plotCircle function

void plotCircle(
  1. double xm,
  2. double ym,
  3. double r,
  4. SetPixel setPixel,
)

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;
    }
  }
}