C++编写的Vector3类

信心满满的带了作品去顽石面试,结果在第二个环节被问到了3D数学,果断坑了,领教了一遍Unity3D只是工具,3D数学、图形算法才王道的思想。人家说的在理,也感觉自己太浮躁了,从现在开始一点一点的学回来!下面是一个最基础了Vector3类,其中基本包含了向量常用的方法,也是“3D数学基础 图形与游戏开发”这本书6.2章节的一个例子,感觉很不错,手打了一遍,多加了点注释。另外这个例子里有2个bug,(在159、176这两行)我个人暂时解决不了,有心人可以copy到vs里看一看

  1 #include<math.h>
  2 
  3 /*
  4  * 3D向量类
  5  */
  6 class Vector3
  7 {
  8 public:
  9     //定义 x,y,z轴
 10     float x, y, z;
 11     
 12     //默认构造函数,不执行任何操作
 13     Vector3() {}
 14 
 15     //复制构造函数
 16     Vector3(const Vector3 &a) : x(a.x), y(a.y), z(a.z) {}
 17 
 18     //初始化构造函数
 19     Vector3(float nx, float ny, float nz) : x(nx), y(ny), z(nz) {}
 20 
 21     //标准对象操作
 22     Vector3 &operator = (const Vector3 &a)
 23     {
 24         x = a.x;
 25         y = a.y;
 26         z = a.z;
 27         return *this;
 28     }
 29 
 30     //置为零向量
 31     void zero() 
 32     { 
 33         x = y = z = 0.0f;    
 34     }
 35 
 36     //重载“==”操作符
 37     bool operator ==(const Vector3 &a) const
 38     {
 39         return x == a.x && y == a.y && z == a.z;
 40     }
 41 
 42     //重载“!=”操作符
 43     bool operator !=(const Vector3 &a) const
 44     {
 45         return x != a.x || y != a.y || z != a.z;
 46     }
 47 
 48     //重载一元“-”运算符
 49     Vector3 operator -() const
 50     {
 51         return Vector3(-x, -y, -z);    
 52     }
 53 
 54     //重载二元“+”运算符
 55     Vector3 operator +(const Vector3 &a) const
 56     {
 57         return Vector3(x + a.x, y + a.y, z + a.z);
 58     }
 59 
 60     //重载二元“-”运算符
 61     Vector3 operator -(const Vector3 &a) const
 62     {
 63         return Vector3(x - a.z, y - a.y, z - a.z);
 64     }
 65 
 66     //与标量的乘法
 67     Vector3 operator *(float a) const
 68     {
 69         return Vector3(x * a, y * a, z * a);
 70     }
 71 
 72     //与标量的除法(不对除0进行检查)
 73     Vector3 operator /(float a) const
 74     {
 75         //获得倒数
 76         float reciprocalA = 1.0f / a;
 77         return Vector3(x * reciprocalA, y * reciprocalA, z * reciprocalA);
 78     }
 79 
 80     //重载简加运算符
 81     Vector3 &operator +=(const Vector3 &a)
 82     {
 83         x += a.x;
 84         y += a.y;
 85         z += a.z;
 86         return *this;
 87     }
 88 
 89     //重载简减运算符
 90     Vector3 &operator -=(const Vector3 &a)
 91     {
 92         x -= a.x;
 93         y -= a.y;
 94         z -= a.z;
 95         return *this;
 96     }
 97 
 98     //重载简乘运算符
 99     Vector3 &operator *=(const Vector3 &a)
100     {
101         x *= a.x;
102         y *= a.y;
103         z *= a.z;
104         return *this;
105     }
106 
107     //重载简乘运算符
108     Vector3 &operator /=(const Vector3 &a)
109     {
110         x /= a.x;
111         y /= a.y;
112         z /= a.z;
113         return *this;
114     }
115 
116     //向量标准化(在没有改变本质关系的前提下,把向量的长度标准化为1)
117     void normalize()
118     {
119         float magSq = x * x + y * y + z * z;
120         //除零检查
121         if(magSq > 0.0f)
122         {
123             //向量长度的倒数
124             float magOver = 1.0f / sqrt(magSq);
125             x *= magOver;
126             y *= magOver;
127             z *= magOver;
128         }
129     }
130 
131     //向量点乘,重载标准的乘法运算符
132     float operator *(const Vector3 &a) const
133     {
134         return x * a.x + y * a.y + z * a.z;
135     }
136 
137     /*
138      * 非成员函数
139      */
140 
141     //向量求模
142     inline float vectorMag(const Vector3 &a)
143     {
144         return sqrt(a.x * a.x + a.y * a.y + a.z * a.z);
145     }
146 
147     //向量叉乘
148     inline Vector3 crossProduct(const Vector3 &a, const Vector3 &b)
149     {
150         return Vector3
151         (
152             a.x * b.y - a.y * b.x,
153             a.y * b.z - a.z * b.y,
154             a.z * b.x - a.x * b.z
155         );
156     }
157 
158     //标量左乘
159     inline Vector3 operator *(float k, const Vector3 &v)
160     {
161         return Vector3(k * v.x, k * v.y, k * v.z);
162     }
163 
164     //计算2点之间的距离
165     inline float distance(const Vector3 &a, const Vector3 &b)
166     {
167         //得到向量
168         float dx = a.x - b.x;
169         float dy = a.y - b.y;
170         float dz = a.z - b.z;
171         //返回向量的大小
172         return sqrt(dx * dx + dy * dy + dz * dz); 
173     }
174 
175     //全局零向量
176     extern const Vector3 kZeroVector;
177 };
Vector3

 

转载于:https://www.cnblogs.com/coqn/archive/2013/05/28/3D.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值