|
|
DataMuseum.dkPresents historical artifacts from the history of: DKUUG/EUUG Conference tapes |
This is an automatic "excavation" of a thematic subset of
See our Wiki for more about DKUUG/EUUG Conference tapes Excavated with: AutoArchaeologist - Free & Open Source Software. |
top - metrics - downloadIndex: T t
Length: 7990 (0x1f36)
Types: TextFile
Names: »trigtab.c«
└─⟦b20c6495f⟧ Bits:30007238 EUUGD18: Wien-båndet, efterår 1987
└─⟦this⟧ »EUUGD18/X/Xtrek/trigtab.c«
static char sccsid[] = "@(#)trigtab.c 1.1";
long isin[] = {
-8192,
-8189,
-8182,
-8169,
-8152,
-8130,
-8103,
-8071,
-8034,
-7992,
-7947,
-7895,
-7839,
-7779,
-7713,
-7643,
-7568,
-7489,
-7405,
-7317,
-7225,
-7127,
-7027,
-6921,
-6811,
-6697,
-6580,
-6458,
-6333,
-6203,
-6070,
-5933,
-5793,
-5649,
-5501,
-5351,
-5197,
-5040,
-4880,
-4717,
-4552,
-4383,
-4212,
-4038,
-3862,
-3683,
-3503,
-3321,
-3135,
-2949,
-2760,
-2570,
-2378,
-2185,
-1991,
-1795,
-1599,
-1401,
-1203,
-1003,
-804,
-603,
-403,
-202,
0,
199,
400,
601,
801,
1001,
1200,
1399,
1596,
1794,
1989,
2183,
2376,
2568,
2758,
2947,
3133,
3318,
3501,
3682,
3860,
4037,
4210,
4381,
4549,
4716,
4879,
5038,
5196,
5350,
5500,
5647,
5791,
5931,
6068,
6202,
6331,
6456,
6578,
6696,
6810,
6920,
7025,
7127,
7223,
7316,
7404,
7488,
7567,
7642,
7712,
7778,
7838,
7894,
7946,
7992,
8034,
8070,
8102,
8130,
8152,
8169,
8182,
8189,
8192,
8189,
8182,
8169,
8152,
8130,
8103,
8071,
8034,
7992,
7946,
7895,
7838,
7778,
7712,
7643,
7568,
7489,
7405,
7317,
7224,
7127,
7026,
6921,
6811,
6697,
6579,
6458,
6332,
6202,
6070,
5933,
5792,
5649,
5501,
5351,
5197,
5040,
4879,
4716,
4551,
4382,
4211,
4037,
3861,
3683,
3502,
3320,
3135,
2948,
2759,
2569,
2378,
2184,
1990,
1794,
1598,
1400,
1202,
1003,
803,
602,
402,
201,
0,
-200,
-401,
-602,
-802,
-1002,
-1201,
-1400,
-1597,
-1794,
-1989,
-2184,
-2377,
-2569,
-2759,
-2947,
-3134,
-3319,
-3502,
-3683,
-3860,
-4037,
-4210,
-4381,
-4550,
-4716,
-4879,
-5039,
-5196,
-5350,
-5500,
-5648,
-5792,
-5932,
-6069,
-6202,
-6332,
-6457,
-6579,
-6696,
-6810,
-6920,
-7026,
-7127,
-7224,
-7317,
-7405,
-7489,
-7567,
-7643,
-7712,
-7778,
-7838,
-7895,
-7946,
-7992,
-8034,
-8071,
-8103,
-8130,
-8152,
-8169,
-8182,
-8189
};
long icos[] = {
0,
200,
402,
602,
802,
1002,
1201,
1400,
1598,
1794,
1990,
2184,
2378,
2569,
2759,
2948,
3135,
3319,
3502,
3683,
3861,
4037,
4211,
4382,
4551,
4716,
4879,
5039,
5197,
5351,
5500,
5648,
5792,
5932,
6069,
6202,
6332,
6457,
6579,
6697,
6811,
6920,
7026,
7127,
7224,
7317,
7405,
7489,
7568,
7643,
7712,
7778,
7838,
7895,
7946,
7992,
8034,
8071,
8103,
8130,
8152,
8169,
8182,
8189,
8192,
8189,
8182,
8169,
8152,
8130,
8103,
8071,
8034,
7992,
7946,
7895,
7839,
7778,
7713,
7643,
7568,
7489,
7405,
7317,
7224,
7127,
7027,
6921,
6811,
6697,
6579,
6458,
6333,
6203,
6070,
5933,
5793,
5649,
5501,
5351,
5197,
5040,
4880,
4717,
4551,
4383,
4212,
4038,
3862,
3683,
3502,
3320,
3135,
2949,
2760,
2570,
2378,
2185,
1991,
1795,
1599,
1400,
1202,
1003,
803,
603,
403,
201,
0,
-199,
-401,
-602,
-801,
-1001,
-1200,
-1400,
-1597,
-1794,
-1989,
-2183,
-2377,
-2569,
-2759,
-2947,
-3134,
-3318,
-3502,
-3682,
-3860,
-4037,
-4210,
-4381,
-4550,
-4716,
-4879,
-5038,
-5196,
-5350,
-5500,
-5648,
-5791,
-5932,
-6069,
-6202,
-6331,
-6457,
-6578,
-6696,
-6810,
-6920,
-7026,
-7127,
-7224,
-7317,
-7404,
-7489,
-7567,
-7642,
-7712,
-7778,
-7838,
-7894,
-7946,
-7992,
-8034,
-8071,
-8103,
-8130,
-8152,
-8169,
-8182,
-8189,
-8192,
-8189,
-8182,
-8169,
-8152,
-8130,
-8103,
-8071,
-8034,
-7992,
-7947,
-7895,
-7839,
-7779,
-7713,
-7643,
-7568,
-7489,
-7406,
-7317,
-7225,
-7128,
-7027,
-6921,
-6812,
-6698,
-6580,
-6458,
-6333,
-6203,
-6071,
-5934,
-5793,
-5650,
-5502,
-5351,
-5197,
-5041,
-4880,
-4717,
-4552,
-4383,
-4212,
-4038,
-3862,
-3684,
-3503,
-3321,
-3135,
-2949,
-2761,
-2570,
-2379,
-2186,
-1992,
-1796,
-1599,
-1401,
-1203,
-1004,
-804,
-603,
-403,
-202
};
/*
** table for computing inverse tangent values
*/
long iatan[] = {
0,
201,
402,
604,
806,
1010,
1215,
1421,
1629,
1839,
2051,
2267,
2485,
2706,
2931,
3160,
3393,
3631,
3874,
4123,
4378,
4640,
4910,
5187,
5473,
5769,
6075,
6393,
6723,
7066,
7424,
7799,
8192,
8604,
9038,
9496,
9981,
10497,
11045,
11631,
12260,
12936,
13667,
14460,
15326,
16274,
17320,
18480,
19777,
21236,
22895,
24797,
27005,
29602,
32704,
36480,
41183,
47211,
55225,
66418,
83174,
111056,
166751,
333705
};
#include <X11/Xlib.h>
#include "defs.h"
unsigned char iatan2(y, x)
int x, y;
{
int bottom, top, i;
long z, scaled_y;
scaled_y = y << TRIGSCALE;
if (x == 0) i = (y >= 0 ? 64 : 192);
else {
z = abs(scaled_y/x);
#ifdef DEBUG
printf("Looking for closest table value to %ld\n", z);
#endif DEBUG
bottom = 0;
top = sizeof(iatan)/sizeof(long) - 1;
/*-------------------------------------------------------------------------
* Loop Invariant: top - bottom > 1 && iatan[bottom] < z <= iatan[top]
*
* At end of loop this guarantees:
* top-bottom <= 1 && top-prev_bottom > 1 ==> top-bottom = 1
* Also iatan[bottom] < z <= iatan[top]. So we will return the closer of
* these two values.
*-------------------------------------------------------------------------
*/
while (top-bottom > 1) {
i = bottom + ((top-bottom)>>1);
if (iatan[i] < z) bottom = i;
else top = i;
}
/* Choose the closer of the two values */
i = (abs(iatan[top] - z) < abs(iatan[bottom] - z)) ? top : bottom;
} /* else */
#ifdef DEBUG
printf("original i: %d; ", i);
#endif DEBUG
if (y == 0) i = (x >= 0) ? 0 : 128;
else if (x < 0 && y > 0) i = 128-i;
else if (x < 0 && y < 0) i += 128;
else if (x > 0 && y < 0) i = 256-i;
#ifdef DEBUG
printf("iatan2(%d, %d) = %d\n", y, x, i);
#endif DEBUG
return(i);
}
/*
* The isin and icos routines in trigtab.c are made to work in the obscure
* coordinate system used by xtrek (angles measured from the positive y axis).
* This routine snags out 1/4 of the isin table and uses it to produce
* values of the sin function from the normal coordinate system. This
* has the advantage of making things like the law of sines work.
*/
int
normal_isin(in_angle)
unsigned char in_angle;
{
int minus = 1;
unsigned char angle = in_angle;
/* sin(a) = -sin(a-pi) */
if (angle > 128) {
angle = angle - 128;
minus *= -1;
}
/* sin(a) = sin(pi-a) */
if (angle > 64) {
angle = 128 - angle;
}
angle = angle + 64; /* stupid isin table is broken */
return(isin[angle]);
}