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})";
    }
}
相关推荐
AI宇宙狂想家4 分钟前
开源 AI 视频工具进化史:从难用到好用,OpenMontage 改了什么
开发语言·前端·人工智能·开源·ai创业·openmontage
氷凌公子10 分钟前
算法与UI拆分中遇到的问题及解决方式
c#·onnx·yolov26
大鹏说大话19 分钟前
和小鹅通相近的知识付费小程序平台有哪些
开发语言
Dovis(誓平步青云)22 分钟前
启元 T1 Pro 视觉伺服实践:基于 HSV 阈值与针孔测距的启元机器人寻物实现
开发语言·人工智能·机器学习·二次开发
Ryan-Zhong34 分钟前
数字人口播视频 API 实战:Python 跑通模板合成、异步轮询与批量出片
开发语言·python·音视频
1-1=036 分钟前
C# 泛型
c#·.net·.netcore
努力努力再努力wz37 分钟前
【Lua 入门系列】模块与包(一):从多文件组织到require 运行时加载机制、模块缓存、预加载搜索与 Lua 文件搜索机制
开发语言·junit·lua
fengci.42 分钟前
CTF2困难部分
开发语言·网络·python·安全·php
佳得动43 分钟前
编译和链接的认识(C语言)
c语言·开发语言