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