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

📄 mymath.cpp

📁 liu7788414
💻 CPP
📖 第 1 页 / 共 5 页
字号:
#endif
	if(abs(m.e33)>=CRIT_VALUE&&abs(s)>=CRIT_VALUE)
		e33 = (m.e33>>PHT_EXT)*s;
	else
		e33 = m.e33*s>>PHT_EXT;
	return	Matrix3x3( e11,e12,e13,
					   e21,e22,e23,
					   e31,e32,e33 );
}

Vector operator*(Matrix3x3 m, Vector u)
{
#ifdef USE_FLOAT
	return Vector(	m.e11*u.x + m.e12*u.y + m.e13*u.z,
					m.e21*u.x + m.e22*u.y + m.e23*u.z,
					m.e31*u.x + m.e32*u.y + m.e33*u.z);
#else
	PhType x=0,y=0,z=0;
#ifdef DEBUG_OVERFLOW
	if(abs(m.e11)>=DANGER_VALUE&&abs(u.x)>=DANGER_VALUE)
		myPrintError("ERROR");
#endif
	if(abs(m.e11)>=CRIT_VALUE&&abs(u.x)>=CRIT_VALUE)
		x += (m.e11>>PHT_EXT)*u.x;
	else
		x += m.e11*u.x>>PHT_EXT;
#ifdef DEBUG_OVERFLOW
	if(abs(m.e12)>=DANGER_VALUE&&abs(u.y)>=DANGER_VALUE)
		myPrintError("ERROR");
#endif
	if(abs(m.e12)>=CRIT_VALUE&&abs(u.y)>=CRIT_VALUE)
		x += (m.e12>>PHT_EXT)*u.y;
	else
		x += m.e12*u.y>>PHT_EXT;
#ifdef DEBUG_OVERFLOW
	if(abs(m.e13)>=DANGER_VALUE&&abs(u.z)>=DANGER_VALUE)
		myPrintError("ERROR");
#endif
	if(abs(m.e13)>=CRIT_VALUE&&abs(u.z)>=CRIT_VALUE)
		x += (m.e13>>PHT_EXT)*u.z;
	else
		x += m.e13*u.z>>PHT_EXT;
	x >>= MULT_BTW_TRI_PHT;
#ifdef DEBUG_OVERFLOW
	if(abs(m.e21)>=DANGER_VALUE&&abs(u.x)>=DANGER_VALUE)
		myPrintError("ERROR");
#endif
	if(abs(m.e21)>=CRIT_VALUE&&abs(u.x)>=CRIT_VALUE)
		y += (m.e21>>PHT_EXT)*u.x;
	else
		y += m.e21*u.x>>PHT_EXT;
#ifdef DEBUG_OVERFLOW
	if(abs(m.e22)>=DANGER_VALUE&&abs(u.y)>=DANGER_VALUE)
		myPrintError("ERROR");
#endif
	if(abs(m.e22)>=CRIT_VALUE&&abs(u.y)>=CRIT_VALUE)
		y += (m.e22>>PHT_EXT)*u.y;
	else
		y += m.e22*u.y>>PHT_EXT;
#ifdef DEBUG_OVERFLOW
	if(abs(m.e23)>=DANGER_VALUE&&abs(u.z)>=DANGER_VALUE)
		myPrintError("ERROR");
#endif
	if(abs(m.e23)>=CRIT_VALUE&&abs(u.z)>=CRIT_VALUE)
		y += (m.e23>>PHT_EXT)*u.z;
	else
		y += m.e23*u.z>>PHT_EXT;
	y >>= MULT_BTW_TRI_PHT;
#ifdef DEBUG_OVERFLOW
	if(abs(m.e31)>=DANGER_VALUE&&abs(u.x)>=DANGER_VALUE)
		myPrintError("ERROR");
#endif
	if(abs(m.e31)>=CRIT_VALUE&&abs(u.x)>=CRIT_VALUE)
		z += (m.e31>>PHT_EXT)*u.x;
	else
		z += m.e31*u.x>>PHT_EXT;
#ifdef DEBUG_OVERFLOW
	if(abs(m.e32)>=DANGER_VALUE&&abs(u.y)>=DANGER_VALUE)
		myPrintError("ERROR");
#endif
	if(abs(m.e32)>=CRIT_VALUE&&abs(u.y)>=CRIT_VALUE)
		z += (m.e32>>PHT_EXT)*u.y;
	else
		z += m.e32*u.y>>PHT_EXT;
	if(abs(m.e33)>=CRIT_VALUE&&abs(u.z)>=CRIT_VALUE)
		z += (m.e33>>PHT_EXT)*u.z;
	else
		z += m.e33*u.z>>PHT_EXT;
	z >>= MULT_BTW_TRI_PHT;
	return Vector(x,y,z);
#endif
}

