標籤:圖形開發 3d 向量
using System;using System.Collections.Generic;using System.Linq;using System.Text;namespace VectorDemo{ /// <summary> /// 3D向量類 /// </summary> public class Vector3 { public float X { get; set; } public float Y { get; set; } public float Z { get; set; } /// <summary> /// 預設建構函式,不執行任何操作 /// </summary> public Vector3() { } /// <summary> /// 複製向量的建構函式 /// </summary> /// <param name="a"></param> public Vector3(Vector3 a) { this.X = a.X; this.Y = a.Y; this.Z = a.Z; } /// <summary> /// 帶參建構函式,用三個值完成初始化. /// </summary> /// <param name="nx"></param> /// <param name="ny"></param> /// <param name="nz"></param> public Vector3(float nx, float ny, float nz) { this.X = nx; this.Y = ny; this.Z = nz; } #region 運算子 public static bool operator ==(Vector3 v1, Vector3 v2) { return v1.X == v2.X && v1.Y == v2.Y && v1.Z == v2.Z; } public static bool operator !=(Vector3 v1, Vector3 v2) { return v1.X != v2.X || v1.Y != v2.Y || v1.Z != v2.Z; } /// <summary> /// 重載一元“-”運算子 /// </summary> /// <param name="v"></param> /// <returns></returns> public static Vector3 operator -(Vector3 v) { return new Vector3(-v.X, -v.Y, -v.Z); } /// <summary> /// 重載二元"+"運算子 /// </summary> /// <param name="v1"></param> /// <param name="v2"></param> /// <returns></returns> public static Vector3 operator +(Vector3 v1, Vector3 v2) { return new Vector3(v1.X + v2.X, v1.Y + v2.Y, v1.Z + v2.Z); } /// <summary> /// 重載二元"-"運算子 /// </summary> /// <param name="v1"></param> /// <param name="v2"></param> /// <returns></returns> public static Vector3 operator -(Vector3 v1, Vector3 v2) { return new Vector3(v1.X - v2.X, v1.Y - v2.Y, v1.Z - v2.Z); } /// <summary> /// 與標量相乘 /// </summary> /// <param name="v"></param> /// <param name="a"></param> /// <returns></returns> public static Vector3 operator *(Vector3 v, float a) { return new Vector3(v.X * a, v.Y * a, v.Z * a); } /// <summary> /// 與標量相除 /// </summary> /// <param name="v"></param> /// <param name="a"></param> /// <returns></returns> public static Vector3 operator /(Vector3 v, float a) { float oneOverA = 1.0f / a;//:這裡不對除零進行檢查 return new Vector3(v.X * oneOverA, v.Y * oneOverA, v.Z * oneOverA); } // +=運算子不可顯式重載,會隨著+運算子的重載而隱式重載 // -=運算子不可顯式重載,會隨著-運算子的重載而隱式重載 // *=運算子不可顯式重載,會隨著*運算子的重載而隱式重載 // /=運算子不可顯式重載,會隨著/運算子的重載而隱式重載 /// <summary> /// 向量點乘,重載標準乘法運算子. /// </summary> /// <param name="v1"></param> /// <param name="v2"></param> /// <returns></returns> public static float operator *(Vector3 v1, Vector3 v2) { return v1.X * v2.X + v1.Y * v2.Y + v1.Z * v2.Z; } public override bool Equals(object v) { if (!(v is Vector3)) { return false; } return this == (v as Vector3); } /// <summary> /// 向量左乘 /// </summary> /// <param name="a"></param> /// <param name="v"></param> /// <returns></returns> public static Vector3 operator *(float a, Vector3 v) { return new Vector3(a * v.X, a * v.Y, a * v.Z); } #endregion /// <summary> /// 置為零微量 /// </summary> public void Zero() { X = Y = Z = 0.0f; } /// <summary> /// 向量標準化 /// </summary> public void Normalize() { float magSq = X * X + Y * Y + Z * Z; if (magSq > 0.0f)//檢查除零 { float oneOverMag = (float)(1.0f / Math.Sqrt(magSq)); X *= oneOverMag; Y *= oneOverMag; Z *= oneOverMag; } } /// <summary> /// 求向量模 /// </summary> /// <returns></returns> public float VectorMag() { return (float)(Math.Sqrt(X * X + Y * Y + Z * Z)); } /// <summary> /// 計算兩向量的叉乘 /// </summary> /// <returns></returns> public Vector3 CorssProduct(Vector3 v) { return new Vector3(Y * v.Z - Z * v.Y, Z * v.X - X * v.Z, X * v.Y - Y * v.X); } /// <summary> /// 計算兩點間的距離 /// </summary> /// <param name="v"></param> /// <returns></returns> public float Distance(Vector3 v) { float dx = X - v.X; float dy = Y - v.Y; float dz = Z - v.Z; return (float)(Math.Sqrt(dx * dx + dy * dy + dz * dz)); } public override String ToString() { return String.Format("X:{0},Y:{1},Z:{2}", X, Y, Z); } }}
圖形開發之3D向量類(C#)