/* ellipseMidpoint, Chapter 3, pp. 109-110 */ /* EXAMPLE STARTS HERE */ #include "device.h" #define ROUND(a) ((int)(a+0.5)) void ellipseMidpoint (int xCenter, int yCenter, int Rx, int Ry) { int Rx2 = Rx*Rx; int Ry2 = Ry*Ry; int twoRx2 = 2*Rx2; int twoRy2 = 2*Ry2; int p; int x = 0; int y = Ry; int px = 0; int py = twoRx2 * y; void ellipsePlotPoints (int, int, int, int); /* Plot the first set of points */ ellipsePlotPoints (xCenter, yCenter, x, y); /* Region 1 */ p = ROUND (Ry2 - (Rx2 * Ry) + (0.25 * Rx2)); while (px < py) { x++; px += twoRy2; if (p < 0) p += Ry2 + px; else { y--; py -= twoRx2; p += Ry2 + px - py; } ellipsePlotPoints (xCenter, yCenter, x, y); } /* Region 2 */ p = ROUND (Ry2*(x+0.5)*(x+0.5) + Rx2*(y-1)*(y-1) - Rx2*Ry2); while (y > 0) { y--; py -= twoRx2; if (p > 0) p += Rx2 - py; else { x++; px += twoRy2; p += Rx2 - py + px; } ellipsePlotPoints (xCenter, yCenter, x, y); } } void ellipsePlotPoints (int xCenter, int yCenter, int x, int y) { setPixel (xCenter + x, yCenter + y); setPixel (xCenter - x, yCenter + y); setPixel (xCenter + x, yCenter - y); setPixel (xCenter - x, yCenter - y); } /* EXAMPLE ENDS HERE */ void main (int argc, char ** argv) { long windowID = openGraphics (*argv, WINDOW_WIDTH, WINDOW_HEIGHT); setBackground (WHITE); setColor (BLACK); ellipseMidpoint (WINDOW_WIDTH/2, WINDOW_HEIGHT/2, WINDOW_WIDTH/4, WINDOW_WIDTH/5); sleep (10); closeGraphics (windowID); }