Vector operator*(Vector u, Matrix3x3 m)
{
#ifdef USE_FLOAT
	return Vector(	u.x*m.e11 + u.y*m.e21 + u.z*m.e31,
					u.x*m.e12 + u.y*m.e22 + u.z*m.e32,
					u.x*m.e13 + u.y*m.e23 + u.z*m.e33);
#else
	PhType x=0,y=0,z=0;
#ifdef DEBUG_OVERFLOW
	if(abs(m.e11)>=DANGER_VALUE&&abs(u.x)>=DANGER_VALUE)
		myPrintError("ERROR");
#endif
	if(abs(m.e11)>=CRIT_VALUE&&abs(u.x)>=CRIT_VALUE)
		x += (m.e11>>PHT_EXT)*u.x;
	else
		x += m.e11*u.x>>PHT_EXT;
#ifdef DEBUG_OVERFLOW
	if(abs(m.e21)>=DANGER_VALUE&&abs(u.y)>=DANGER_VALUE)
		myPrintError("ERROR");
#endif
	if(abs(m.e21)>=CRIT_VALUE&&abs(u.y)>=CRIT_VALUE)
		x += (m.e21>>PHT_EXT)*u.y;
	else
		x += m.e21*u.y>>PHT_EXT;
#ifdef DEBUG_OVERFLOW
	if(abs(m.e31)>=DANGER_VALUE&&abs(u.z)>=DANGER_VALUE)
		myPrintError("ERROR");
#endif
	if(abs(m.e31)>=CRIT_VALUE&&abs(u.z)>=CRIT_VALUE)
		x += (m.e31>>PHT_EXT)*u.z;
	else
		x += m.e31*u.z>>PHT_EXT;
	x >>= MULT_BTW_TRI_PHT;
#ifdef DEBUG_OVERFLOW
	if(abs(m.e12)>=DANGER_VALUE&&abs(u.x)>=DANGER_VALUE)
		myPrintError("ERROR");
#endif
	if(abs(m.e12)>=CRIT_VALUE&&abs(u.x)>=CRIT_VALUE)
		y += (m.e12>>PHT_EXT)*u.x;
	else
		y += m.e12*u.x>>PHT_EXT;
#ifdef DEBUG_OVERFLOW
	if(abs(m.e22)>=DANGER_VALUE&&abs(u.y)>=DANGER_VALUE)
		myPrintError("ERROR");
#endif
	if(abs(m.e22)>=CRIT_VALUE&&abs(u.y)>=CRIT_VALUE)
		y += (m.e22>>PHT_EXT)*u.y;
	else
		y += m.e22*u.y>>PHT_EXT;
#ifdef DEBUG_OVERFLOW
	if(abs(m.e32)>=DANGER_VALUE&&abs(u.z)>=DANGER_VALUE)
		myPrintError("ERROR");
#endif
	if(abs(m.e32)>=CRIT_VALUE&&abs(u.z)>=CRIT_VALUE)
		y += (m.e32>>PHT_EXT)*u.z;
	else
		y += m.e32*u.z>>PHT_EXT;
	y >>= MULT_BTW_TRI_PHT;
#ifdef DEBUG_OVERFLOW
	if(abs(m.e13)>=DANGER_VALUE&&abs(u.x)>=DANGER_VALUE)
		myPrintError("ERROR");
#endif
	if(abs(m.e13)>=CRIT_VALUE&&abs(u.x)>=CRIT_VALUE)
		z += (m.e13>>PHT_EXT)*u.x;
	else
		z += m.e13*u.x>>PHT_EXT;
#ifdef DEBUG_OVERFLOW
	if(abs(m.e23)>=DANGER_VALUE&&abs(u.y)>=DANGER_VALUE)
		myPrintError("ERROR");
#endif
	if(abs(m.e23)>=CRIT_VALUE&&abs(u.y)>=CRIT_VALUE)
		z += (m.e23>>PHT_EXT)*u.y;
	else
		z += m.e23*u.y>>PHT_EXT;
#ifdef DEBUG_OVERFLOW
	if(abs(m.e33)>=DANGER_VALUE&&abs(u.z)>=DANGER_VALUE)
		myPrintError("ERROR");
#endif
	if(abs(m.e33)>=CRIT_VALUE&&abs(u.z)>=CRIT_VALUE)
		z += (m.e33>>PHT_EXT)*u.z;
	else
		z += m.e33*u.z>>PHT_EXT;
	z >>= MULT_BTW_TRI_PHT;
	return Vector(x,y,z);
#endif
}

