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

📄 affinematrix.cpp

📁 机甲指挥官2源代码
💻 CPP
📖 第 1 页 / 共 2 页
字号:
					fxch		st(2)
					faddp       st(1),st				//				A2,1

					fld         dword ptr [edx+0ch]		//	s1[3][0]
					fmul        dword ptr [esi+010h]	//	s2[0][1]	M3,1

					fxch		st(2)
					faddp       st(1),st				//				A2,2

					fld         dword ptr [edx+01ch]	//	s1[3][1]
					fmul        dword ptr [esi+014h]	//	s2[1][1]	M3,2

					fxch		st(1)
					fstp        dword ptr [eax+018h]	//	[2][1]		S2

					fld         dword ptr [edx+02ch]	//	s1[3][2]
					fmul        dword ptr [esi+018h]	//	s2[2][1]	M3,3

					fxch		st(2)
					faddp       st(1),st				//				A3,1

//^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

					fld         dword ptr [edx]			//	s1[0][0]
					fmul        dword ptr [esi+020h]	//	s2[0][2]	M0,1

					fxch		st(2)
					faddp		st(1),st				//				A3,2

					fld         dword ptr [edx+010h]	//	s1[0][1]
					fmul        dword ptr [esi+024h]	//	s2[1][2]	M0,2

					fxch		st(1)
					fadd        dword ptr [esi+01Ch]	//	s2[3][1]	A3,3
					
					fld         dword ptr [edx+020h]	//	s1[0][2]
					fmul        dword ptr [esi+028h]	//	s2[2][2]	M0,3

					fxch		st(1)
					fstp        dword ptr [eax+01Ch]	//	[3][1]		S3

//vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv

					fxch		st(2)
					faddp       st(1),st				//				A0,1

					fld         dword ptr [edx+4]		//	s1[1][0]
					fmul        dword ptr [esi+020h]	//	s2[0][2]	M1,1

					fxch		st(2)
					faddp       st(1),st				//				A0,2

					fld         dword ptr [edx+014h]	//	s1[1][1]
					fmul        dword ptr [esi+024h]	//	s2[1][2]	M1,2
					
					fxch		st(1)
					fstp        dword ptr [eax+020h]	//	[0][2]		S0

					fld         dword ptr [edx+024h]	//	s1[1][2]
					fmul        dword ptr [esi+028h]	//	s2[2][2]	M1,3

					fxch		st(2)
					faddp       st(1),st				//				A1,1

					fld         dword ptr [edx+8]		//	s1[2][0]
					fmul        dword ptr [esi+020h]	//	s2[0][2]	M2,1

					fxch		st(2)
					faddp       st(1),st				//				A1,2

					fld         dword ptr [edx+018h]	//	s1[2][1]
					fmul        dword ptr [esi+024h]	//	s2[1][2]	M2,2

					fxch		st(1)
					fstp        dword ptr [eax+024h]	//	[1][2]		S1

					fld         dword ptr [edx+028h]	//	s1[2][2]
					fmul        dword ptr [esi+028h]	//	s2[2][2]	M2,3
					
					fxch		st(2)
					faddp       st(1),st				//				A2,1

					fld         dword ptr [edx+0ch]		//	s1[3][0]
					fmul        dword ptr [esi+020h]	//	s2[0][2]	M3,1

					fxch		st(2)
					faddp       st(1),st				//				A2,2

					fld         dword ptr [edx+01ch]	//	s1[3][1]
					fmul        dword ptr [esi+024h]	//	s2[1][2]	M3,2

					fxch		st(1)
					fstp        dword ptr [eax+028h]	//	[2][2]		S2

					fld         dword ptr [edx+02ch]	//	s1[3][2]
					fmul        dword ptr [esi+028h]	//	s2[2][2]	M3,3

					fxch		st(2)
					faddp       st(1),st				//				A3,1

					faddp		st(1),st				//				A3,2
					fadd        dword ptr [esi+02Ch]	//	s2[3][2]	A3,3
					
					fstp        dword ptr [eax+02Ch]	//	[3][2]		S3

					pop         esi
				}
