aboutsummaryrefslogtreecommitdiff
path: root/src/libdraw/icossin2.c
diff options
context:
space:
mode:
authorrsc <devnull@localhost>2003-09-30 17:47:42 +0000
committerrsc <devnull@localhost>2003-09-30 17:47:42 +0000
commited7c8e8d02c02bdbff1e88a6d8d1419f39af48ad (patch)
treeebcd32d20b0df2584bce713fefa87620ecd1cce7 /src/libdraw/icossin2.c
parentb2cfc4e2e71d0f0a5113ddfbd93c8285cc4d74e4 (diff)
downloadplan9port-ed7c8e8d02c02bdbff1e88a6d8d1419f39af48ad.tar.gz
plan9port-ed7c8e8d02c02bdbff1e88a6d8d1419f39af48ad.tar.bz2
plan9port-ed7c8e8d02c02bdbff1e88a6d8d1419f39af48ad.zip
Initial import.
Diffstat (limited to 'src/libdraw/icossin2.c')
-rw-r--r--src/libdraw/icossin2.c261
1 files changed, 261 insertions, 0 deletions
diff --git a/src/libdraw/icossin2.c b/src/libdraw/icossin2.c
new file mode 100644
index 00000000..aa864e1a
--- /dev/null
+++ b/src/libdraw/icossin2.c
@@ -0,0 +1,261 @@
+#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);
+}