2012-04-04 71 views
0

代碼在我的移動物體:C#正常化(如矢量)

ObjectX.Location.Add(Velocity * Utils.GetMoveDir(start, destination)); 

效用函數:

public static PointF GetMoveDir(PointF start, PointF destination) 
    { 
     PointF substraction = destination.SubStract(start); 
     if (substraction == PointF.Empty) // If-statement is needed because normalizing a zero value results in a NaN value 
      return PointF.Empty; 
     else 
      return substraction.Normalize(); // <<<< I need something for this 
    } 

延長我不能去上班:

public static PointF Normalize(this PointF A) 
    { 
     throw new NotImplementedException(); // How do I solve this to make it like: http://msdn.microsoft.com/en-us/library/microsoft.xna.framework.vector2.normalize.aspx 
    } 

請注意,我不使用XNA框架。

+0

是''PointF'實際'System.Drawing.PointF'還是別的嗎?上面提到的'PointF'沒有'SubStract'非靜態方法,但它有'Subtract'靜態方法。 – Dialecticus 2012-04-04 13:11:54

+0

對不起,我忘了提,它是PointF上我的一個擴展方法。但它是一個真正的PointF,就像在System.Drawing中一樣。 – Napoleon 2012-04-04 13:41:44

回答

12
public static PointF Normalize(this PointF A) 
{ 
    float distance = Math.Sqrt(A.X * A.X + A.Y * A.Y); 
    return new PointF(A.X/distance, A.Y/distance); 
} 

另見第一段here學什麼的歸一化矢量(單位矢量)是你如何計算。

+1

工程就像一個魅力(兩個答案工作順便說一句)。請注意,您必須添加一個float-cast來編譯它:(float)Math.Sqrt(..); – Napoleon 2012-04-04 13:42:55

5
public static PointF Normalize(this PointF A) 
{ 
    float length = Math.Sqrt(A.X*A.X + A.Y*A.Y); 
    return new PointF(A.X/length, A.Y/length); 
}