drawEllipse method

void drawEllipse(
  1. int centerX,
  2. int centerY,
  3. int radiusX,
  4. int radiusY, {
  5. bool value = true,
  6. bool antiAliased = false,
  7. Style? cellStyle,
})

Draws an ellipse outline at (centerX, centerY) with radiusX and radiusY in sub-pixel coordinates.

Implementation

void drawEllipse(
  int centerX,
  int centerY,
  int radiusX,
  int radiusY, {
  bool value = true,
  bool antiAliased = false,
  Style? cellStyle,
}) {
  if (radiusX < 0 || radiusY < 0) return;

  var x = 0;
  var y = radiusY;

  final rx2 = radiusX * radiusX;
  final ry2 = radiusY * radiusY;

  var dx = 2 * ry2 * x;
  var dy = 2 * rx2 * y;

  // Region 1
  var p = (ry2 - rx2 * radiusY + 0.25 * rx2).round();

  while (dx < dy) {
    _drawEllipsePoints(
      centerX,
      centerY,
      x,
      y,
      value,
      antiAliased: antiAliased,
      cellStyle: cellStyle,
    );

    if (p < 0) {
      x++;
      dx += 2 * ry2;
      p += dx + ry2;
    } else {
      x++;
      y--;
      dx += 2 * ry2;
      dy -= 2 * rx2;
      p += dx - dy + ry2;
    }
  }

  // Region 2
  p = (ry2 * (x + 0.5) * (x + 0.5) + rx2 * (y - 1) * (y - 1) - rx2 * ry2)
      .round();

  while (y >= 0) {
    _drawEllipsePoints(
      centerX,
      centerY,
      x,
      y,
      value,
      antiAliased: antiAliased,
      cellStyle: cellStyle,
    );

    if (p > 0) {
      y--;
      dy -= 2 * rx2;
      p += rx2 - dy;
    } else {
      y--;
      x++;
      dx += 2 * ry2;
      dy -= 2 * rx2;
      p += dx - dy + rx2;
    }
  }
}