c#中默认不带库三维向量,需要自己安装第三方库,或者可以手动实现一个简易的三维向量。
public struct Vector3D
{
public double X { get; set; }
public double Y { get; set; }
public double Z { get; set; }
public Vector3D(double x, double y, double z)
{
X = x;
Y = y;
Z = z;
}
//--- 运算符重载 ---
// 向量加法
public static Vector3D operator +(Vector3D a, Vector3D b)
{
return new Vector3D(a.X + b.X, a.Y + b.Y, a.Z + b.Z);
}
// 向量减法
public static Vector3D operator -(Vector3D a, Vector3D b)
{
return new Vector3D(a.X - b.X, a.Y - b.Y, a.Z - b.Z);
}
// 向量标量乘法(向量 * 标量)
public static Vector3D operator *(Vector3D v, double scalar)
{
return new Vector3D(v.X * scalar, v.Y * scalar, v.Z * scalar);
}
// 向量标量乘法(标量 * 向量)
public static Vector3D operator *(double scalar, Vector3D v)
{
return v * scalar; // 复用上述实现
}
// 向量标量除法(向量 / 标量)
public static Vector3D operator /(Vector3D v, double scalar)
{
if (Math.Abs(scalar) < double.Epsilon)
throw new DivideByZeroException("标量不能为零!");
return new Vector3D(v.X / scalar, v.Y / scalar, v.Z / scalar);
}
//--- 其他方法 ---
// 向量点积
public static double Dot(Vector3D a, Vector3D b)
{
return a.X * b.X + a.Y * b.Y + a.Z * b.Z;
}
// 向量叉积
public static Vector3D Cross(Vector3D a, Vector3D b)
{
return new Vector3D(
a.Y * b.Z - a.Z * b.Y,
a.Z * b.X - a.X * b.Z,
a.X * b.Y - a.Y * b.X
);
}
// 向量长度
public double Length()
{
return Math.Sqrt(X * X + Y * Y + Z * Z);
}
// 向量归一化(单位化)
public Vector3D Normalize()
{
double length = Length();
if (length < double.Epsilon)
throw new InvalidOperationException("零向量无法归一化!");
return this / length; // 使用标量除法运算符
}
// 重写 ToString
public override string ToString()
{
return $"({X:F3}, {Y:F3}, {Z:F3})";
}
}