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);
}
}
}