xref: /inferno-os/libmemdraw/icossin2.c (revision 37da2899f40661e3e9631e497da8dc59b971cbd0)
1*37da2899SCharles.Forsyth #include	"lib9.h"
2*37da2899SCharles.Forsyth #include	"draw.h"
3*37da2899SCharles.Forsyth 
4*37da2899SCharles.Forsyth /*
5*37da2899SCharles.Forsyth  * Sine and Cosine of arctangents, calculated by
6*37da2899SCharles.Forsyth  *   (sin(atan(index/100.0))*1024.+0.5)
7*37da2899SCharles.Forsyth  *   (cos(atan(index/100.0))*1024.+0.5)
8*37da2899SCharles.Forsyth  * To use, get rational tangent between 0<=tan<=1, scale by 100,
9*37da2899SCharles.Forsyth  * and look up sin and cos, and use linear interpolation.  divide by 1024.
10*37da2899SCharles.Forsyth  * Maximum error is 0.0020.  Without linear interpolation, it's 0.010.
11*37da2899SCharles.Forsyth  */
12*37da2899SCharles.Forsyth static
13*37da2899SCharles.Forsyth short sinus[] = {
14*37da2899SCharles.Forsyth 	0,	/* 0.00 */
15*37da2899SCharles.Forsyth 	10,	/* 0.01 */
16*37da2899SCharles.Forsyth 	20,	/* 0.02 */
17*37da2899SCharles.Forsyth 	31,	/* 0.03 */
18*37da2899SCharles.Forsyth 	41,	/* 0.04 */
19*37da2899SCharles.Forsyth 	51,	/* 0.05 */
20*37da2899SCharles.Forsyth 	61,	/* 0.06 */
21*37da2899SCharles.Forsyth 	72,	/* 0.07 */
22*37da2899SCharles.Forsyth 	82,	/* 0.08 */
23*37da2899SCharles.Forsyth 	92,	/* 0.09 */
24*37da2899SCharles.Forsyth 	102,	/* 0.10 */
25*37da2899SCharles.Forsyth 	112,	/* 0.11 */
26*37da2899SCharles.Forsyth 	122,	/* 0.12 */
27*37da2899SCharles.Forsyth 	132,	/* 0.13 */
28*37da2899SCharles.Forsyth 	142,	/* 0.14 */
29*37da2899SCharles.Forsyth 	152,	/* 0.15 */
30*37da2899SCharles.Forsyth 	162,	/* 0.16 */
31*37da2899SCharles.Forsyth 	172,	/* 0.17 */
32*37da2899SCharles.Forsyth 	181,	/* 0.18 */
33*37da2899SCharles.Forsyth 	191,	/* 0.19 */
34*37da2899SCharles.Forsyth 	201,	/* 0.20 */
35*37da2899SCharles.Forsyth 	210,	/* 0.21 */
36*37da2899SCharles.Forsyth 	220,	/* 0.22 */
37*37da2899SCharles.Forsyth 	230,	/* 0.23 */
38*37da2899SCharles.Forsyth 	239,	/* 0.24 */
39*37da2899SCharles.Forsyth 	248,	/* 0.25 */
40*37da2899SCharles.Forsyth 	258,	/* 0.26 */
41*37da2899SCharles.Forsyth 	267,	/* 0.27 */
42*37da2899SCharles.Forsyth 	276,	/* 0.28 */
43*37da2899SCharles.Forsyth 	285,	/* 0.29 */
44*37da2899SCharles.Forsyth 	294,	/* 0.30 */
45*37da2899SCharles.Forsyth 	303,	/* 0.31 */
46*37da2899SCharles.Forsyth 	312,	/* 0.32 */
47*37da2899SCharles.Forsyth 	321,	/* 0.33 */
48*37da2899SCharles.Forsyth 	330,	/* 0.34 */
49*37da2899SCharles.Forsyth 	338,	/* 0.35 */
50*37da2899SCharles.Forsyth 	347,	/* 0.36 */
51*37da2899SCharles.Forsyth 	355,	/* 0.37 */
52*37da2899SCharles.Forsyth 	364,	/* 0.38 */
53*37da2899SCharles.Forsyth 	372,	/* 0.39 */
54*37da2899SCharles.Forsyth 	380,	/* 0.40 */
55*37da2899SCharles.Forsyth 	388,	/* 0.41 */
56*37da2899SCharles.Forsyth 	397,	/* 0.42 */
57*37da2899SCharles.Forsyth 	405,	/* 0.43 */
58*37da2899SCharles.Forsyth 	412,	/* 0.44 */
59*37da2899SCharles.Forsyth 	420,	/* 0.45 */
60*37da2899SCharles.Forsyth 	428,	/* 0.46 */
61*37da2899SCharles.Forsyth 	436,	/* 0.47 */
62*37da2899SCharles.Forsyth 	443,	/* 0.48 */
63*37da2899SCharles.Forsyth 	451,	/* 0.49 */
64*37da2899SCharles.Forsyth 	458,	/* 0.50 */
65*37da2899SCharles.Forsyth 	465,	/* 0.51 */
66*37da2899SCharles.Forsyth 	472,	/* 0.52 */
67*37da2899SCharles.Forsyth 	480,	/* 0.53 */
68*37da2899SCharles.Forsyth 	487,	/* 0.54 */
69*37da2899SCharles.Forsyth 	493,	/* 0.55 */
70*37da2899SCharles.Forsyth 	500,	/* 0.56 */
71*37da2899SCharles.Forsyth 	507,	/* 0.57 */
72*37da2899SCharles.Forsyth 	514,	/* 0.58 */
73*37da2899SCharles.Forsyth 	520,	/* 0.59 */
74*37da2899SCharles.Forsyth 	527,	/* 0.60 */
75*37da2899SCharles.Forsyth 	533,	/* 0.61 */
76*37da2899SCharles.Forsyth 	540,	/* 0.62 */
77*37da2899SCharles.Forsyth 	546,	/* 0.63 */
78*37da2899SCharles.Forsyth 	552,	/* 0.64 */
79*37da2899SCharles.Forsyth 	558,	/* 0.65 */
80*37da2899SCharles.Forsyth 	564,	/* 0.66 */
81*37da2899SCharles.Forsyth 	570,	/* 0.67 */
82*37da2899SCharles.Forsyth 	576,	/* 0.68 */
83*37da2899SCharles.Forsyth 	582,	/* 0.69 */
84*37da2899SCharles.Forsyth 	587,	/* 0.70 */
85*37da2899SCharles.Forsyth 	593,	/* 0.71 */
86*37da2899SCharles.Forsyth 	598,	/* 0.72 */
87*37da2899SCharles.Forsyth 	604,	/* 0.73 */
88*37da2899SCharles.Forsyth 	609,	/* 0.74 */
89*37da2899SCharles.Forsyth 	614,	/* 0.75 */
90*37da2899SCharles.Forsyth 	620,	/* 0.76 */
91*37da2899SCharles.Forsyth 	625,	/* 0.77 */
92*37da2899SCharles.Forsyth 	630,	/* 0.78 */
93*37da2899SCharles.Forsyth 	635,	/* 0.79 */
94*37da2899SCharles.Forsyth 	640,	/* 0.80 */
95*37da2899SCharles.Forsyth 	645,	/* 0.81 */
96*37da2899SCharles.Forsyth 	649,	/* 0.82 */
97*37da2899SCharles.Forsyth 	654,	/* 0.83 */
98*37da2899SCharles.Forsyth 	659,	/* 0.84 */
99*37da2899SCharles.Forsyth 	663,	/* 0.85 */
100*37da2899SCharles.Forsyth 	668,	/* 0.86 */
101*37da2899SCharles.Forsyth 	672,	/* 0.87 */
102*37da2899SCharles.Forsyth 	676,	/* 0.88 */
103*37da2899SCharles.Forsyth 	681,	/* 0.89 */
104*37da2899SCharles.Forsyth 	685,	/* 0.90 */
105*37da2899SCharles.Forsyth 	689,	/* 0.91 */
106*37da2899SCharles.Forsyth 	693,	/* 0.92 */
107*37da2899SCharles.Forsyth 	697,	/* 0.93 */
108*37da2899SCharles.Forsyth 	701,	/* 0.94 */
109*37da2899SCharles.Forsyth 	705,	/* 0.95 */
110*37da2899SCharles.Forsyth 	709,	/* 0.96 */
111*37da2899SCharles.Forsyth 	713,	/* 0.97 */
112*37da2899SCharles.Forsyth 	717,	/* 0.98 */
113*37da2899SCharles.Forsyth 	720,	/* 0.99 */
114*37da2899SCharles.Forsyth 	724,	/* 1.00 */
115*37da2899SCharles.Forsyth 	728,	/* 1.01 */
116*37da2899SCharles.Forsyth };
117*37da2899SCharles.Forsyth 
118*37da2899SCharles.Forsyth static
119*37da2899SCharles.Forsyth short cosinus[] = {
120*37da2899SCharles.Forsyth 	1024,	/* 0.00 */
121*37da2899SCharles.Forsyth 	1024,	/* 0.01 */
122*37da2899SCharles.Forsyth 	1024,	/* 0.02 */
123*37da2899SCharles.Forsyth 	1024,	/* 0.03 */
124*37da2899SCharles.Forsyth 	1023,	/* 0.04 */
125*37da2899SCharles.Forsyth 	1023,	/* 0.05 */
126*37da2899SCharles.Forsyth 	1022,	/* 0.06 */
127*37da2899SCharles.Forsyth 	1022,	/* 0.07 */
128*37da2899SCharles.Forsyth 	1021,	/* 0.08 */
129*37da2899SCharles.Forsyth 	1020,	/* 0.09 */
130*37da2899SCharles.Forsyth 	1019,	/* 0.10 */
131*37da2899SCharles.Forsyth 	1018,	/* 0.11 */
132*37da2899SCharles.Forsyth 	1017,	/* 0.12 */
133*37da2899SCharles.Forsyth 	1015,	/* 0.13 */
134*37da2899SCharles.Forsyth 	1014,	/* 0.14 */
135*37da2899SCharles.Forsyth 	1013,	/* 0.15 */
136*37da2899SCharles.Forsyth 	1011,	/* 0.16 */
137*37da2899SCharles.Forsyth 	1010,	/* 0.17 */
138*37da2899SCharles.Forsyth 	1008,	/* 0.18 */
139*37da2899SCharles.Forsyth 	1006,	/* 0.19 */
140*37da2899SCharles.Forsyth 	1004,	/* 0.20 */
141*37da2899SCharles.Forsyth 	1002,	/* 0.21 */
142*37da2899SCharles.Forsyth 	1000,	/* 0.22 */
143*37da2899SCharles.Forsyth 	998,	/* 0.23 */
144*37da2899SCharles.Forsyth 	996,	/* 0.24 */
145*37da2899SCharles.Forsyth 	993,	/* 0.25 */
146*37da2899SCharles.Forsyth 	991,	/* 0.26 */
147*37da2899SCharles.Forsyth 	989,	/* 0.27 */
148*37da2899SCharles.Forsyth 	986,	/* 0.28 */
149*37da2899SCharles.Forsyth 	983,	/* 0.29 */
150*37da2899SCharles.Forsyth 	981,	/* 0.30 */
151*37da2899SCharles.Forsyth 	978,	/* 0.31 */
152*37da2899SCharles.Forsyth 	975,	/* 0.32 */
153*37da2899SCharles.Forsyth 	972,	/* 0.33 */
154*37da2899SCharles.Forsyth 	969,	/* 0.34 */
155*37da2899SCharles.Forsyth 	967,	/* 0.35 */
156*37da2899SCharles.Forsyth 	963,	/* 0.36 */
157*37da2899SCharles.Forsyth 	960,	/* 0.37 */
158*37da2899SCharles.Forsyth 	957,	/* 0.38 */
159*37da2899SCharles.Forsyth 	954,	/* 0.39 */
160*37da2899SCharles.Forsyth 	951,	/* 0.40 */
161*37da2899SCharles.Forsyth 	947,	/* 0.41 */
162*37da2899SCharles.Forsyth 	944,	/* 0.42 */
163*37da2899SCharles.Forsyth 	941,	/* 0.43 */
164*37da2899SCharles.Forsyth 	937,	/* 0.44 */
165*37da2899SCharles.Forsyth 	934,	/* 0.45 */
166*37da2899SCharles.Forsyth 	930,	/* 0.46 */
167*37da2899SCharles.Forsyth 	927,	/* 0.47 */
168*37da2899SCharles.Forsyth 	923,	/* 0.48 */
169*37da2899SCharles.Forsyth 	920,	/* 0.49 */
170*37da2899SCharles.Forsyth 	916,	/* 0.50 */
171*37da2899SCharles.Forsyth 	912,	/* 0.51 */
172*37da2899SCharles.Forsyth 	909,	/* 0.52 */
173*37da2899SCharles.Forsyth 	905,	/* 0.53 */
174*37da2899SCharles.Forsyth 	901,	/* 0.54 */
175*37da2899SCharles.Forsyth 	897,	/* 0.55 */
176*37da2899SCharles.Forsyth 	893,	/* 0.56 */
177*37da2899SCharles.Forsyth 	890,	/* 0.57 */
178*37da2899SCharles.Forsyth 	886,	/* 0.58 */
179*37da2899SCharles.Forsyth 	882,	/* 0.59 */
180*37da2899SCharles.Forsyth 	878,	/* 0.60 */
181*37da2899SCharles.Forsyth 	874,	/* 0.61 */
182*37da2899SCharles.Forsyth 	870,	/* 0.62 */
183*37da2899SCharles.Forsyth 	866,	/* 0.63 */
184*37da2899SCharles.Forsyth 	862,	/* 0.64 */
185*37da2899SCharles.Forsyth 	859,	/* 0.65 */
186*37da2899SCharles.Forsyth 	855,	/* 0.66 */
187*37da2899SCharles.Forsyth 	851,	/* 0.67 */
188*37da2899SCharles.Forsyth 	847,	/* 0.68 */
189*37da2899SCharles.Forsyth 	843,	/* 0.69 */
190*37da2899SCharles.Forsyth 	839,	/* 0.70 */
191*37da2899SCharles.Forsyth 	835,	/* 0.71 */
192*37da2899SCharles.Forsyth 	831,	/* 0.72 */
193*37da2899SCharles.Forsyth 	827,	/* 0.73 */
194*37da2899SCharles.Forsyth 	823,	/* 0.74 */
195*37da2899SCharles.Forsyth 	819,	/* 0.75 */
196*37da2899SCharles.Forsyth 	815,	/* 0.76 */
197*37da2899SCharles.Forsyth 	811,	/* 0.77 */
198*37da2899SCharles.Forsyth 	807,	/* 0.78 */
199*37da2899SCharles.Forsyth 	804,	/* 0.79 */
200*37da2899SCharles.Forsyth 	800,	/* 0.80 */
201*37da2899SCharles.Forsyth 	796,	/* 0.81 */
202*37da2899SCharles.Forsyth 	792,	/* 0.82 */
203*37da2899SCharles.Forsyth 	788,	/* 0.83 */
204*37da2899SCharles.Forsyth 	784,	/* 0.84 */
205*37da2899SCharles.Forsyth 	780,	/* 0.85 */
206*37da2899SCharles.Forsyth 	776,	/* 0.86 */
207*37da2899SCharles.Forsyth 	773,	/* 0.87 */
208*37da2899SCharles.Forsyth 	769,	/* 0.88 */
209*37da2899SCharles.Forsyth 	765,	/* 0.89 */
210*37da2899SCharles.Forsyth 	761,	/* 0.90 */
211*37da2899SCharles.Forsyth 	757,	/* 0.91 */
212*37da2899SCharles.Forsyth 	754,	/* 0.92 */
213*37da2899SCharles.Forsyth 	750,	/* 0.93 */
214*37da2899SCharles.Forsyth 	746,	/* 0.94 */
215*37da2899SCharles.Forsyth 	742,	/* 0.95 */
216*37da2899SCharles.Forsyth 	739,	/* 0.96 */
217*37da2899SCharles.Forsyth 	735,	/* 0.97 */
218*37da2899SCharles.Forsyth 	731,	/* 0.98 */
219*37da2899SCharles.Forsyth 	728,	/* 0.99 */
220*37da2899SCharles.Forsyth 	724,	/* 1.00 */
221*37da2899SCharles.Forsyth 	720,	/* 1.01 */
222*37da2899SCharles.Forsyth };
223*37da2899SCharles.Forsyth 
224*37da2899SCharles.Forsyth void
icossin2(int x,int y,int * cosp,int * sinp)225*37da2899SCharles.Forsyth icossin2(int x, int y, int *cosp, int *sinp)
226*37da2899SCharles.Forsyth {
227*37da2899SCharles.Forsyth 	int sinsign, cossign, tan, tan10, rem;
228*37da2899SCharles.Forsyth 	short *stp, *ctp;
229*37da2899SCharles.Forsyth 
230*37da2899SCharles.Forsyth 	if(x == 0){
231*37da2899SCharles.Forsyth 		if(y >= 0)
232*37da2899SCharles.Forsyth 			*sinp = ICOSSCALE, *cosp = 0;
233*37da2899SCharles.Forsyth 		else
234*37da2899SCharles.Forsyth 			*sinp = -ICOSSCALE, *cosp = 0;
235*37da2899SCharles.Forsyth 		return;
236*37da2899SCharles.Forsyth 	}
237*37da2899SCharles.Forsyth 	sinsign = cossign = 1;
238*37da2899SCharles.Forsyth 	if(x < 0){
239*37da2899SCharles.Forsyth 		cossign = -1;
240*37da2899SCharles.Forsyth 		x = -x;
241*37da2899SCharles.Forsyth 	}
242*37da2899SCharles.Forsyth 	if(y < 0){
243*37da2899SCharles.Forsyth 		sinsign = -1;
244*37da2899SCharles.Forsyth 		y = -y;
245*37da2899SCharles.Forsyth 	}
246*37da2899SCharles.Forsyth 	if(y > x){
247*37da2899SCharles.Forsyth 		tan = 1000*x/y;
248*37da2899SCharles.Forsyth 		tan10 = tan/10;
249*37da2899SCharles.Forsyth 		stp = &cosinus[tan10];
250*37da2899SCharles.Forsyth 		ctp = &sinus[tan10];
251*37da2899SCharles.Forsyth 	}else{
252*37da2899SCharles.Forsyth 		tan = 1000*y/x;
253*37da2899SCharles.Forsyth 		tan10 = tan/10;
254*37da2899SCharles.Forsyth 		stp = &sinus[tan10];
255*37da2899SCharles.Forsyth 		ctp = &cosinus[tan10];
256*37da2899SCharles.Forsyth 	}
257*37da2899SCharles.Forsyth 	rem = tan-(tan10*10);
258*37da2899SCharles.Forsyth 	*sinp = sinsign*(stp[0]+(stp[1]-stp[0])*rem/10);
259*37da2899SCharles.Forsyth 	*cosp = cossign*(ctp[0]+(ctp[1]-ctp[0])*rem/10);
260*37da2899SCharles.Forsyth }
261