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