📄 fix.cpp
字号:
#include "Fix.h"
#include "stdint.h"
#include <math.h>
#include <config.h>
static const int SINTAB[256] = { // 16.16 fixed, angles 0-pi/2, exclusive
0, 402, 804, 1206, 1608, 2010, 2412, 2814,
3216, 3617, 4019, 4420, 4821, 5222, 5623, 6023,
6424, 6824, 7224, 7623, 8022, 8421, 8820, 9218,
9616, 10014, 10411, 10808, 11204, 11600, 11996, 12391,
12785, 13180, 13573, 13966, 14359, 14751, 15143, 15534,
15924, 16314, 16703, 17091, 17479, 17867, 18253, 18639,
19024, 19409, 19792, 20175, 20557, 20939, 21320, 21699,
22078, 22457, 22834, 23210, 23586, 23961, 24335, 24708,
25080, 25451, 25821, 26190, 26558, 26925, 27291, 27656,
28020, 28383, 28745, 29106, 29466, 29824, 30182, 30538,
30893, 31248, 31600, 31952, 32303, 32652, 33000, 33347,
33692, 34037, 34380, 34721, 35062, 35401, 35738, 36075,
36410, 36744, 37076, 37407, 37736, 38064, 38391, 38716,
39040, 39362, 39683, 40002, 40320, 40636, 40951, 41264,
41576, 41886, 42194, 42501, 42806, 43110, 43412, 43713,
44011, 44308, 44604, 44898, 45190, 45480, 45769, 46056,
46341, 46624, 46906, 47186, 47464, 47741, 48015, 48288,
48559, 48828, 49095, 49361, 49624, 49886, 50146, 50404,
50660, 50914, 51166, 51417, 51665, 51911, 52156, 52398,
52639, 52878, 53114, 53349, 53581, 53812, 54040, 54267,
54491, 54714, 54934, 55152, 55368, 55582, 55794, 56004,
56212, 56418, 56621, 56823, 57022, 57219, 57414, 57607,
57798, 57986, 58172, 58356, 58538, 58718, 58896, 59071,
59244, 59415, 59583, 59750, 59914, 60075, 60235, 60392,
60547, 60700, 60851, 60999, 61145, 61288, 61429, 61568,
61705, 61839, 61971, 62101, 62228, 62353, 62476, 62596,
62714, 62830, 62943, 63054, 63162, 63268, 63372, 63473,
63572, 63668, 63763, 63854, 63944, 64031, 64115, 64197,
64277, 64354, 64429, 64501, 64571, 64639, 64704, 64766,
64827, 64884, 64940, 64993, 65043, 65091, 65137, 65180,
65220, 65259, 65294, 65328, 65358, 65387, 65413, 65436,
65457, 65476, 65492, 65505, 65516, 65525, 65531, 65535 };
Fix Fix::sin( int v )
{
v &= 1023;
if ( v < 256 )
return Fix( SINTAB[v]>>(16-FIX_SHIFT) );
else if ( v < 512 )
return Fix( SINTAB[511-v]>>(16-FIX_SHIFT) );
else if ( v < 768 )
return -Fix( SINTAB[v-512]>>(16-FIX_SHIFT) );
else
return -Fix( SINTAB[1023-v]>>(16-FIX_SHIFT) );
}
Fix Fix::cos( int v )
{
return sin( v+256 );
}
Fix Fix::atan2( Fix y, Fix x )
{
Fix coeff_1 = Fixf(0.785398);
Fix coeff_2 = Fixf(3) * coeff_1;
Fix abs_y = y;
if ( abs_y.v < 0 )
abs_y = -abs_y;
abs_y.v += 1;
Fix r, angle;
if ( x.v >= 0 )
{
r = (x - abs_y) / (x + abs_y);
angle = coeff_1 - coeff_1 * r;
}
else
{
r = (x + abs_y) / (abs_y - x);
angle = coeff_2 - coeff_1 * r;
}
if ( y.v < 0 )
return -angle; // negate if in quad III or IV
else
return angle;
}
static const int table[] =
{
0, 16, 22, 27, 32, 35, 39, 42, 45, 48, 50, 53, 55, 57,
59, 61, 64, 65, 67, 69, 71, 73, 75, 76, 78, 80, 81, 83,
84, 86, 87, 89, 90, 91, 93, 94, 96, 97, 98, 99, 101, 102,
103, 104, 106, 107, 108, 109, 110, 112, 113, 114, 115, 116, 117, 118,
119, 120, 121, 122, 123, 124, 125, 126, 128, 128, 129, 130, 131, 132,
133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 144, 145,
146, 147, 148, 149, 150, 150, 151, 152, 153, 154, 155, 155, 156, 157,
158, 159, 160, 160, 161, 162, 163, 163, 164, 165, 166, 167, 167, 168,
169, 170, 170, 171, 172, 173, 173, 174, 175, 176, 176, 177, 178, 178,
179, 180, 181, 181, 182, 183, 183, 184, 185, 185, 186, 187, 187, 188,
189, 189, 190, 191, 192, 192, 193, 193, 194, 195, 195, 196, 197, 197,
198, 199, 199, 200, 201, 201, 202, 203, 203, 204, 204, 205, 206, 206,
207, 208, 208, 209, 209, 210, 211, 211, 212, 212, 213, 214, 214, 215,
215, 216, 217, 217, 218, 218, 219, 219, 220, 221, 221, 222, 222, 223,
224, 224, 225, 225, 226, 226, 227, 227, 228, 229, 229, 230, 230, 231,
231, 232, 232, 233, 234, 234, 235, 235, 236, 236, 237, 237, 238, 238,
239, 240, 240, 241, 241, 242, 242, 243, 243, 244, 244, 245, 245, 246,
246, 247, 247, 248, 248, 249, 249, 250, 250, 251, 251, 252, 252, 253,
253, 254, 254, 255
};
int Fix::sqrt( int x )
{
int xn;
if (x >= 0x10000)
{
if (x >= 0x1000000)
{
if (x >= 0x10000000)
{
if (x >= 0x40000000)
{
xn = table[x >> 24] << 8;
}
else
{
xn = table[x >> 22] << 7;
}
}
else
{
if (x >= 0x4000000)
{
xn = table[x >> 20] << 6;
}
else
{
xn = table[x >> 18] << 5;
}
}
xn = (xn + 1 + (x / xn)) >> 1;
xn = (xn + 1 + (x / xn)) >> 1;
return ((xn * xn) > x) ? --xn : xn;
}
else
{
if (x >= 0x100000)
{
if (x >= 0x400000)
{
xn = table[x >> 16] << 4;
}
else
{
xn = table[x >> 14] << 3;
}
}
else
{
if (x >= 0x40000)
{
xn = table[x >> 12] << 2;
}
else
{
xn = table[x >> 10] << 1;
}
}
xn = (xn + 1 + (x / xn)) >> 1;
return ((xn * xn) > x) ? --xn : xn;
}
}
else
{
if (x >= 0x100)
{
if (x >= 0x1000)
{
if (x >= 0x4000)
{
xn = (table[x >> 8]) + 1;
}
else
{
xn = (table[x >> 6] >> 1) + 1;
}
}
else
{
if (x >= 0x400)
{
xn = (table[x >> 4] >> 2) + 1;
}
else
{
xn = (table[x >> 2] >> 3) + 1;
}
}
return ((xn * xn) > x) ? --xn : xn;
}
else
{
if (x >= 0)
{
return table[x] >> 4;
}
}
}
return -1;
}
Fix Fix::sqrt( Fix x )
{
return Fix( sqrt( x.v ) << (FIX_SHIFT/2) );
}
// End of file
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -