2012-04-04 13 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'非staticメソッドを持っていませんが、 'Subtract'静的メソッドはあります。 – Dialecticus

+0

申し訳ありませんが、私はPointFの拡張メソッドです。しかし、System.Drawingのように実際のPointFです。 – Napoleon

答えて

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

魅力のように動作します(両方の回答がbtwで動作します)。ちょうどあなたがそれをコンパイルするために浮動小数点型を追加しなければならないことに注意してください:(float)Math.Sqrt(..); – Napoleon

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