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})";
    }
}
相关推荐
小灰灰搞电子1 小时前
Rust+Slint 实现动态消息提示框源码分享
开发语言·后端·rust
传奇开心果编程3 小时前
【Rust入门知识点学与练】第21课:Trait 进阶 Advanced Traits
开发语言·学习·rust
新时代牛马3 小时前
字符设备驱动完整篇:从 cdev_add、file_operations 到chrdev_open 与排障
开发语言·python
swordbob3 小时前
ReentrantLock 与 AQS 完整学习手册
java·开发语言
淡海水4 小时前
08-03-不可变-ImmutableDictionary-TKey-TValue-与ImmutableHashSet-T-持久化哈希树
数据结构·算法·c#·哈希算法·dictionary·immutable
白山编程大哥4 小时前
Java OutputStreamWriter 详解:从字符到字节的桥梁
java·开发语言·python
shmily麻瓜小菜鸡5 小时前
JavaScript / TypeScript 易踩坑知识点 —— 异步编程类
开发语言·javascript·typescript
七夜zippoe5 小时前
为什么 2026 年每个 Java 团队都该懂 AI Agent
java·开发语言·人工智能
znnnk5 小时前
【Python】GUI 开发从入门到实战(三):PyQt/PySide 进阶之路
开发语言·python·pyqt
Despacito10065 小时前
Java后端性能探查工具速查表
java·开发语言