1 /*
2
3 Based on the SG C Tools 1.7
4 (C) 1993 Steve Goldsmith
5
6 $Id: ellipsevdc.c,v 1.1 2008-06-23 17:34:33 stefano Exp $
7
8 */
9
10 #include <c128/vdc.h>
11
12 /*
13 Draw ellipse using digital differential analyzer (DDA) method.
14 */
15
ellipsevdc(int XC,int YC,int A,int B)16 void ellipsevdc(int XC, int YC, int A, int B)
17 {
18 long AA = (long) A*A; /* a^2 */
19 long BB = (long) B*B; /* b^2 */
20 long AA2 = AA << 1; /* 2(a^2) */
21 long BB2 = BB << 1; /* 2(b^2) */
22
23 {
24 long X = 0;
25 long Y = B;
26 long XBB2 = 0;
27 long YAA2 = Y*AA2;
28 long ErrVal = -Y*AA; /* b^2 x^2 + a^2 y^2 - a^2 b^2 -b^2x */
29
30 while (XBB2 <= YAA2) /* draw octant from top to top right */
31 {
32 setpixvdc((int)(XC+X),(int)(YC+Y));
33 setpixvdc((int)(XC+X),(int)(YC-Y));
34 setpixvdc((int)(XC-X),(int)(YC+Y));
35 setpixvdc((int)(XC-X),(int)(YC-Y));
36 X += 1;
37 XBB2 += BB2;
38 ErrVal += XBB2-BB;
39 if (ErrVal >= 0)
40 {
41 Y -= 1;
42 YAA2 -= AA2;
43 ErrVal -= YAA2;
44 }
45 }
46 }
47 {
48 long X = A;
49 long Y = 0;
50 long XBB2 = X*BB2;
51 long YAA2 = 0;
52 long ErrVal = -X*BB;
53
54 while (XBB2 > YAA2) /* draw octant from right to top right */
55 {
56 setpixvdc((int)(XC+X),(int)(YC+Y));
57 setpixvdc((int)(XC+X),(int)(YC-Y));
58 setpixvdc((int)(XC-X),(int)(YC+Y));
59 setpixvdc((int)(XC-X),(int)(YC-Y));
60 Y += 1;
61 YAA2 += AA2;
62 ErrVal += YAA2-AA;
63 if (ErrVal >= 0)
64 {
65 X -= 1;
66 XBB2 -= BB2;
67 ErrVal -= XBB2;
68 }
69 }
70 }
71 }
72
73