C#中3维向量的实现

c#中默认不带库三维向量,需要自己安装第三方库,或者可以手动实现一个简易的三维向量。

cs 复制代码
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})";
    }
}
相关推荐
桦011 分钟前
【C++复习】:继承
开发语言·c++
何仙鸟30 分钟前
GarmageSet下载和处理
java·开发语言
wefly201735 分钟前
免安装!m3u8live.cn在线 M3U8 播放器,小白也能快速上手
java·开发语言·python·json·php·m3u8·m3u8在线转换
薛先生_0991 小时前
js学习语法第一天
开发语言·javascript·学习
报错小能手2 小时前
深入理解 Linux 虚拟内存管理
开发语言·操作系统
故事不长丨2 小时前
WPF MvvmLight 超详细使用教程
c#·wpf·mvvm·mvvmlight
和沐阳学逆向2 小时前
我现在怎么用 CC Switch 管中转站,顺手拿 Codex 举个例子
开发语言·javascript·ecmascript
小仙女的小稀罕2 小时前
听不清重要会议录音急疯?这款常见AI工具听脑AI精准转译
开发语言·人工智能·python
书到用时方恨少!2 小时前
Python random 模块使用指南:从入门到精通
开发语言·python
客卿1232 小时前
牛客刷题--找数字-- 字符串检测-字符串 双指针
java·开发语言