xref: /plan9/sys/src/cmd/unix/drawterm/libdraw/icossin2.c (revision 8ccd4a6360d974db7bd7bbd4f37e7018419ea908)
1*8ccd4a63SDavid du Colombier #include	<u.h>
2*8ccd4a63SDavid du Colombier #include	<libc.h>
3*8ccd4a63SDavid du Colombier #include	<draw.h>
47dd7cddfSDavid du Colombier 
57dd7cddfSDavid du Colombier /*
67dd7cddfSDavid du Colombier  * Sine and Cosine of arctangents, calculated by
77dd7cddfSDavid du Colombier  *   (sin(atan(index/100.0))*1024.+0.5)
87dd7cddfSDavid du Colombier  *   (cos(atan(index/100.0))*1024.+0.5)
97dd7cddfSDavid du Colombier  * To use, get rational tangent between 0<=tan<=1, scale by 100,
107dd7cddfSDavid du Colombier  * and look up sin and cos, and use linear interpolation.  divide by 1024.
117dd7cddfSDavid du Colombier  * Maximum error is 0.0020.  Without linear interpolation, it's 0.010.
127dd7cddfSDavid du Colombier  */
137dd7cddfSDavid du Colombier static
147dd7cddfSDavid du Colombier short sinus[] = {
157dd7cddfSDavid du Colombier 	0,	/* 0.00 */
167dd7cddfSDavid du Colombier 	10,	/* 0.01 */
177dd7cddfSDavid du Colombier 	20,	/* 0.02 */
187dd7cddfSDavid du Colombier 	31,	/* 0.03 */
197dd7cddfSDavid du Colombier 	41,	/* 0.04 */
207dd7cddfSDavid du Colombier 	51,	/* 0.05 */
217dd7cddfSDavid du Colombier 	61,	/* 0.06 */
227dd7cddfSDavid du Colombier 	72,	/* 0.07 */
237dd7cddfSDavid du Colombier 	82,	/* 0.08 */
247dd7cddfSDavid du Colombier 	92,	/* 0.09 */
257dd7cddfSDavid du Colombier 	102,	/* 0.10 */
267dd7cddfSDavid du Colombier 	112,	/* 0.11 */
277dd7cddfSDavid du Colombier 	122,	/* 0.12 */
287dd7cddfSDavid du Colombier 	132,	/* 0.13 */
297dd7cddfSDavid du Colombier 	142,	/* 0.14 */
307dd7cddfSDavid du Colombier 	152,	/* 0.15 */
317dd7cddfSDavid du Colombier 	162,	/* 0.16 */
327dd7cddfSDavid du Colombier 	172,	/* 0.17 */
337dd7cddfSDavid du Colombier 	181,	/* 0.18 */
347dd7cddfSDavid du Colombier 	191,	/* 0.19 */
357dd7cddfSDavid du Colombier 	201,	/* 0.20 */
367dd7cddfSDavid du Colombier 	210,	/* 0.21 */
377dd7cddfSDavid du Colombier 	220,	/* 0.22 */
387dd7cddfSDavid du Colombier 	230,	/* 0.23 */
397dd7cddfSDavid du Colombier 	239,	/* 0.24 */
407dd7cddfSDavid du Colombier 	248,	/* 0.25 */
417dd7cddfSDavid du Colombier 	258,	/* 0.26 */
427dd7cddfSDavid du Colombier 	267,	/* 0.27 */
437dd7cddfSDavid du Colombier 	276,	/* 0.28 */
447dd7cddfSDavid du Colombier 	285,	/* 0.29 */
457dd7cddfSDavid du Colombier 	294,	/* 0.30 */
467dd7cddfSDavid du Colombier 	303,	/* 0.31 */
477dd7cddfSDavid du Colombier 	312,	/* 0.32 */
487dd7cddfSDavid du Colombier 	321,	/* 0.33 */
497dd7cddfSDavid du Colombier 	330,	/* 0.34 */
507dd7cddfSDavid du Colombier 	338,	/* 0.35 */
517dd7cddfSDavid du Colombier 	347,	/* 0.36 */
527dd7cddfSDavid du Colombier 	355,	/* 0.37 */
537dd7cddfSDavid du Colombier 	364,	/* 0.38 */
547dd7cddfSDavid du Colombier 	372,	/* 0.39 */
557dd7cddfSDavid du Colombier 	380,	/* 0.40 */
567dd7cddfSDavid du Colombier 	388,	/* 0.41 */
577dd7cddfSDavid du Colombier 	397,	/* 0.42 */
587dd7cddfSDavid du Colombier 	405,	/* 0.43 */
597dd7cddfSDavid du Colombier 	412,	/* 0.44 */
607dd7cddfSDavid du Colombier 	420,	/* 0.45 */
617dd7cddfSDavid du Colombier 	428,	/* 0.46 */
627dd7cddfSDavid du Colombier 	436,	/* 0.47 */
637dd7cddfSDavid du Colombier 	443,	/* 0.48 */
647dd7cddfSDavid du Colombier 	451,	/* 0.49 */
657dd7cddfSDavid du Colombier 	458,	/* 0.50 */
667dd7cddfSDavid du Colombier 	465,	/* 0.51 */
677dd7cddfSDavid du Colombier 	472,	/* 0.52 */
687dd7cddfSDavid du Colombier 	480,	/* 0.53 */
697dd7cddfSDavid du Colombier 	487,	/* 0.54 */
707dd7cddfSDavid du Colombier 	493,	/* 0.55 */
717dd7cddfSDavid du Colombier 	500,	/* 0.56 */
727dd7cddfSDavid du Colombier 	507,	/* 0.57 */
737dd7cddfSDavid du Colombier 	514,	/* 0.58 */
747dd7cddfSDavid du Colombier 	520,	/* 0.59 */
757dd7cddfSDavid du Colombier 	527,	/* 0.60 */
767dd7cddfSDavid du Colombier 	533,	/* 0.61 */
777dd7cddfSDavid du Colombier 	540,	/* 0.62 */
787dd7cddfSDavid du Colombier 	546,	/* 0.63 */
797dd7cddfSDavid du Colombier 	552,	/* 0.64 */
807dd7cddfSDavid du Colombier 	558,	/* 0.65 */
817dd7cddfSDavid du Colombier 	564,	/* 0.66 */
827dd7cddfSDavid du Colombier 	570,	/* 0.67 */
837dd7cddfSDavid du Colombier 	576,	/* 0.68 */
847dd7cddfSDavid du Colombier 	582,	/* 0.69 */
857dd7cddfSDavid du Colombier 	587,	/* 0.70 */
867dd7cddfSDavid du Colombier 	593,	/* 0.71 */
877dd7cddfSDavid du Colombier 	598,	/* 0.72 */
887dd7cddfSDavid du Colombier 	604,	/* 0.73 */
897dd7cddfSDavid du Colombier 	609,	/* 0.74 */
907dd7cddfSDavid du Colombier 	614,	/* 0.75 */
917dd7cddfSDavid du Colombier 	620,	/* 0.76 */
927dd7cddfSDavid du Colombier 	625,	/* 0.77 */
937dd7cddfSDavid du Colombier 	630,	/* 0.78 */
947dd7cddfSDavid du Colombier 	635,	/* 0.79 */
957dd7cddfSDavid du Colombier 	640,	/* 0.80 */
967dd7cddfSDavid du Colombier 	645,	/* 0.81 */
977dd7cddfSDavid du Colombier 	649,	/* 0.82 */
987dd7cddfSDavid du Colombier 	654,	/* 0.83 */
997dd7cddfSDavid du Colombier 	659,	/* 0.84 */
1007dd7cddfSDavid du Colombier 	663,	/* 0.85 */
1017dd7cddfSDavid du Colombier 	668,	/* 0.86 */
1027dd7cddfSDavid du Colombier 	672,	/* 0.87 */
1037dd7cddfSDavid du Colombier 	676,	/* 0.88 */
1047dd7cddfSDavid du Colombier 	681,	/* 0.89 */
1057dd7cddfSDavid du Colombier 	685,	/* 0.90 */
1067dd7cddfSDavid du Colombier 	689,	/* 0.91 */
1077dd7cddfSDavid du Colombier 	693,	/* 0.92 */
1087dd7cddfSDavid du Colombier 	697,	/* 0.93 */
1097dd7cddfSDavid du Colombier 	701,	/* 0.94 */
1107dd7cddfSDavid du Colombier 	705,	/* 0.95 */
1117dd7cddfSDavid du Colombier 	709,	/* 0.96 */
1127dd7cddfSDavid du Colombier 	713,	/* 0.97 */
1137dd7cddfSDavid du Colombier 	717,	/* 0.98 */
1147dd7cddfSDavid du Colombier 	720,	/* 0.99 */
1157dd7cddfSDavid du Colombier 	724,	/* 1.00 */
1167dd7cddfSDavid du Colombier 	728,	/* 1.01 */
1177dd7cddfSDavid du Colombier };
1187dd7cddfSDavid du Colombier 
1197dd7cddfSDavid du Colombier static
1207dd7cddfSDavid du Colombier short cosinus[] = {
1217dd7cddfSDavid du Colombier 	1024,	/* 0.00 */
1227dd7cddfSDavid du Colombier 	1024,	/* 0.01 */
1237dd7cddfSDavid du Colombier 	1024,	/* 0.02 */
1247dd7cddfSDavid du Colombier 	1024,	/* 0.03 */
1257dd7cddfSDavid du Colombier 	1023,	/* 0.04 */
1267dd7cddfSDavid du Colombier 	1023,	/* 0.05 */
1277dd7cddfSDavid du Colombier 	1022,	/* 0.06 */
1287dd7cddfSDavid du Colombier 	1022,	/* 0.07 */
1297dd7cddfSDavid du Colombier 	1021,	/* 0.08 */
1307dd7cddfSDavid du Colombier 	1020,	/* 0.09 */
1317dd7cddfSDavid du Colombier 	1019,	/* 0.10 */
1327dd7cddfSDavid du Colombier 	1018,	/* 0.11 */
1337dd7cddfSDavid du Colombier 	1017,	/* 0.12 */
1347dd7cddfSDavid du Colombier 	1015,	/* 0.13 */
1357dd7cddfSDavid du Colombier 	1014,	/* 0.14 */
1367dd7cddfSDavid du Colombier 	1013,	/* 0.15 */
1377dd7cddfSDavid du Colombier 	1011,	/* 0.16 */
1387dd7cddfSDavid du Colombier 	1010,	/* 0.17 */
1397dd7cddfSDavid du Colombier 	1008,	/* 0.18 */
1407dd7cddfSDavid du Colombier 	1006,	/* 0.19 */
1417dd7cddfSDavid du Colombier 	1004,	/* 0.20 */
1427dd7cddfSDavid du Colombier 	1002,	/* 0.21 */
1437dd7cddfSDavid du Colombier 	1000,	/* 0.22 */
1447dd7cddfSDavid du Colombier 	998,	/* 0.23 */
1457dd7cddfSDavid du Colombier 	996,	/* 0.24 */
1467dd7cddfSDavid du Colombier 	993,	/* 0.25 */
1477dd7cddfSDavid du Colombier 	991,	/* 0.26 */
1487dd7cddfSDavid du Colombier 	989,	/* 0.27 */
1497dd7cddfSDavid du Colombier 	986,	/* 0.28 */
1507dd7cddfSDavid du Colombier 	983,	/* 0.29 */
1517dd7cddfSDavid du Colombier 	981,	/* 0.30 */
1527dd7cddfSDavid du Colombier 	978,	/* 0.31 */
1537dd7cddfSDavid du Colombier 	975,	/* 0.32 */
1547dd7cddfSDavid du Colombier 	972,	/* 0.33 */
1557dd7cddfSDavid du Colombier 	969,	/* 0.34 */
1567dd7cddfSDavid du Colombier 	967,	/* 0.35 */
1577dd7cddfSDavid du Colombier 	963,	/* 0.36 */
1587dd7cddfSDavid du Colombier 	960,	/* 0.37 */
1597dd7cddfSDavid du Colombier 	957,	/* 0.38 */
1607dd7cddfSDavid du Colombier 	954,	/* 0.39 */
1617dd7cddfSDavid du Colombier 	951,	/* 0.40 */
1627dd7cddfSDavid du Colombier 	947,	/* 0.41 */
1637dd7cddfSDavid du Colombier 	944,	/* 0.42 */
1647dd7cddfSDavid du Colombier 	941,	/* 0.43 */
1657dd7cddfSDavid du Colombier 	937,	/* 0.44 */
1667dd7cddfSDavid du Colombier 	934,	/* 0.45 */
1677dd7cddfSDavid du Colombier 	930,	/* 0.46 */
1687dd7cddfSDavid du Colombier 	927,	/* 0.47 */
1697dd7cddfSDavid du Colombier 	923,	/* 0.48 */
1707dd7cddfSDavid du Colombier 	920,	/* 0.49 */
1717dd7cddfSDavid du Colombier 	916,	/* 0.50 */
1727dd7cddfSDavid du Colombier 	912,	/* 0.51 */
1737dd7cddfSDavid du Colombier 	909,	/* 0.52 */
1747dd7cddfSDavid du Colombier 	905,	/* 0.53 */
1757dd7cddfSDavid du Colombier 	901,	/* 0.54 */
1767dd7cddfSDavid du Colombier 	897,	/* 0.55 */
1777dd7cddfSDavid du Colombier 	893,	/* 0.56 */
1787dd7cddfSDavid du Colombier 	890,	/* 0.57 */
1797dd7cddfSDavid du Colombier 	886,	/* 0.58 */
1807dd7cddfSDavid du Colombier 	882,	/* 0.59 */
1817dd7cddfSDavid du Colombier 	878,	/* 0.60 */
1827dd7cddfSDavid du Colombier 	874,	/* 0.61 */
1837dd7cddfSDavid du Colombier 	870,	/* 0.62 */
1847dd7cddfSDavid du Colombier 	866,	/* 0.63 */
1857dd7cddfSDavid du Colombier 	862,	/* 0.64 */
1867dd7cddfSDavid du Colombier 	859,	/* 0.65 */
1877dd7cddfSDavid du Colombier 	855,	/* 0.66 */
1887dd7cddfSDavid du Colombier 	851,	/* 0.67 */
1897dd7cddfSDavid du Colombier 	847,	/* 0.68 */
1907dd7cddfSDavid du Colombier 	843,	/* 0.69 */
1917dd7cddfSDavid du Colombier 	839,	/* 0.70 */
1927dd7cddfSDavid du Colombier 	835,	/* 0.71 */
1937dd7cddfSDavid du Colombier 	831,	/* 0.72 */
1947dd7cddfSDavid du Colombier 	827,	/* 0.73 */
1957dd7cddfSDavid du Colombier 	823,	/* 0.74 */
1967dd7cddfSDavid du Colombier 	819,	/* 0.75 */
1977dd7cddfSDavid du Colombier 	815,	/* 0.76 */
1987dd7cddfSDavid du Colombier 	811,	/* 0.77 */
1997dd7cddfSDavid du Colombier 	807,	/* 0.78 */
2007dd7cddfSDavid du Colombier 	804,	/* 0.79 */
2017dd7cddfSDavid du Colombier 	800,	/* 0.80 */
2027dd7cddfSDavid du Colombier 	796,	/* 0.81 */
2037dd7cddfSDavid du Colombier 	792,	/* 0.82 */
2047dd7cddfSDavid du Colombier 	788,	/* 0.83 */
2057dd7cddfSDavid du Colombier 	784,	/* 0.84 */
2067dd7cddfSDavid du Colombier 	780,	/* 0.85 */
2077dd7cddfSDavid du Colombier 	776,	/* 0.86 */
2087dd7cddfSDavid du Colombier 	773,	/* 0.87 */
2097dd7cddfSDavid du Colombier 	769,	/* 0.88 */
2107dd7cddfSDavid du Colombier 	765,	/* 0.89 */
2117dd7cddfSDavid du Colombier 	761,	/* 0.90 */
2127dd7cddfSDavid du Colombier 	757,	/* 0.91 */
2137dd7cddfSDavid du Colombier 	754,	/* 0.92 */
2147dd7cddfSDavid du Colombier 	750,	/* 0.93 */
2157dd7cddfSDavid du Colombier 	746,	/* 0.94 */
2167dd7cddfSDavid du Colombier 	742,	/* 0.95 */
2177dd7cddfSDavid du Colombier 	739,	/* 0.96 */
2187dd7cddfSDavid du Colombier 	735,	/* 0.97 */
2197dd7cddfSDavid du Colombier 	731,	/* 0.98 */
2207dd7cddfSDavid du Colombier 	728,	/* 0.99 */
2217dd7cddfSDavid du Colombier 	724,	/* 1.00 */
2227dd7cddfSDavid du Colombier 	720,	/* 1.01 */
2237dd7cddfSDavid du Colombier };
2247dd7cddfSDavid du Colombier 
2257dd7cddfSDavid du Colombier void
icossin2(int x,int y,int * cosp,int * sinp)2267dd7cddfSDavid du Colombier icossin2(int x, int y, int *cosp, int *sinp)
2277dd7cddfSDavid du Colombier {
2287dd7cddfSDavid du Colombier 	int sinsign, cossign, tan, tan10, rem;
2297dd7cddfSDavid du Colombier 	short *stp, *ctp;
2307dd7cddfSDavid du Colombier 
2317dd7cddfSDavid du Colombier 	if(x == 0){
2327dd7cddfSDavid du Colombier 		if(y >= 0)
2337dd7cddfSDavid du Colombier 			*sinp = ICOSSCALE, *cosp = 0;
2347dd7cddfSDavid du Colombier 		else
2357dd7cddfSDavid du Colombier 			*sinp = -ICOSSCALE, *cosp = 0;
2367dd7cddfSDavid du Colombier 		return;
2377dd7cddfSDavid du Colombier 	}
2387dd7cddfSDavid du Colombier 	sinsign = cossign = 1;
2397dd7cddfSDavid du Colombier 	if(x < 0){
2407dd7cddfSDavid du Colombier 		cossign = -1;
2417dd7cddfSDavid du Colombier 		x = -x;
2427dd7cddfSDavid du Colombier 	}
2437dd7cddfSDavid du Colombier 	if(y < 0){
2447dd7cddfSDavid du Colombier 		sinsign = -1;
2457dd7cddfSDavid du Colombier 		y = -y;
2467dd7cddfSDavid du Colombier 	}
2477dd7cddfSDavid du Colombier 	if(y > x){
2487dd7cddfSDavid du Colombier 		tan = 1000*x/y;
2497dd7cddfSDavid du Colombier 		tan10 = tan/10;
2507dd7cddfSDavid du Colombier 		stp = &cosinus[tan10];
2517dd7cddfSDavid du Colombier 		ctp = &sinus[tan10];
2527dd7cddfSDavid du Colombier 	}else{
2537dd7cddfSDavid du Colombier 		tan = 1000*y/x;
2547dd7cddfSDavid du Colombier 		tan10 = tan/10;
2557dd7cddfSDavid du Colombier 		stp = &sinus[tan10];
2567dd7cddfSDavid du Colombier 		ctp = &cosinus[tan10];
2577dd7cddfSDavid du Colombier 	}
2587dd7cddfSDavid du Colombier 	rem = tan-(tan10*10);
2597dd7cddfSDavid du Colombier 	*sinp = sinsign*(stp[0]+(stp[1]-stp[0])*rem/10);
2607dd7cddfSDavid du Colombier 	*cosp = cossign*(ctp[0]+(ctp[1]-ctp[0])*rem/10);
2617dd7cddfSDavid du Colombier }
262