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

📄 gmath.cpp

📁 3D游戏展示程序
💻 CPP
字号:
//--------------------------------------------------
//  Desc: 数学库
//  Author: artsylee/2007.3.9
//--------------------------------------------------

#include "GMath.h"

float VectorLength(D3DXVECTOR3 vec)
{
	return (float)sqrt(vec.x*vec.x + vec.y*vec.y+ vec.z*vec.z);
}

float VectorLength(D3DXVECTOR3 vec1, D3DXVECTOR3 vec2)
{
	return VectorLength(vec2 - vec1);
}

D3DXVECTOR3 VectorAdd(D3DXVECTOR3 v1, D3DXVECTOR3 v2)
{
	return v1+v2;
}

D3DXVECTOR3 VectorSubtract(D3DXVECTOR3 v1, D3DXVECTOR3 v2)
{
	return v1-v2;
}

D3DXVECTOR3 VectorCross(D3DXVECTOR3 v1, D3DXVECTOR3 v2)
{
	float nx = v1.y * v2.z - v2.y * v1.z;
	float ny = v2.x * v1.z - v1.x * v2.z;
	float nz = v1.x * v2.y - v2.x * v1.y;

	return D3DXVECTOR3(nx, ny, nz);
}

float VectorDot(D3DXVECTOR3 v1, D3DXVECTOR3 v2)
{
	/*
	float len1 = VectorLength(v1);
	float len2 = VectorLength(v2);
	float cosine = VectorAngleCosine(v1, v2);
	return len1*len2*cosine;
	*/
	return v1.x*v2.x + v1.y*v2.y + v1.z*v2.z;
}

D3DXVECTOR3 Vec3Mutiply(D3DXVECTOR3 &v1, D3DXVECTOR3 &v2)
{
	D3DXVECTOR3 vResult;
	vResult.x = v1.x * v2.x;
	vResult.y = v1.y * v2.y;
	vResult.z = v1.z * v2.z;
	return vResult;
}

float VectorAngleCosine(D3DXVECTOR3 v1, D3DXVECTOR3 v2)
{
	D3DXVECTOR3 n1 = Normalization(v1);
	D3DXVECTOR3 n2 = Normalization(v2);

	double temp = n1.x*n2.x + n1.y*n2.y + n1.z*n2.z;
	double len1 = pow((float)(n1.x*n1.x + n1.y*n1.y + n1.z*n1.z), 0.5f);
	double len2 = pow((float)(n2.x*n2.x + n2.y*n2.y + n2.z*n2.z), 0.5f);

	return float(temp/(len1*len2));
}

float VectorAngleCosine(D3DXVECTOR3 v1, D3DXVECTOR3 center, D3DXVECTOR3 v2)
{
	double n1x = v1.x - center.x;
	double n1y = v1.y - center.y;
	double n1z = v1.z - center.z;

	double n2x = v2.x - center.x;
	double n2y = v2.y - center.y;
	double n2z = v2.z - center.z;

	double temp = n1x*n2x + n1y*n2y + n1z*n2z;
	double len1 = pow((float)(n1x*n1x + n1y*n1y + n1z*n1z), 0.5f);
	double len2 = pow((float)(n2x*n2x + n2y*n2y + n2z*n2z), 0.5f);

	return float(temp/(len1*len2));
}

int VectorAngleClassify(D3DXVECTOR3 v1, D3DXVECTOR3 v2)
{
	float temp = v1.x*v2.x + v1.y*v2.y + v1.z*v2.z;
	if(temp == 0)
		return PERPENDICULAR;
	if(temp > 0)
		return SHARP_ANGLE;
	if(temp < 0)
		return OBTUSE_ANGLE; 
	return -1;
}

int VectorAngleClassify(D3DXVECTOR3 v1, D3DXVECTOR3 center, D3DXVECTOR3 v2)
{
	float temp = (v1.x-center.x)*(v2.x-center.x) + 
		         (v1.y-center.y)*(v2.y-center.y) + 
				 (v1.z-center.z)*(v2.z-center.z);

	if(temp == 0)
		return PERPENDICULAR;
	if(temp > 0)
		return SHARP_ANGLE;
	if(temp < 0)
		return OBTUSE_ANGLE; 
	return -1;
}

D3DXVECTOR3 GetNormal(D3DXVECTOR3 v1, D3DXVECTOR3 v2, D3DXVECTOR3 v3)
{
	D3DXVECTOR3 temp = VectorCross(v2 - v1, v3 - v1);
	return Normalization(temp);
}

D3DXVECTOR3 GetNormal(float *v1,float *v2,float *v3)
{
	D3DXVECTOR3 vec1(v2[0]-v1[0], v2[1]-v1[1], v2[2]-v1[2]);
	D3DXVECTOR3 vec2(v3[0]-v1[0], v3[1]-v1[1], v3[2]-v1[2]);
	D3DXVECTOR3 vec3 = VectorCross(vec1, vec2);
	return Normalization(vec3);
}

D3DXVECTOR3 Normalization(float x, float y, float z)
{
	float len = sqrt(x*x + y*y + z*z);
	if(len<0.0001)
		return D3DXVECTOR3(0.0f, 1.0f, 0.0f);

	x = x/len;
	y = y/len;
	z = z/len;

	return D3DXVECTOR3(x, y, z);
}

D3DXVECTOR3 Normalization(D3DXVECTOR3 vertex)
{
	return Normalization(vertex.x, vertex.y, vertex.z);
}

⌨️ 快捷键说明

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