www.pudn.com > CG2Programs.rar > ellipseMidpoint.c
/* 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);
}