using System; namespace FlyBase { public struct Vector3 { public double X { get; set; } public double Y { get; set; } public double Z { get; set; } /// /// 构造 初始化 /// /// x坐标 /// y坐标 /// z坐标 public Vector3(double x, double y, double z) { this.X = x; this.Y = y; this.Z = z; } //重载二元坐标加法+ public static Vector3 operator +(Vector3 v1, Vector3 v2) { return new Vector3(v1.X + v2.X, v1.Y + v2.Y, v1.Z + v2.Z); } //重载一元坐标加法+ public static Vector3 operator +(Vector3 v1, double i) { return new Vector3(v1.X + i, v1.Y + i, v1.Z + i); } //重载一元坐标加法+ public static Vector3 operator +(Vector3 v1, int i) { return new Vector3(v1.X + (double)i, v1.Y + (double)i, v1.Z + (double)i); } //重载二元坐标减法- public static Vector3 operator -(Vector3 v1, Vector3 v2) { return new Vector3(v1.X - v2.X, v1.Y - v2.Y, v1.Z - v2.Z); } //重载一元坐标加法- public static Vector3 operator -(Vector3 v1, double i) { return new Vector3(v1.X - i, v1.Y - i, v1.Z - i); } //重载一元坐标加法- public static Vector3 operator -(Vector3 v1, int i) { return new Vector3(v1.X - (double)i, v1.Y - (double)i, v1.Z - (double)i); } //重载一元坐标乘法* public static Vector3 operator *(Vector3 v1, double i) { return new Vector3(v1.X * i, v1.Y * i, v1.Z * i); } //重载一元坐标乘法* public static Vector3 operator *(Vector3 v1, int i) { return new Vector3(v1.X * (double)i, v1.Y * (double)i, v1.Z * (double)i); } //重载一元坐标除法/ public static Vector3 operator /(Vector3 v1, double i) { return new Vector3(v1.X / i, v1.Y / i, v1.Z / i); } //重载一元坐标除法/ public static Vector3 operator /(Vector3 v1, int i) { return new Vector3(v1.X / (double)i, v1.Y / (double)i, v1.Z / (double)i); } //重载== public static bool operator ==(Vector3 v1, Vector3 v2) { if (v1.X == v2.X && v1.Y == v2.Y && v1.Z == v2.Z) return true; return false; } //重载!= public static bool operator !=(Vector3 v1, Vector3 v2) { if (v1.X != v2.X || v1.Y != v2.Y || v1.Z != v2.Z) return true; return false; } //模长 public double GetMag() { return Math.Sqrt(Math.Pow(this.X, 2) + Math.Pow(this.Y, 2) + Math.Pow(this.Z, 2)); } /// /// 标准化坐标 /// /// 标准化单位 public void Normalize(double multiple = 1.0) { double magSq = Math.Pow(this.X, 2) + Math.Pow(this.Y, 2) + Math.Pow(this.Z, 2); if (magSq > 0) { double oneOverMag = multiple / Math.Sqrt(magSq); this.X *= oneOverMag; this.Y *= oneOverMag; this.Z *= oneOverMag; } } /// /// 标准化 返回一个标准化之后的值 不改变自身 /// /// 标准化单位 /// 标准化之后的值 public Vector3 NormalizEd(double multiple = 1.0) { Vector3 re = new Vector3(); double magSq = Math.Pow(this.X, 2) + Math.Pow(this.Y, 2) + Math.Pow(this.Z, 2); if (magSq > 0) { double oneOverMag = multiple / Math.Sqrt(magSq); re.X = this.X * oneOverMag; re.Y = this.Y * oneOverMag; re.Z = this.Z * oneOverMag; } return re; } //归零 改变自身数值 一般配合归位使用 public void SetZero(Vector3 v2) { this.X -= v2.X; this.Y -= v2.Y; this.Z -= v2.Z; } //归零 返回一个归零值 不改变自身 public Vector3 SetZeroEd(Vector3 v2) { Vector3 re = new Vector3(this.X - v2.X, this.Y - v2.Y, this.Z - v2.Z); return re; } //归位 public void SetFormerly(Vector3 v2) { this.X += v2.X; this.Y += v2.Y; this.Z += v2.Z; } /// /// 打印坐标 /// /// 坐标字符串 public string PosToString() { string x = Convert.ToString(this.X); string y = Convert.ToString(this.Y); string z = Convert.ToString(this.Z); return string.Format($"X轴:{x} Y轴:{y} Z轴:{z}"); } } }