C#Vector2代码

Ant*_*ken 2 c# math struct vector

我需要一个项目的Vector2结构,我对数学不是很强,这个类似乎工作但我非常感谢任何有关如何优化代码或如果我犯了任何错误的指针.还有比Math.Sqrt更便宜的距离计算方法吗?

    private struct Vector2
    {
        public float X;
        public float Y;

        public Vector2(float x, float y)
        {
            this.X = x;
            this.Y = y;
        }

        public static Vector2 operator +(Vector2 v1, Vector2 v2)
        {
            return new Vector2(v1.X + v2.X, v1.Y + v2.Y);
        }

        public static Vector2 operator -(Vector2 v1, Vector2 v2)
        {
            return new Vector2(v1.X - v2.X, v1.Y - v2.Y);
        }

        public static Vector2 operator *(Vector2 v1, float m)
        {
            return new Vector2(v1.X * m, v1.Y * m);
        }

        public static float operator *(Vector2 v1, Vector2 v2)
        {
            return v1.X * v2.X + v1.Y * v2.Y;
        }

        public static Vector2 operator /(Vector2 v1, float m)
        {
            return new Vector2(v1.X / m, v1.Y / m);
        }

        public static float Distance(Vector2 v1, Vector2 v2)
        {
            return (float)Math.Sqrt(Math.Pow(v1.X - v2.X, 2) + Math.Pow(v1.Y - v2.Y, 2));
        }

        public float Length()
        {
            return (float)Math.Sqrt(X * X + Y * Y);
        }
    }
Run Code Online (Sandbox Code Playgroud)

Yiy*_*Lee 9

只需3条评论:

1)在C#中,我们通常暴露属性而不是字段.那是,

    public float X {get; private set;}
    public float Y {get; private set;}
Run Code Online (Sandbox Code Playgroud)

2)double类型比float更精确,所以我建议你使用double而不是float.

3)您将一个运算符重载为:

    public static float operator *(Vector2 v1, Vector2 v2)
    {
        return v1.X * v2.X + v1.Y * v2.Y;
    }
Run Code Online (Sandbox Code Playgroud)

我把它作为两个2d实数向量的点(内积).在编程中,当我们重载操作符时,重载应该执行操作符所做的操作.也就是说,如果我们要重载运算符*(Vector2 v1,Vector2 v2),那么重载应该将这两个向量相乘.但是,对于两个向量,没有明确的"乘法"定义.在线性代数中使用术语"乘法"是非常模糊的.您可能指的是张量产品,外部产品,内部产品,交叉产品,标量产品等.因此,为了使您的代码更容易混淆,我建议您将内部产品操作符实现为

public static float InnerProduct(Vector2 v1, Vector v2)
Run Code Online (Sandbox Code Playgroud)

代替.

至于平方根函数的更好实现,Math.Sqrt可能是最快的(在.NET框架中)之一.如果您正在考虑提高类的速度,那么在本机C/C++中编写它,然后为它编写托管包装器可能会给您带来最大的改进.