📄 gmath.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 + -