2013-06-22 67 views
2

我需要一個項目的Vector2結構,我不是很強大的數學,這個類似乎工作,但我將不勝感激指示如何優化代碼或如果我已經做了任何錯誤。 還有一種比Math.Sqrt更便宜的距離計算方法嗎?C#Vector2代碼

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); 
     } 
    } 
+0

http://www.opentk.com/doc/math看看這個,如果你不想重新發明輪子。 – CSharpie

回答

9

僅有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實向量的點(內積)。在編程中,當我們重載一個操作符時,重載應該完成操作符的操作。也就是說,如果我們要重載運算符*(Vector2 v1,Vector2 v2),則重載應該將這兩個向量相乘。但是,對於兩個向量沒有「乘法」的明確定義。使用線性代數中的「乘法」一詞非常模糊。你可能會提及張量積,外積,內積,叉積,數量積,等於是使你的代碼少混亂,我會建議你實現的內積運算符,

public static float InnerProduct(Vector2 v1, Vector v2) 

代替。

至於更好地實現平方根函數,Math.Sqrt可能是最快的一個(在.NET框架中)。如果您正在考慮提高班級的速度,那麼將其寫入本地C/C++,然後爲其編寫託管包裝可能會給您提供最大的改進。