//------------------------------------------------------------------------//
// Quaternion Class and Quaternion functions
//------------------------------------------------------------------------//


Quaternion::Quaternion(void)
{
	n = 0;
	x = 0;
	y =  0;
	z = 0;
}

Quaternion::Quaternion(TriValue e0, TriValue e1, TriValue e2, TriValue e3)
{
	n = e0;
	x = e1;
	y = e2;
	z = e3;
}

PhType	Quaternion::Magnitude(void)
{
#ifdef USE_FLOAT
	return sqrt(n*n + x*x + y*y + z*z);
#else
	PhType m[4];
	m[0]=(PhType)n; m[1]=(PhType)x; m[2]=(PhType)y; m[3]=(PhType)z;
	return calLength(m,4)>>MULT_BTW_TRI_PHT;
#endif
}


void Quaternion::Normalize(void){
	
#ifdef USE_FLOAT
	
	PhType l = sqrt(n*n+x*x+y*y+z*z);
	n /= l;
	x /= l;
	y /= l;
	z /= l;
	
#else
	
	PhType m;
	PhType mm[4];
	mm[0]=(PhType)n; mm[1]=(PhType)x; mm[2]=(PhType)y; mm[3]=(PhType)z;
	m = calLength(mm,4);//>>MULT_BTW_TRI_PHT;
	
	
	if(m==0)   m=1<<TRI_EXT;
	n = (n<<(TRI_EXT-4))/(m>>4);
	x = (x<<(TRI_EXT-4))/(m>>4);
	y = (y<<(TRI_EXT-4))/(m>>4);
	z = (z<<(TRI_EXT-4))/(m>>4);
	
#endif
	
	
}




Vector	Quaternion::GetVector(void)
{
	return Vector((PhType)x>>MULT_BTW_TRI_PHT, (PhType)y>>MULT_BTW_TRI_PHT, (PhType)z>>MULT_BTW_TRI_PHT);
}
/*
PhType	Quaternion::GetScalar(void)
{
	return n>>MULT_BTW_TRI_PHT;
}
*/
Quaternion	Quaternion::operator+=(Quaternion q)
{
	n += q.n;
	x += q.x;
	y += q.y;
	z += q.z;
	return *this;
}

Quaternion	Quaternion::operator-=(Quaternion q)
{
	n -= q.n;
	x -= q.x;
	y -= q.y;
	z -= q.z;
	return *this;
}

