C# Vector2 code

本文关键字:code Vector2 | 更新日期: 2023-09-27 18:19:25

我需要一个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);
        }
    }

C# Vector2 code

仅3个注释:

1)在c#中,我们通常公开属性而不是字段。也就是

    public float X {get; private set;}
    public float Y {get; private set;}

2)类型double给出了比float更高的精度,所以我建议你使用double而不是float。

你重载了一个操作符
    public static float operator *(Vector2 v1, Vector2 v2)
    {
        return v1.X * v2.X + v1.Y * v2.Y;
    }

取两个二维实向量的点积(内积)在编程中,当重载操作符时,重载操作符应该执行操作符的操作。也就是说,如果要重载操作符*(Vector2 v1, Vector2 v2),则重载操作符应该将这两个向量相乘。然而,对于两个向量的"乘法"并没有明确的定义。在线性代数中使用术语"乘法"是非常模糊的。你可以指张量积,外积,内积,外积,标量积等等。因此,为了使代码不那么混乱,我建议您将内积运算符实现为

public static float InnerProduct(Vector2 v1, Vector v2)

为了更好的实现平方根函数,Math。Sqrt可能是最快的一种(在。net框架中)。如果您想提高类的速度,那么用本机C/c++编写它,然后为它编写托管包装器可能会给您带来最大的改进。