欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

3D数学-C++Vector3类

程序员文章站 2022-03-26 14:41:01
...

05/13/2020

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章