Quaternion Quaternion::operator*=(PhType s)
{
#ifdef DEBUG_OVERFLOW
	if(abs(n)>=DANGER_VALUE&&abs(s)>=DANGER_VALUE)
		myPrintError("ERROR");
#endif
	if(abs(n)>=CRIT_VALUE&&abs(s)>=CRIT_VALUE)
		n = (n>>PHT_EXT)*s;
	else
		n = n*s>>PHT_EXT;
#ifdef DEBUG_OVERFLOW
	if(abs(x)>=DANGER_VALUE&&abs(s)>=DANGER_VALUE)
		myPrintError("ERROR");
#endif
	if(abs(x)>=CRIT_VALUE&&abs(s)>=CRIT_VALUE)
		x = (x>>PHT_EXT)*s;
	else
		x = x*s>>PHT_EXT;
#ifdef DEBUG_OVERFLOW
	if(abs(y)>=DANGER_VALUE&&abs(s)>=DANGER_VALUE)
		myPrintError("ERROR");
#endif
	if(abs(y)>=CRIT_VALUE&&abs(s)>=CRIT_VALUE)
		y = (y>>PHT_EXT)*s;
	else
		y = y*s>>PHT_EXT;
#ifdef DEBUG_OVERFLOW
	if(abs(z)>=DANGER_VALUE&&abs(s)>=DANGER_VALUE)
		myPrintError("ERROR");
#endif
	if(abs(z)>=CRIT_VALUE&&abs(s)>=CRIT_VALUE)
		z = (z>>PHT_EXT)*s;
	else
		z = z*s>>PHT_EXT;	
	return *this;
}

Quaternion Quaternion::operator/=(PhType s)
{
	n = n<<PHT_EXT;
	n /= s;
	x = x<<PHT_EXT;
	x /= s;
	y = y<<PHT_EXT;
	y /= s;
	z = z<<PHT_EXT;
	z /= s;
	return *this;
}

Quaternion operator+(Quaternion q1, Quaternion q2)
{
	return	Quaternion(	q1.n + q2.n,
							q1.x + q2.x,
							q1.y + q2.y,
							q1.z + q2.z);
}

Quaternion operator-(Quaternion q1, Quaternion q2)
{
	return	Quaternion(	q1.n - q2.n,
							q1.x - q2.x,
							q1.y - q2.y,
							q1.z - q2.z);
}

