3D数学-C++Vector3类
程序员文章站
2022-03-26 14:41:01
...
05/13/2020
C++ Vector3类
Vector3类
3D向量基本操作:
- get/set 各分量
- 向量之间的赋值
- 比较向量是否相同
- 向量的运算
//Vector3.h
class Vector3
{
public:
//构造函数
Vector3() = default;
Vector3(const Vector3& vector3);
Vector3(float x,float y, float z);
//赋值
Vector3& operator=(const Vector3& vector3);
//等于与不等于
bool opeartor==(const Vector3& vector3)const;
bool operator!=(const Vector3& vector3)const;
//get/set 成员函数
//向量运算
void zero(){x=y=z=0;}
//重载运算符
Vector3 operator-()const{return Vector3(-x,-y,-z);}
Vector3 opeartor+(const Vector3& rhs)const;
Vector3 operator-(const Vector3& rhs)const;
Vector3 operator*(float k)const;
Vector3 operator/(float k)const;
Vector3& operator+=(const Vector3& rhs);
Vector3& operator-=(const Vector3& rhs);
Vector3& operator*=(const Vector3& rhs);
Vector3& operator/=(const Vector3& rhs);
//向量标准化
void normalize(); // 注意除零问题!
//向量点乘
float operator*(const Vector3& rhs)const;
//非成员函数
friend Vector3 crossProduct(const Vector3& lhs,const Vector3& vector3);
friend Vector3 operator*(float k,const Vector3& vector3);
float vectorMag(const Vector3& vector);
friend float distance(const Vector3& lhs,const Vector& rhs);
private:
float x;
float z;
float z;
};
//全局零向量
extern const Vector3 kZeroVector;
设计决策
float 还是double
针对x,y,z使用float还是double。float的精度比double低。需要根据地图来定。为了需求节省内存资源
不要构造过得的构造函数
基本来说,经常用到的就是拷贝构造函数和带3个参数的构造函数
不要重载过多的运算符
向量的基本运算法则需要与操作符相互对应,使操作符有意义和更明确的表达。
可以考虑不使用信息屏蔽
不需要使用protected和public,这样get/set和friend关键字就不需要,可以方便操作和简单易懂。
优化问题
如果更加优化Vector3很重要,因为向量类随处被使用到,所以需要结合当下,了解什么是最好的优化。
3DMath 第6章
上一篇: JAVA--GUI:MenuBar组件