| #include	<u.h> | 
 | #include	<libc.h> | 
 | #include	<draw.h> | 
 |  | 
 | /* | 
 |  * Sine and Cosine of arctangents, calculated by  | 
 |  *   (sin(atan(index/100.0))*1024.+0.5) | 
 |  *   (cos(atan(index/100.0))*1024.+0.5) | 
 |  * To use, get rational tangent between 0<=tan<=1, scale by 100, | 
 |  * and look up sin and cos, and use linear interpolation.  divide by 1024. | 
 |  * Maximum error is 0.0020.  Without linear interpolation, it's 0.010. | 
 |  */ | 
 | static | 
 | short sinus[] = { | 
 | 	0,	/* 0.00 */ | 
 | 	10,	/* 0.01 */ | 
 | 	20,	/* 0.02 */ | 
 | 	31,	/* 0.03 */ | 
 | 	41,	/* 0.04 */ | 
 | 	51,	/* 0.05 */ | 
 | 	61,	/* 0.06 */ | 
 | 	72,	/* 0.07 */ | 
 | 	82,	/* 0.08 */ | 
 | 	92,	/* 0.09 */ | 
 | 	102,	/* 0.10 */ | 
 | 	112,	/* 0.11 */ | 
 | 	122,	/* 0.12 */ | 
 | 	132,	/* 0.13 */ | 
 | 	142,	/* 0.14 */ | 
 | 	152,	/* 0.15 */ | 
 | 	162,	/* 0.16 */ | 
 | 	172,	/* 0.17 */ | 
 | 	181,	/* 0.18 */ | 
 | 	191,	/* 0.19 */ | 
 | 	201,	/* 0.20 */ | 
 | 	210,	/* 0.21 */ | 
 | 	220,	/* 0.22 */ | 
 | 	230,	/* 0.23 */ | 
 | 	239,	/* 0.24 */ | 
 | 	248,	/* 0.25 */ | 
 | 	258,	/* 0.26 */ | 
 | 	267,	/* 0.27 */ | 
 | 	276,	/* 0.28 */ | 
 | 	285,	/* 0.29 */ | 
 | 	294,	/* 0.30 */ | 
 | 	303,	/* 0.31 */ | 
 | 	312,	/* 0.32 */ | 
 | 	321,	/* 0.33 */ | 
 | 	330,	/* 0.34 */ | 
 | 	338,	/* 0.35 */ | 
 | 	347,	/* 0.36 */ | 
 | 	355,	/* 0.37 */ | 
 | 	364,	/* 0.38 */ | 
 | 	372,	/* 0.39 */ | 
 | 	380,	/* 0.40 */ | 
 | 	388,	/* 0.41 */ | 
 | 	397,	/* 0.42 */ | 
 | 	405,	/* 0.43 */ | 
 | 	412,	/* 0.44 */ | 
 | 	420,	/* 0.45 */ | 
 | 	428,	/* 0.46 */ | 
 | 	436,	/* 0.47 */ | 
 | 	443,	/* 0.48 */ | 
 | 	451,	/* 0.49 */ | 
 | 	458,	/* 0.50 */ | 
 | 	465,	/* 0.51 */ | 
 | 	472,	/* 0.52 */ | 
 | 	480,	/* 0.53 */ | 
 | 	487,	/* 0.54 */ | 
 | 	493,	/* 0.55 */ | 
 | 	500,	/* 0.56 */ | 
 | 	507,	/* 0.57 */ | 
 | 	514,	/* 0.58 */ | 
 | 	520,	/* 0.59 */ | 
 | 	527,	/* 0.60 */ | 
 | 	533,	/* 0.61 */ | 
 | 	540,	/* 0.62 */ | 
 | 	546,	/* 0.63 */ | 
 | 	552,	/* 0.64 */ | 
 | 	558,	/* 0.65 */ | 
 | 	564,	/* 0.66 */ | 
 | 	570,	/* 0.67 */ | 
 | 	576,	/* 0.68 */ | 
 | 	582,	/* 0.69 */ | 
 | 	587,	/* 0.70 */ | 
 | 	593,	/* 0.71 */ | 
 | 	598,	/* 0.72 */ | 
 | 	604,	/* 0.73 */ | 
 | 	609,	/* 0.74 */ | 
 | 	614,	/* 0.75 */ | 
 | 	620,	/* 0.76 */ | 
 | 	625,	/* 0.77 */ | 
 | 	630,	/* 0.78 */ | 
 | 	635,	/* 0.79 */ | 
 | 	640,	/* 0.80 */ | 
 | 	645,	/* 0.81 */ | 
 | 	649,	/* 0.82 */ | 
 | 	654,	/* 0.83 */ | 
 | 	659,	/* 0.84 */ | 
 | 	663,	/* 0.85 */ | 
 | 	668,	/* 0.86 */ | 
 | 	672,	/* 0.87 */ | 
 | 	676,	/* 0.88 */ | 
 | 	681,	/* 0.89 */ | 
 | 	685,	/* 0.90 */ | 
 | 	689,	/* 0.91 */ | 
 | 	693,	/* 0.92 */ | 
 | 	697,	/* 0.93 */ | 
 | 	701,	/* 0.94 */ | 
 | 	705,	/* 0.95 */ | 
 | 	709,	/* 0.96 */ | 
 | 	713,	/* 0.97 */ | 
 | 	717,	/* 0.98 */ | 
 | 	720,	/* 0.99 */ | 
 | 	724,	/* 1.00 */ | 
 | 	728,	/* 1.01 */ | 
 | }; | 
 |  | 
 | static | 
 | short cosinus[] = { | 
 | 	1024,	/* 0.00 */ | 
 | 	1024,	/* 0.01 */ | 
 | 	1024,	/* 0.02 */ | 
 | 	1024,	/* 0.03 */ | 
 | 	1023,	/* 0.04 */ | 
 | 	1023,	/* 0.05 */ | 
 | 	1022,	/* 0.06 */ | 
 | 	1022,	/* 0.07 */ | 
 | 	1021,	/* 0.08 */ | 
 | 	1020,	/* 0.09 */ | 
 | 	1019,	/* 0.10 */ | 
 | 	1018,	/* 0.11 */ | 
 | 	1017,	/* 0.12 */ | 
 | 	1015,	/* 0.13 */ | 
 | 	1014,	/* 0.14 */ | 
 | 	1013,	/* 0.15 */ | 
 | 	1011,	/* 0.16 */ | 
 | 	1010,	/* 0.17 */ | 
 | 	1008,	/* 0.18 */ | 
 | 	1006,	/* 0.19 */ | 
 | 	1004,	/* 0.20 */ | 
 | 	1002,	/* 0.21 */ | 
 | 	1000,	/* 0.22 */ | 
 | 	998,	/* 0.23 */ | 
 | 	996,	/* 0.24 */ | 
 | 	993,	/* 0.25 */ | 
 | 	991,	/* 0.26 */ | 
 | 	989,	/* 0.27 */ | 
 | 	986,	/* 0.28 */ | 
 | 	983,	/* 0.29 */ | 
 | 	981,	/* 0.30 */ | 
 | 	978,	/* 0.31 */ | 
 | 	975,	/* 0.32 */ | 
 | 	972,	/* 0.33 */ | 
 | 	969,	/* 0.34 */ | 
 | 	967,	/* 0.35 */ | 
 | 	963,	/* 0.36 */ | 
 | 	960,	/* 0.37 */ | 
 | 	957,	/* 0.38 */ | 
 | 	954,	/* 0.39 */ | 
 | 	951,	/* 0.40 */ | 
 | 	947,	/* 0.41 */ | 
 | 	944,	/* 0.42 */ | 
 | 	941,	/* 0.43 */ | 
 | 	937,	/* 0.44 */ | 
 | 	934,	/* 0.45 */ | 
 | 	930,	/* 0.46 */ | 
 | 	927,	/* 0.47 */ | 
 | 	923,	/* 0.48 */ | 
 | 	920,	/* 0.49 */ | 
 | 	916,	/* 0.50 */ | 
 | 	912,	/* 0.51 */ | 
 | 	909,	/* 0.52 */ | 
 | 	905,	/* 0.53 */ | 
 | 	901,	/* 0.54 */ | 
 | 	897,	/* 0.55 */ | 
 | 	893,	/* 0.56 */ | 
 | 	890,	/* 0.57 */ | 
 | 	886,	/* 0.58 */ | 
 | 	882,	/* 0.59 */ | 
 | 	878,	/* 0.60 */ | 
 | 	874,	/* 0.61 */ | 
 | 	870,	/* 0.62 */ | 
 | 	866,	/* 0.63 */ | 
 | 	862,	/* 0.64 */ | 
 | 	859,	/* 0.65 */ | 
 | 	855,	/* 0.66 */ | 
 | 	851,	/* 0.67 */ | 
 | 	847,	/* 0.68 */ | 
 | 	843,	/* 0.69 */ | 
 | 	839,	/* 0.70 */ | 
 | 	835,	/* 0.71 */ | 
 | 	831,	/* 0.72 */ | 
 | 	827,	/* 0.73 */ | 
 | 	823,	/* 0.74 */ | 
 | 	819,	/* 0.75 */ | 
 | 	815,	/* 0.76 */ | 
 | 	811,	/* 0.77 */ | 
 | 	807,	/* 0.78 */ | 
 | 	804,	/* 0.79 */ | 
 | 	800,	/* 0.80 */ | 
 | 	796,	/* 0.81 */ | 
 | 	792,	/* 0.82 */ | 
 | 	788,	/* 0.83 */ | 
 | 	784,	/* 0.84 */ | 
 | 	780,	/* 0.85 */ | 
 | 	776,	/* 0.86 */ | 
 | 	773,	/* 0.87 */ | 
 | 	769,	/* 0.88 */ | 
 | 	765,	/* 0.89 */ | 
 | 	761,	/* 0.90 */ | 
 | 	757,	/* 0.91 */ | 
 | 	754,	/* 0.92 */ | 
 | 	750,	/* 0.93 */ | 
 | 	746,	/* 0.94 */ | 
 | 	742,	/* 0.95 */ | 
 | 	739,	/* 0.96 */ | 
 | 	735,	/* 0.97 */ | 
 | 	731,	/* 0.98 */ | 
 | 	728,	/* 0.99 */ | 
 | 	724,	/* 1.00 */ | 
 | 	720,	/* 1.01 */ | 
 | }; | 
 |  | 
 | void | 
 | icossin2(int x, int y, int *cosp, int *sinp) | 
 | { | 
 | 	int sinsign, cossign, tan, tan10, rem; | 
 | 	short *stp, *ctp; | 
 |  | 
 | 	if(x == 0){ | 
 | 		if(y >= 0) | 
 | 			*sinp = ICOSSCALE, *cosp = 0; | 
 | 		else | 
 | 			*sinp = -ICOSSCALE, *cosp = 0; | 
 | 		return; | 
 | 	} | 
 | 	sinsign = cossign = 1; | 
 | 	if(x < 0){ | 
 | 		cossign = -1; | 
 | 		x = -x; | 
 | 	} | 
 | 	if(y < 0){ | 
 | 		sinsign = -1; | 
 | 		y = -y; | 
 | 	} | 
 | 	if(y > x){ | 
 | 		tan = 1000*x/y; | 
 | 		tan10 = tan/10; | 
 | 		stp = &cosinus[tan10]; | 
 | 		ctp = &sinus[tan10]; | 
 | 	}else{ | 
 | 		tan = 1000*y/x; | 
 | 		tan10 = tan/10; | 
 | 		stp = &sinus[tan10]; | 
 | 		ctp = &cosinus[tan10]; | 
 | 	} | 
 | 	rem = tan-(tan10*10); | 
 | 	*sinp = sinsign*(stp[0]+(stp[1]-stp[0])*rem/10); | 
 | 	*cosp = cossign*(ctp[0]+(ctp[1]-ctp[0])*rem/10); | 
 | } |