/* this is [als]'s wonder trig object */ int *sintab; create() { sintab = ({ 0, 17452, 34899, 52335, 69756, 87155, 104528, 121869, 139173, 156434, 173648, 190808, 207911, 224951, 241921, 258819, 275637, 292371, 309016, 325568, 342020, 358367, 374606, 390731, 406736, 422618, 438371, 453990, 469471, 484809, 500000, 515038, 529919, 544639, 559192, 573576, 587785, 601815, 615661, 629320, 642787, 656059, 669130, 681998, 694658, 707106, 719339, 731353, 743144, 754709, 766044, 777145, 788010, 798635, 809016, 819152, 829037, 838670, 848048, 857167, 866025, 874619, 882947, 891006, 898794, 906307, 913545, 920504, 927183, 933580, 939692, 945518, 951056, 956304, 961261, 965925, 970295, 974370, 978147, 981627, 984807, 987688, 990268, 992546, 994521, 996194, 997564, 998629, 999390, 999847, 1000000 }); } int sin(int angle) /* return sin(angle in degrees) * 1000000 */ { /* for 'huge' angles this may be slow, but for the small angles we are expecting it is fine */ while (angle < 0) angle += 360; while (angle >= 360) angle -= 360; if (angle >= 270) return -sintab[360 - angle]; if (angle >= 180) return -sintab[angle - 180]; if (angle >= 90) return sintab[180 - angle]; return sintab[angle]; } int cos(int angle) { return sin(90 - angle); } int tan(int angle) { /* 1000 * 1e6 is the maximum ... so we have to divide the bottom by 1000 :( losing accuracy along the way of course. */ return 1000 * sin(angle) / (sin(90 - angle) / 1000); }