Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typescript/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#矢量2代码_C#_Math_Vector_Struct - Fatal编程技术网

C#矢量2代码

C#矢量2代码,c#,math,vector,struct,C#,Math,Vector,Struct,我需要一个Vector2结构的项目,我不是很强的数学,这个类似乎是工作,但我会非常感谢任何关于如何优化代码或如果我有任何错误的指针。 还有比Math.Sqrt更便宜的距离计算方法吗 private struct Vector2 { public float X; public float Y; public Vector2(float x, float y) { this.X = x;

我需要一个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);
        }
    }
只有3条评论:

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

    public float X {get; private set;}
    public float Y {get; private set;}
2) 类型double比float精度更高,因此我建议您使用double而不是float

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

    public static float operator *(Vector2 v1, Vector2 v2)
    {
        return v1.X * v2.X + v1.Y * v2.Y;
    }
我认为这是两个2d实向量的点(内积)。在编程中,当我们重载一个操作符时,重载应该做操作符所做的事情。也就是说,如果我们重载操作符*(vector2v1,vector2v2),重载应该将这两个向量相乘。然而,对于两个向量的“乘法”并没有明确的定义。在线性代数中使用“乘法”一词是非常模糊的。您可以引用张量积、外积、内积、交叉积、标量积等。为了减少代码的混乱,我建议您将内积运算符实现为

public static float InnerProduct(Vector2 v1, Vector v2)
相反

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

如果您不想重新发明轮子,请看看这个。