I must admit, I use this one as a modified version from what's found on Wikipedia and I haven't really delved too deeply into how it works. All I know is that it calculates 45 degrees from 0 to <45 and then from 45 to <90 and draw the ellipse by repeating each value across the four graphing quadrants.

I intend to dig a bit deeper into this one since I really don't like the way the math is laid out. Even though it's only a single line of floating point calculations, I'll sleep a little better at night if I can convert it to fixed point instead. The DSP I'm using is a slug on floating point at best. Additionally, it makes use of 64-bit integers for "error" adjustments and I'm not pleased with that either. I'm sure it can function on a much lower precision with equal results. So at some point I'll sit and refactor this function more completely to make it useful in all circumstances.

/// Draws four points relative to the given center point. /// /// \li centerX + X, centerY + Y /// \li centerX + X, centerY - Y /// \li centerX - X, centerY + Y /// \li centerX - X, centerY - Y /// /// \param centerX the x coordinate of the center point /// \param centerY the y coordinate of the center point /// \param deltaX the difference between the centerX coordinate and each pixel drawn /// \param deltaY the difference between the centerY coordinate and each pixel drawn /// \param color the color to draw the pixels with. inline void plotFourQuadrants(int32_t centerX, int32_t centerY, int32_t deltaX, int32_t deltaY, Color color) { setPixel(centerX + deltaX, centerY + deltaY, color); // Ist Quadrant setPixel(centerX - deltaX, centerY + deltaY, color); // IInd Quadrant setPixel(centerX - deltaX, centerY - deltaY, color); // IIIrd Quadrant setPixel(centerX + deltaX, centerY - deltaY, color); // IVth Quadrant } /// Implements the midpoint ellipse drawing algorithm which is a bresenham /// style DDF. /// /// \param centerX the x coordinate of the center of the ellipse /// \param centerY the y coordinate of the center of the ellipse /// \param horizontalRadius the horizontal radius of the ellipse /// \param verticalRadius the vertical radius of the ellipse /// \param color the color of the ellipse border void ellipse(int centerX, int centerY, int horizontalRadius, int verticalRadius, Color color) { int64_t doubleHorizontalRadius = horizontalRadius * horizontalRadius; int64_t doubleVerticalRadius = verticalRadius * verticalRadius; int64_t error = doubleVerticalRadius - doubleHorizontalRadius * verticalRadius + (doubleVerticalRadius >> 2); int x = 0; int y = verticalRadius; int deltaX = 0; int deltaY = (doubleHorizontalRadius << 1) * y; plotFourQuadrants(centerX, centerY, x, y, color); while(deltaY >= deltaX) { x++; deltaX += (doubleVerticalRadius << 1); error += deltaX + doubleVerticalRadius; if(error >= 0) { y--; deltaY -= (doubleHorizontalRadius << 1); error -= deltaY; } plotFourQuadrants(centerX, centerY, x, y, color); } error = (int64_t)(doubleVerticalRadius * (x + 1 / 2.0) * (x + 1 / 2.0) + doubleHorizontalRadius * (y - 1) * (y - 1) - doubleHorizontalRadius * doubleVerticalRadius); while (y>=0) { error += doubleHorizontalRadius; y--; deltaY -= (doubleHorizontalRadius<<1); error -= deltaY; if(error <= 0) { x++; deltaX += (doubleVerticalRadius << 1); error += deltaX; } plotFourQuadrants(centerX, centerY, x, y, color); } }