1 /* $Header: /home/yav/xpx/RCS/ellipse.c,v 1.5 1995/11/23 16:28:39 yav Exp $
2  * ellipse
3  * written by yav (UHD98984@pcvan.or.jp)
4  * Reference:
5  * Algorithm dictionary by Haruhiko Okumura (PAF01002@niftyserve.or.jp)
6  */
7 
8 char rcsid_ellipse[] = "$Id: ellipse.c,v 1.5 1995/11/23 16:28:39 yav Exp $";
9 
10 #define DOT(x,y) (*pp++ = (x), *pp++ = (y))
11 
12 /* return number of points */
ellipse(pp,xc,yc,rx,ry)13 int ellipse(pp, xc, yc, rx, ry)
14      int *pp;
15      int xc;
16      int yc;
17      int rx;
18      int ry;
19 {
20   int x, x1, y, y1, r, pts;
21 
22   pts = y = 0;
23   if (rx > ry) {
24     x = r = rx;
25     while (x >= y) {
26       x1 = ((long)x * ry) / rx;
27       y1 = ((long)y * ry) / rx;
28       DOT(xc + x -1, yc + y1 -1);
29       DOT(xc + x -1, yc - y1);
30       DOT(xc - x, yc + y1 -1);
31       DOT(xc - x, yc - y1);
32       DOT(xc + y -1, yc + x1 -1);
33       DOT(xc + y -1, yc - x1);
34       DOT(xc - y, yc + x1 -1);
35       DOT(xc - y, yc - x1);
36       pts += 8;
37       if ((r -= (y++ << 1) - 1) < 0)
38 	r += (x-- - 1) << 1;
39     }
40   } else {
41     x = r = ry;
42     while (x >= y) {
43       x1 = ((long)x * rx) / ry;
44       y1 = ((long)y * rx) / ry;
45       DOT(xc + x1 -1, yc + y -1);
46       DOT(xc + x1 -1, yc - y);
47       DOT(xc - x1, yc + y -1);
48       DOT(xc - x1, yc - y);
49       DOT(xc + y1 -1, yc + x -1);
50       DOT(xc + y1 -1, yc - x);
51       DOT(xc - y1, yc + x -1);
52       DOT(xc - y1, yc - x);
53       pts += 8;
54       if ((r -= (y++ << 1) - 1) < 0)
55 	r += (x-- - 1) << 1;
56     }
57   }
58   return pts;
59 }
60 
61 /* End of file */
62