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