3D數學基礎:圖形與遊戲開發_讀書筆記04
阿新 • • 發佈:2018-11-09
第六章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(); }