2012-04-04 1 views
0

код в моем движущемся объекте: функцияC# Normalize (как вектор)

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

Utility:

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» static one. – Dialecticus

+0

Извините, что забыл упомянуть, это мой метод расширения на PointF. Но это настоящий PointF, как в System.Drawing. – 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

Работает как шарм (оба ответа работают кстати). Обратите внимание, что вам нужно добавить float-cast, чтобы он скомпилировался: (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); 
}