1 /*
2 
3 Based on the SG C Tools 1.7
4 (C) 1993 Steve Goldsmith
5 
6 $Id: ellipseivdc.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 in 640 X 480 interlace using digital differential analyzer (DDA)
14 method.
15 */
16 
ellipseivdc(int XC,int YC,int A,int B)17 void ellipseivdc(int XC, int YC, int A, int B)
18 {
19   long AA = (long) A*A; /* a^2 */
20   long BB = (long) B*B; /* b^2 */
21   long AA2 = AA << 1;   /* 2(a^2) */
22   long BB2 = BB << 1;   /* 2(b^2) */
23 
24   {
25     long X = 0;
26     long Y = B;
27     long XBB2 = 0;
28     long YAA2 = Y*AA2;
29     long ErrVal = -Y*AA; /* b^2 x^2 + a^2 y^2 - a^2 b^2 -b^2x */
30 
31     while (XBB2 <= YAA2) /* draw octant from top to top right */
32     {
33       setpixivdc((int)(XC+X),(int)(YC+Y));
34       setpixivdc((int)(XC+X),(int)(YC-Y));
35       setpixivdc((int)(XC-X),(int)(YC+Y));
36       setpixivdc((int)(XC-X),(int)(YC-Y));
37       X += 1;
38       XBB2 += BB2;
39       ErrVal += XBB2-BB;
40       if (ErrVal >= 0)
41       {
42         Y -= 1;
43         YAA2 -= AA2;
44         ErrVal -= YAA2;
45       }
46     }
47   }
48   {
49     long X = A;
50     long Y = 0;
51     long XBB2 = X*BB2;
52     long YAA2 = 0;
53     long ErrVal = -X*BB;
54 
55     while (XBB2 > YAA2)  /* draw octant from right to top right */
56     {
57       setpixivdc((int)(XC+X),(int)(YC+Y));
58       setpixivdc((int)(XC+X),(int)(YC-Y));
59       setpixivdc((int)(XC-X),(int)(YC+Y));
60       setpixivdc((int)(XC-X),(int)(YC-Y));
61       Y += 1;
62       YAA2 += AA2;
63       ErrVal += YAA2-AA;
64       if (ErrVal >= 0)
65       {
66         X -= 1;
67         XBB2 -= BB2;
68         ErrVal -= XBB2;
69       }
70     }
71   }
72 }
73 
74