#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); | |
} |