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})";
    }
}
相关推荐
呆呆的小草37 分钟前
Cesium距离测量、角度测量、面积测量
开发语言·前端·javascript
uyeonashi39 分钟前
【QT系统相关】QT文件
开发语言·c++·qt·学习
MasterNeverDown1 小时前
在C#中的乐观锁和悲观锁
c#·并发·
全栈小52 小时前
【C#】Quartz.NET怎么动态调用方法,并且根据指定时间周期执行,动态配置类何方法以及Cron表达式,有请DeepSeek
c#·.net·quartz.net·deepseek
冬天vs不冷2 小时前
Java分层开发必知:PO、BO、DTO、VO、POJO概念详解
java·开发语言
sunny-ll2 小时前
【C++】详解vector二维数组的全部操作(超细图例解析!!!)
c语言·开发语言·c++·算法·面试
猎人everest2 小时前
Django的HelloWorld程序
开发语言·python·django
嵌入式@秋刀鱼3 小时前
《第四章-筋骨淬炼》 C++修炼生涯笔记(基础篇)数组与函数
开发语言·数据结构·c++·笔记·算法·链表·visual studio code
嵌入式@秋刀鱼3 小时前
《第五章-心法进阶》 C++修炼生涯笔记(基础篇)指针与结构体⭐⭐⭐⭐⭐
c语言·开发语言·数据结构·c++·笔记·算法·visual studio code
别勉.3 小时前
Python Day50
开发语言·python