在计算图形学中三维向量的用处非常广泛,可以自定义一个CVector3类,主要是封装对三维向量的操作,在Cvector3中主要封装一下操作
1.构造函数,初始化向量
2.运算符重载,主要是加减乘除运算符重载。
3.各种操作,比如数量积,向量积,单位化,求长度,按比例缩放等。
#pragma once
#include <math.h>
class CVector3
{
public:
CVector3(void):x(0),y(0),z(0){};
CVector3(float x1,float y1,float z1):x(x1),y(y1),z(z1){};
CVector3(const CVector3 &v);
CVector3 operator =(const CVector3 &v); //赋值运算符重载
// +-*/不同的重载方式
CVector3 operator +(const CVector3 &v);
CVector3 operator -(const CVector3 &v);
CVector3 operator *(const CVector3 &v);
CVector3 operator /(const CVector3 &v);
CVector3 operator +(float a);
CVector3 operator -(float a);
CVector3 operator *(float a);
CVector3 operator /(float a);
float dot(const CVector3& v1,const CVector3& v2); //2个向量的数量积
CVector3 Cross(const CVector3& v1,const CVector3& v2); //2个向量的向量积
float length(); //求向量的长度
CVector3 Normalize();//单位化向量
CVector3 Scale(float n);//向量按比例缩放
virtual ~CVector3(void);
private:
float x;
float y;
float z;
};
#include "Vector3.h"
CVector3::CVector3(const CVector3 &v)
{
x=v.x;
y=v.y;
z=v.z;
}
CVector3::~CVector3(void)
{
}
CVector3 CVector3::operator=(const CVector3& v)
{
x=v.x;
y=v.y;
z=v.z;
return *this;
}
CVector3 CVector3::operator+(const CVector3& v)
{
return CVector3(x+v.x,y+v.y,z+v.z);
}
CVector3 CVector3::operator-(const CVector3& v)
{
return CVector3(x-v.x,y-v.y,z-v.z);
}
CVector3 CVector3::operator*(const CVector3& v)
{
return CVector3(x*v.x,y*v.y,z*v.z);
}
CVector3 CVector3::operator/(const CVector3& v)
{
if(v.x==0||v.y==0||v.z==0)
return *this;
else
return CVector3(x/v.x,y/v.y,z/v.z);
}
CVector3 CVector3::operator+(float a)
{
return CVector3(x+a,y+a,z+a);
}
CVector3 CVector3::operator-(float a)
{
return CVector3(x-a,y-a,z-a);
}
CVector3 CVector3::operator*(float a)
{
return CVector3(x*a,y*a,z*a);
}
CVector3 CVector3::operator/(float a)
{
if(a==0)
return *this;
else
return CVector3(x/a,y/a,z/a);
}
float CVector3::dot(const CVector3& v1,const CVector3& v2)
{
return v1.x*v2.x+v1.y*v2.y+v1.z*v2.z;
}
CVector3 CVector3::Cross(const CVector3& v1,const CVector3& v2)
{
return CVector3(v1.y*v2.z-v1.z*v2.y,v1.z*v2.x-v1.x*v2.z,v1.x*v2.y-v1.y*v2.y);
}
float CVector3::length()
{
return sqrt(x*x+y*y+z*z);
}
CVector3 CVector3::Normalize()
{
if(this->length()==0)
return CVector3(0.0,0.0,0.0);
else
return CVector3(x/length(),y/length(),z/length());
}
CVector3 CVector3::Scale(float n)
{
return CVector3(x*n,y*n,z*n);
}