还是在读书的时候帮外专业朋友做作业,用GDI实现三维空间的立方体绘制和旋转的操作,那个时候自己根据《线性代数与空间解析几何》以及《计算机图形学》等课程的相关知识写了一个三维向量类。后来做了些二维和三维的东西发现用向量操作会使很多问题变得简单直观,尤其是在OpenGL编程的时候这种感觉尤为明显。经过这么长时间的使用现在这个类已经比较完善了,早些时候将它上传到了CSDN,近来比较闲索性写个介绍吧,希望对从事三维图形开发的朋友有所帮助,也期待着与大家的交流中会有所提高。
先把代码贴上,当然有兴趣的朋友也可以在我的资源中下载。
类的定义是这样的
class CVector
{
public:
float m_fVectorX, m_fVectorY, m_fVectorZ, //向量的空间坐标
m_fAngleX, m_fAngleY, m_fAngleZ, //向量与坐标轴的夹角
m_fMod; //向量的模
public:
CVector();
CVector(float fVectorX, float fVectorY, float fVectorZ);
virtual ~CVector();
void CalculateAngles();
void SetVector(float fStartX, float fStartY, float fStartZ, float fEndX, float fEndY, float fEndZ);
void SetVector(float fVectorX, float fVectorY, float fVectorZ);
float GetMod(){return m_fMod;}
void Invert();
void MakeUnitVector();
void Rotate(float fAngle, CVector vtrAxis);
void operator=(CVector vectorOther);
CVector operator+(CVector vectorOther);
CVector operator*(float fNum);
float operator^(CVector vectorOther);
CVector operator*(CVector vectorOther);
};
大家应该都知道所谓向量其实就是一组数,在笛卡尔坐标系中一个向量就是起点在原点的有向线段,虽然向量的起点可以在任意位置,但是标记向量的有序数却还是当起点在原点时终点的坐标。所以m_fVectorX, m_fVectorY, m_fVectorZ就唯一确定了一个向量。当然向量还有一些其他属性,比如模(也就是向量的长度),比如其和各个坐标轴的夹角,所以我做了另外四个变量m_fMod、m_fAngleX、m_fAngleY、m_fAngleZ来保存这些属性。
生成变量有很多方法,比如直接设置终点坐标、比如通过起点和终点做差,所以我也实现了两个版本的SetVector。当然也有通过模和角度来生成变量的,但这种方法极其不常用,尤其是在三维条件下这个角度其实很不容易