C#矢量2代码
我需要一个Vector2结构的项目,我不是很强的数学,这个类似乎是工作,但我会非常感谢任何关于如何优化代码或如果我有任何错误的指针。 还有比Math.Sqrt更便宜的距离计算方法吗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;
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++编写类,然后为其编写托管包装器可能会给您带来最大的改进。如果您不想重新发明轮子,请看看这个。