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