#else
	(*this)(0,0) =
		Source1(0,0)*Source2(0,0)
		 + Source1(0,1)*Source2(1,0)
		 + Source1(0,2)*Source2(2,0);
	(*this)(1,0) =
		Source1(1,0)*Source2(0,0)
		 + Source1(1,1)*Source2(1,0)
		 + Source1(1,2)*Source2(2,0);
	(*this)(2,0) =
		Source1(2,0)*Source2(0,0)
		 + Source1(2,1)*Source2(1,0)
		 + Source1(2,2)*Source2(2,0);
	(*this)(3,0) =
		Source1(3,0)*Source2(0,0)
		 + Source1(3,1)*Source2(1,0)
		 + Source1(3,2)*Source2(2,0)
		 + Source2(3,0);

	(*this)(0,1) =
		Source1(0,0)*Source2(0,1)
		 + Source1(0,1)*Source2(1,1)
		 + Source1(0,2)*Source2(2,1);
	(*this)(1,1) =
		Source1(1,0)*Source2(0,1)
		 + Source1(1,1)*Source2(1,1)
		 + Source1(1,2)*Source2(2,1);
	(*this)(2,1) =
		Source1(2,0)*Source2(0,1)
		 + Source1(2,1)*Source2(1,1)
		 + Source1(2,2)*Source2(2,1);
	(*this)(3,1) =
		Source1(3,0)*Source2(0,1)
		 + Source1(3,1)*Source2(1,1)
		 + Source1(3,2)*Source2(2,1)
		 + Source2(3,1);

	(*this)(0,2) =
		Source1(0,0)*Source2(0,2)
		 + Source1(0,1)*Source2(1,2)
		 + Source1(0,2)*Source2(2,2);
	(*this)(1,2) =
		Source1(1,0)*Source2(0,2)
		 + Source1(1,1)*Source2(1,2)
		 + Source1(1,2)*Source2(2,2);
	(*this)(2,2) =
		Source1(2,0)*Source2(0,2)
		 + Source1(2,1)*Source2(1,2)
		 + Source1(2,2)*Source2(2,2);
	(*this)(3,2) =
		Source1(3,0)*Source2(0,2)
		 + Source1(3,1)*Source2(1,2)
		 + Source1(3,2)*Source2(2,2)
		 + Source2(3,2);
#endif

	return *this;
}
#endif

//
//###########################################################################
//###########################################################################
//
AffineMatrix4D&
	AffineMatrix4D::Invert(const AffineMatrix4D& Source)
{
	Check_Pointer(this);
	Check_Object(&Source);
	Verify(this != &Source);

	(*this)(0,0) = Source(1,1)*Source(2,2) - Source(1,2)*Source(2,1);
	(*this)(1,0) = Source(1,2)*Source(2,0) - Source(1,0)*Source(2,2);
	(*this)(2,0) = Source(1,0)*Source(2,1) - Source(1,1)*Source(2,0);

	Scalar det =
		(*this)(0,0)*Source(0,0)
		 + (*this)(1,0)*Source(0,1)
		 + (*this)(2,0)*Source(0,2);
	Verify(!Small_Enough(det));

	(*this)(3,0) =
		-Source(3,0)*(*this)(0,0)
		 - Source(3,1)*(*this)(1,0)
		 - Source(3,2)*(*this)(2,0);

	(*this)(0,1) = Source(0,2)*Source(2,1) - Source(0,1)*Source(2,2);
	(*this)(1,1) = Source(0,0)*Source(2,2) - Source(0,2)*Source(2,0);
	(*this)(2,1) = Source(0,1)*Source(2,0) - Source(0,0)*Source(2,1);
	(*this)(3,1) =
		-Source(3,0)*(*this)(0,1)
		 - Source(3,1)*(*this)(1,1)
		 - Source(3,2)*(*this)(2,1);

	(*this)(0,2) = Source(0,1)*Source(1,2) - Source(0,2)*Source(1,1);
	(*this)(1,2) = Source(1,0)*Source(0,2) - Source(0,0)*Source(1,2);
	(*this)(2,2) = Source(0,0)*Source(1,1) - Source(0,1)*Source(1,0);
	(*this)(3,2) =
		-Source(3,0)*(*this)(0,2)
		 - Source(3,1)*(*this)(1,2)
		 - Source(3,2)*(*this)(2,2);

	det = 1.0f/det;
	for (int i=0; i<12; ++i)
	{
		entries[i] *= det;
	}

	return *this;
}

