154 lines
5.1 KiB
C#
154 lines
5.1 KiB
C#
![]() |
using System;
|
|||
|
|
|||
|
namespace FlyBase
|
|||
|
{
|
|||
|
public struct Vector3
|
|||
|
{
|
|||
|
public double X { get; set; }
|
|||
|
public double Y { get; set; }
|
|||
|
public double Z { get; set; }
|
|||
|
/// <summary>
|
|||
|
/// 构造 初始化
|
|||
|
/// </summary>
|
|||
|
/// <param name="x">x坐标</param>
|
|||
|
/// <param name="y">y坐标</param>
|
|||
|
/// <param name="z">z坐标</param>
|
|||
|
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));
|
|||
|
}
|
|||
|
/// <summary>
|
|||
|
/// 标准化坐标
|
|||
|
/// </summary>
|
|||
|
/// <param name="multiple">标准化单位</param>
|
|||
|
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;
|
|||
|
}
|
|||
|
}
|
|||
|
/// <summary>
|
|||
|
/// 标准化 返回一个标准化之后的值 不改变自身
|
|||
|
/// </summary>
|
|||
|
/// <param name="multiple">标准化单位</param>
|
|||
|
/// <returns>标准化之后的值</returns>
|
|||
|
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;
|
|||
|
}
|
|||
|
/// <summary>
|
|||
|
/// 打印坐标
|
|||
|
/// </summary>
|
|||
|
/// <returns>坐标字符串</returns>
|
|||
|
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}");
|
|||
|
}
|
|||
|
}
|
|||
|
}
|