⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 fix.cpp

📁 这个是symbian下的一个蛮庞大的3D游戏源代码!对于学习3D开发的人有很大的帮助!
💻 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 + -