//
//###########################################################################
//###########################################################################
//
AffineMatrix4D&
	AffineMatrix4D::Multiply(const AffineMatrix4D &m,const Vector3D &v)
{
	Check_Pointer(this);
	Check_Object(&m);
	Check_Object(&v);

	(*this)(0,0) = m(0,0)*v.x;
	(*this)(1,0) = m(1,0)*v.x;
	(*this)(2,0) = m(2,0)*v.x;
	(*this)(3,0) = m(3,0)*v.x;

	(*this)(0,1) = m(0,1)*v.y;
	(*this)(1,1) = m(1,1)*v.y;
	(*this)(2,1) = m(2,1)*v.y;
	(*this)(3,1) = m(3,1)*v.y;

	(*this)(0,2) = m(0,2)*v.z;
	(*this)(1,2) = m(1,2)*v.z;
	(*this)(2,2) = m(2,2)*v.z;
	(*this)(3,2) = m(3,2)*v.z;

	return *this;
}

//
//###########################################################################
//###########################################################################
//
AffineMatrix4D&
	AffineMatrix4D::Multiply(const AffineMatrix4D& m,const UnitQuaternion &q)
{
	Check_Pointer(this);
	Check_Object(&m);
	Check_Object(&q);

	LinearMatrix4D t(LinearMatrix4D::Identity);
	t.BuildRotation(q);
	return Multiply(m,t);
}

//
//###########################################################################
//###########################################################################
//
AffineMatrix4D&
	AffineMatrix4D::Multiply(const AffineMatrix4D &m,const Point3D& p)
{
	Check_Pointer(this);
	Check_Object(&m);
	Check_Object(&p);

	(*this)(3,0) = m(3,0) + p.x;
	(*this)(3,1) = m(3,1) + p.y;
	(*this)(3,2) = m(3,2) + p.z;

	return *this;
}

//
//###########################################################################
//###########################################################################
//
Scalar
	AffineMatrix4D::Determinant() const
{
	Check_Object(this);

	return
		(*this)(0,0)*((*this)(1,1)*(*this)(2,2) - (*this)(1,2)*(*this)(2,1))
		 + (*this)(0,1)*((*this)(1,2)*(*this)(2,0) - (*this)(1,0)*(*this)(2,2))
		 + (*this)(0,2)*((*this)(1,0)*(*this)(2,1) - (*this)(1,1)*(*this)(2,0));
}