Quaternion operator*(Quaternion q1, Quaternion q2)
{
#ifdef USE_FLOAT
	return	Quaternion(	q1.n*q2.n - q1.x*q2.x - q1.y*q2.y - q1.z*q2.z,
						q1.n*q2.x + q1.x*q2.n + q1.y*q2.z - q1.z*q2.y,
						q1.n*q2.y + q1.y*q2.n + q1.z*q2.x - q1.x*q2.z,
						q1.n*q2.z + q1.z*q2.n + q1.x*q2.y - q1.y*q2.x);
#else
	TriValue n=0,x=0,y=0,z=0;
	//q1.n*q2.n - q1.x*q2.x - q1.y*q2.y - q1.z*q2.z
#ifdef DEBUG_OVERFLOW
	if(abs(q1.n)>=DANGER_VALUET&&abs(q2.n)>=DANGER_VALUET)
		myPrintError("ERROR_T");
#endif
	if(abs(q1.n)>=CRIT_VALUE&&abs(q2.n)>=CRIT_VALUE)
		n += (q1.n>>TRI_EXT)*q2.n;
	else
		n += q1.n*q2.n>>TRI_EXT;
#ifdef DEBUG_OVERFLOW
	if(abs(q1.x)>=DANGER_VALUET&&abs(q2.x)>=DANGER_VALUET)
		myPrintError("ERROR_T");
#endif
	if(abs(q1.x)>=CRIT_VALUE&&abs(q2.x)>=CRIT_VALUE)
		n -= (q1.x>>TRI_EXT)*q2.x;
	else
		n -= q1.x*q2.x>>TRI_EXT;
#ifdef DEBUG_OVERFLOW
	if(abs(q1.y)>=DANGER_VALUET&&abs(q2.y)>=DANGER_VALUET)
		myPrintError("ERROR_T");
#endif
	if(abs(q1.y)>=CRIT_VALUE&&abs(q2.y)>=CRIT_VALUE)
		n -= (q1.y>>TRI_EXT)*q2.y;
	else
		n -= q1.y*q2.y>>TRI_EXT;
#ifdef DEBUG_OVERFLOW
	if(abs(q1.z)>=DANGER_VALUET&&abs(q2.z)>=DANGER_VALUET)
		myPrintError("ERROR_T");
#endif
	if(abs(q1.z)>=CRIT_VALUE&&abs(q2.z)>=CRIT_VALUE)
		n -= (q1.z>>TRI_EXT)*q2.z;
	else
		n -= q1.z*q2.z>>TRI_EXT;
	
	//q1.n*q2.x + q1.x*q2.n + q1.y*q2.z - q1.z*q2.y
#ifdef DEBUG_OVERFLOW
	if(abs(q1.n)>=DANGER_VALUET&&abs(q2.x)>=DANGER_VALUET)
		myPrintError("ERROR_T");
#endif
	if(abs(q1.n)>=CRIT_VALUE&&abs(q2.x)>=CRIT_VALUE)
		x += (q1.n>>TRI_EXT)*q2.x;
	else
		x += q1.n*q2.x>>TRI_EXT;
#ifdef DEBUG_OVERFLOW
	if(abs(q1.x)>=DANGER_VALUET&&abs(q2.n)>=DANGER_VALUET)
		myPrintError("ERROR_T");
#endif
	if(abs(q1.x)>=CRIT_VALUE&&abs(q2.n)>=CRIT_VALUE)
		x += (q1.x>>TRI_EXT)*q2.n;
	else
		x += q1.x*q2.n>>TRI_EXT;
#ifdef DEBUG_OVERFLOW
	if(abs(q1.y)>=DANGER_VALUET&&abs(q2.z)>=DANGER_VALUET)
		myPrintError("ERROR_T");
#endif
	if(abs(q1.y)>=CRIT_VALUE&&abs(q2.z)>=CRIT_VALUE)
		x += (q1.y>>TRI_EXT)*q2.z;
	else
		x += q1.y*q2.z>>TRI_EXT;
#ifdef DEBUG_OVERFLOW
	if(abs(q1.z)>=DANGER_VALUET&&abs(q2.y)>=DANGER_VALUET)
		myPrintError("ERROR_T");
#endif
	if(abs(q1.z)>=CRIT_VALUE&&abs(q2.y)>=CRIT_VALUE)
		x -= (q1.z>>TRI_EXT)*q2.y;
	else
		x -= q1.z*q2.y>>TRI_EXT;

	//q1.n*q2.y + q1.y*q2.n + q1.z*q2.x - q1.x*q2.z
#ifdef DEBUG_OVERFLOW
	if(abs(q1.n)>=DANGER_VALUET&&abs(q2.y)>=DANGER_VALUET)
		myPrintError("ERROR_T");
#endif
	if(abs(q1.n)>=CRIT_VALUE&&abs(q2.y)>=CRIT_VALUE)
		y += (q1.n>>TRI_EXT)*q2.y;
	else
		y += q1.n*q2.y>>TRI_EXT;
#ifdef DEBUG_OVERFLOW
	if(abs(q1.y)>=DANGER_VALUET&&abs(q2.n)>=DANGER_VALUET)
		myPrintError("ERROR_T");
#endif
	if(abs(q1.y)>=CRIT_VALUE&&abs(q2.n)>=CRIT_VALUE)
		y += (q1.y>>TRI_EXT)*q2.n;
	else
		y += q1.y*q2.n>>TRI_EXT;
#ifdef DEBUG_OVERFLOW
	if(abs(q1.z)>=DANGER_VALUET&&abs(q2.x)>=DANGER_VALUET)
		myPrintError("ERROR_T");
#endif
	if(abs(q1.z)>=CRIT_VALUE&&abs(q2.x)>=CRIT_VALUE)
		y += (q1.z>>TRI_EXT)*q2.x;
	else
		y += q1.z*q2.x>>TRI_EXT;
#ifdef DEBUG_OVERFLOW
	if(abs(q1.x)>=DANGER_VALUET&&abs(q2.z)>=DANGER_VALUET)
		myPrintError("ERROR_T");
#endif
	if(abs(q1.x)>=CRIT_VALUE&&abs(q2.z)>=CRIT_VALUE)
		y -= (q1.x>>TRI_EXT)*q2.z;
	else
		y -= q1.x*q2.z>>TRI_EXT;

	//q1.n*q2.z + q1.z*q2.n + q1.x*q2.y - q1.y*q2.x
#ifdef DEBUG_OVERFLOW
	if(abs(q1.n)>=DANGER_VALUET&&abs(q2.z)>=DANGER_VALUET)
		myPrintError("ERROR_T");
#endif
	if(abs(q1.n)>=CRIT_VALUE&&abs(q2.z)>=CRIT_VALUE)
		z += (q1.n>>TRI_EXT)*q2.z;
	else
		z += q1.n*q2.z>>TRI_EXT;
#ifdef DEBUG_OVERFLOW
	if(abs(q1.z)>=DANGER_VALUET&&abs(q2.n)>=DANGER_VALUET)
		myPrintError("ERROR_T");
#endif
	if(abs(q1.z)>=CRIT_VALUE&&abs(q2.n)>=CRIT_VALUE)
		z += (q1.z>>TRI_EXT)*q2.n;
	else
		z += q1.z*q2.n>>TRI_EXT;
#ifdef DEBUG_OVERFLOW
	if(abs(q1.x)>=DANGER_VALUET&&abs(q2.y)>=DANGER_VALUET)
		myPrintError("ERROR_T");
#endif
	if(abs(q1.x)>=CRIT_VALUE&&abs(q2.y)>=CRIT_VALUE)
		z += (q1.x>>TRI_EXT)*q2.y;
	else
		z += q1.x*q2.y>>TRI_EXT;
#ifdef DEBUG_OVERFLOW
	if(abs(q1.y)>=DANGER_VALUET&&abs(q2.x)>=DANGER_VALUET)
		myPrintError("ERROR_T");
#endif
	if(abs(q1.y)>=CRIT_VALUE&&abs(q2.x)>=CRIT_VALUE)
		z -= (q1.y>>TRI_EXT)*q2.x;
	else
		z -= q1.y*q2.x>>TRI_EXT;
	return	Quaternion(n,x,y,z);
#endif
}

Quaternion operator*(Quaternion q, PhType s)
{
#ifdef USE_FLOAT
	return	Quaternion(q.n*s, q.x*s, q.y*s, q.z*s);
#else
	TriValue n,x,y,z;
#ifdef DEBUG_OVERFLOW
	if(abs(q.n)>=DANGER_VALUE&&abs(s)>=DANGER_VALUE)
		myPrintError("ERROR");
#endif
	if(abs(q.n)>=CRIT_VALUE&&abs(s)>=CRIT_VALUE)
		n = (q.n>>PHT_EXT)*s;
	else
		n = q.n*s>>PHT_EXT;
#ifdef DEBUG_OVERFLOW
	if(abs(q.x)>=DANGER_VALUE&&abs(s)>=DANGER_VALUE)
		myPrintError("ERROR");
#endif
	if(abs(q.x)>=CRIT_VALUE&&abs(s)>=CRIT_VALUE)
		x = (q.x>>PHT_EXT)*s;
	else
		x = q.x*s>>PHT_EXT;
#ifdef DEBUG_OVERFLOW
	if(

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -