3D数学基础:图形与游戏开发_读书笔记04
来源:互联网 发布:济南网络广播 编辑:程序博客网 时间:2024/06/06 00:38
第六章3D接口类
这本书的第六章主要写了一个工具类,用作之前所描述的概念中向量的计算还有一些运算符的重载,是用C++写的。
因经验等原因.我对代码设计方面还不是很了解,也没有系统学习过C++,,总之先贴出本书章节中的C++代码。
#include<math.h>class Vector3 {public:float x, y, z;//构造函数//默认构造函数,不执行任何操作Vector3() {}//复制构造函数Vector3(const Vector3 &a) : x(a.x), y(a.y), z(a.z){}//带参数的构造函数,用三个值完成初始化Vector3(float nx, float ny, float nz) :x(nx), y(ny), z(nz){}//标准对象操作//坚持C语言的习惯,重载赋值运算符,并返回引用,以实现左值。Vector3 &operator = (const Vector3 &a){x = a.x; y = a.y; z = a.z;return *this;}// 重载 "" == "" 操作符bool operator == (const Vector3 &a) const{return x == a.x && y == a.y && z == a.z;}bool operator != (const Vector3 &a) const{return x != a.x || y != a.y || z != a.z;}//向量运算//置为零向量void zero() { x = y = z = 0.0f; };//重载一元"-"运算符Vector3 operator - () const { return Vector3(-x, -y, -z); };//重载二元 "+" 和 "-" 运算符Vector3 operator + (const Vector3 &a) const {return Vector3(x + a.x, y + a.y, z + a.z);}Vector3 operator - (const Vector3 &a) const {return Vector3(x - a.x, y - a.y, z - a.z);}//与标量的乘、除法Vector3 operator *(float a) const{return Vector3(x * a, y * a, z * a);}Vector3 operator /(float a) const{float oneOverA = 1.0f / a; //注意:这里不对"除零"进行检查return Vector3(x * oneOverA, y * oneOverA, z *oneOverA);}//重载自反运算符Vector3 &operator += (const Vector3 &a){x += a.x; y += a.y;z += a.z;return *this;}Vector3 &operator -= (const Vector3 &a){x -= a.x; y -= a.y; z -= a.z;return *this;}Vector3 &operator *= (float a){x *= a; y *= a; z *= a;return *this;}Vector3 &operator /= (float a){float oneOverA = 1.0f / a;x *= oneOverA; y *= oneOverA; z *= oneOverA;return *this;}//向量标准化void normalize(){float magSq = x * x + y * y + z * z;if (magSq > 0.0f){ //检查除零float oneOverMag = 1.0f / sqrt(magSq);x *= oneOverMag;y *= oneOverMag;z *= oneOverMag;}}//向量点乘,重载标准的乘法运算符float operator * (const Vector3 &a) const {return x * a.x + y * a.y + z * a.z;}};////非成员变量////求向量模inline float vectorMag(const Vector3 &a){return sqrt(a.x * a.x + a.y * a.y + a.z * a.z);}//向量叉乘inline Vector3 crossProduct(const Vector3 &a, const Vector3 &b){return Vector3{a.y * b.z - a.z * b.y,a.z * b.x - a.x * b.z,a.x *b.y - a.y * b.x};}//实现标量左值inline Vector3 operator *(float k, const Vector3 &v){return Vector3(k*v.x, k*v.y, k*v.z);}//计算两次间的距离inline float distance(const Vector3 &a, const Vector3 &b){float dx = a.x - b.x;float dy = a.y - b.y;float dz = a.z - b.z;return sqrt(dx * dx + dy * dy + dz *dz);}//全局变量//提供一个全局零向量extern const Vector3 kZeroVector;float vectorMag(const Vector3 &a);
感谢vs的类图功能,让我省去了画类图的时间。
下面本人由于Unity的关系对于C#还是比较熟悉的,想把这段 改成C#形式后用。
class Vector3D{ public float x, y, z; //构造函数 //默认构造函数,不执行任何操作 Vector3D() { } //复制构造函数 Vector3D(Vector3D a) { this.x = a.x; this.y = a.y; this.z = a.z; } //带参数的构造函数,用三个值完成初始化 Vector3D(float nx, float ny, float nz) { this.x = nx; this.y = ny; this.z = nz; } //标准对象操作 //坚持C语言的习惯,重载赋值运算符,并返回引用,以实现左值。 //!---C#不支持重载“=“运算符---!// // 重载 "" == "" 操作符 public static bool operator ==(Vector3D a, Vector3D b) { return b.x == a.x && b.y == a.y && b.z == a.z; } // 重载 "" != "" 操作符 public static bool operator !=(Vector3D a, Vector3D b) { return b.x != a.x || b.y != a.y || b.z != a.z; } //向量运算 //置为零向量 void zero() { x = y = z = 0.0f; } //重载一元"-"运算符 Vector3D operator +(Vector3D a, Vector3D b) { return new Vector3D(a.x + b.x, a.y + a.y, a.z + b.z); } Vector3D operator -(Vector3D a, Vector3D b) { return new Vector3D(b.x - a.x, b.y - a.y, b.z - a.z); } //与标量的乘、除法 Vector3D operator *(float a, Vector3D b) { return new Vector3D(b.x * a, b.y * a, b.z * a); } Vector3D operator /(float a, Vector3D b) { float oneOverA = 1.0f / a; //注意:这里不对"除零"进行检查 return new Vector3D(b.x * oneOverA, b.y * oneOverA, b.z * oneOverA); } //C#不能显示重载*=,+=,-=,、=自反运算符,已经嵌入在了一元运算符之中 ////向量标准化 void normalize() { float magSq = x * x + y * y + z * z; if (magSq > 0.0f) { //检查除零 float oneOverMag = (float)(1.0f / System.Math.Sqrt(magSq)); x *= oneOverMag; y *= oneOverMag; z *= oneOverMag; } } //向量点乘,重载标准的乘法运算符 float operator *(Vector3D a, Vector3D b) { return b.x * a.x + b.y * a.y + b.z * a.z; } public const Vector3D kZeroVector = new Vector3D();}
0 0
- 3D数学基础:图形与游戏开发_读书笔记
- 3D数学基础:图形与游戏开发_读书笔记04
- 3D数学基础:图形与游戏开发_读书笔记01
- 3D数学基础:图形与游戏开发_读书笔记02
- 3D数学基础,图形与游戏开发笔记3
- <<3D数学基础:图形与游戏开发>>读后感
- 《3D数学基础:图形与游戏开发》读后感
- 3D数学基础,图形与游戏开发笔记1
- 3D数学基础,图形与游戏开发笔记2
- 3D数学基础图形与游戏开发之 坐标系
- 3D数学基础:图形与游戏开发》阅读感言
- 3D数学基础图形与游戏开发之坐标系
- 《3D数学基础:图形与游戏开发 》
- 3D数学基础 图形与游戏开发的学习 (四)[2D笛卡尔数学]
- 推荐一本3D基础的书----《3D数学基础图形与游戏开发》
- 数学原来这么有用-笔记《3D数学基础:图形与游戏开发》
- 3D数学基础 图形与游戏开发的学习 (五) [3D坐标系]
- 3D数学基础:图形与游戏开发(第6章3D向量类)笔记
- Objective-C中的登录界面判断输入的内容
- 软件工程(C编码实践篇)心得体会
- 买大米
- Codeforces Round #328 (Div. 2) D. Super M
- 记第一次逆向分析
- 3D数学基础:图形与游戏开发_读书笔记04
- ubuntu 上安装mysql
- c++ 枚举的定义、设置值、取值范围
- 远程关闭服务器命令
- Nginx菜鸟入门一
- *13 Roman to Integer
- 关于sizeof和strlen的区别和用法
- 十-八进制转换
- HTML