//
//###########################################################################
//###########################################################################
//
AffineMatrix4D&
	AffineMatrix4D::Solve()
{
	Check_Object(this);

	int column;
	Scalar temp;

	//
	//------------------------------------------------------------------
	// Make sure that we get a decent value into the first diagonal spot
	//------------------------------------------------------------------
	//
	if (!(*this)(0,0))
	{
		for (column=0; column<3; ++column)
			if ((*this)(0,column))
				break;
		Verify(column != 3);

		//
		//--------------
		// Swap the columns
		//--------------
		//
		temp					= (*this)(0,0);
		(*this)(0,0)		= (*this)(0,column);
		(*this)(0,column)	= temp;

		temp					= (*this)(1,0);
		(*this)(1,0)		= (*this)(1,column);
		(*this)(1,column)	= temp;

		temp					= (*this)(2,0);
		(*this)(2,0)		= (*this)(2,column);
		(*this)(2,column)	= temp;

		temp					= (*this)(3,0);
		(*this)(3,0)		= (*this)(3,column);
		(*this)(3,column)	= temp;
	}

	//
	//------------------------------------
	// Make sure the diagonal entry is 1.0
	//------------------------------------
	//
	temp = (*this)(0,0);
	(*this)(0,0) = 1.0f;
	(*this)(1,0) /= temp;
	(*this)(2,0) /= temp;
	(*this)(3,0) /= temp;

	//
	//------------------------
	// Make the first row zero
	//------------------------
	//
	temp = (*this)(0,1);
	(*this)(0,1) = 0.0f;
	(*this)(1,1) -= temp * (*this)(1,0);
	(*this)(2,1) -= temp * (*this)(2,0);
	(*this)(3,1) -= temp * (*this)(3,0);

	temp = (*this)(0,2);
	(*this)(0,2) = 0.0f;
	(*this)(1,2) -= temp * (*this)(1,0);
	(*this)(2,2) -= temp * (*this)(2,0);
	(*this)(3,2) -= temp * (*this)(3,0);

	//
	//-------------------------------------------------------------------
	// Make sure that we get a decent value into the second diagonal spot
	//-------------------------------------------------------------------
	//
	if (!(*this)(1,1))
	{
		Verify(!(*this)(2,2));

		//
		//---------------------
		// Swap the (*this) columns
		//---------------------
		//
		temp				= (*this)(1,1);
		(*this)(1,1)	= (*this)(1,2);
		(*this)(1,2)	= temp;

		temp				= (*this)(2,1);
		(*this)(2,1)	= (*this)(2,2);
		(*this)(2,2)	= temp;

		temp				= (*this)(3,1);
		(*this)(3,1)	= (*this)(3,2);
		(*this)(3,2)	= temp;
	}

	//
	//-----------------------------------
	// Make the second diaginal entry 1.0
	//-----------------------------------
	//
	temp				= (*this)(1,1);
	(*this)(1,1)	= 1.0f;
	(*this)(2,1)	/= temp;
	(*this)(3,1)	/= temp;

	//
	//------------------------------------
	// Make the second row zeros otherwise
	//------------------------------------
	//
	temp = (*this)(1,0);
	(*this)(1,0) = 0.0f;
	(*this)(2,0) -= temp * (*this)(2,1);
	(*this)(3,0) -= temp * (*this)(3,1);

	temp = (*this)(1,2);
	(*this)(1,2) = 0.0f;
	(*this)(2,2) -= temp * (*this)(2,1);
	(*this)(3,2) -= temp * (*this)(3,1);

	//
	//---------------------------
	// Make the last diagonal 1.0
	//---------------------------
	//
	Verify((*this)(2,2));
	temp				= (*this)(2,2);
	(*this)(2,2)	= 1.0f;
	(*this)(3,2)	/= temp;

	//
	//------------------------------------
	// Make the third row zeros otherwise
	//------------------------------------
	//
	temp = (*this)(2,0);
	(*this)(2,0) = 0.0f;
	(*this)(3,0) -= temp * (*this)(3,2);

	temp = (*this)(2,1);
	(*this)(2,1) = 0.0f;
	(*this)(3,1) -= temp * (*this)(3,2);

	//
	//-------------------------
	// Return the reduced array
	//-------------------------
	//
	return *this;
}

//
//############################################################################
//############################################################################
//
#if !defined(Spew)
	void
		Spew(
			const char* group,
			const AffineMatrix4D &matrix
		)
	{
		Check_Object(&matrix);
		SPEW((
			group,
			"\n\t| %9f, %9f, %9f, 0 |",
			matrix(0,0),
			matrix(0,1),
			matrix(0,2)
		));
		SPEW((
			group,
			"\t| %9f, %9f, %9f, 0 |",
			matrix(1,0),
			matrix(1,1),
			matrix(1,2)
		));
		SPEW((
			group,
			"\t| %9f, %9f, %9f, 0 |",
			matrix(2,0),
			matrix(2,1),
			matrix(2,2)
		));
		SPEW((
			group,
			"\t| %9f, %9f, %9f, 1 |+",
			matrix(3,0),
			matrix(3,1),
			matrix(3,2)
		));
	}
#endif

⌨️ 快捷键说明

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