2011-01-15 9 views
2

いくつかのstepsize(_config.StepSize = 0.03)を使用して、2次元検索スペースのあるポイントaを別のポイントbに移動したいとします。cで別のポイントに移動

Point a = agent.Location; 
Point b = agentToMoveToward.Location; 

//--- important   
double diff = (b.X - a.X) + (b.Y - a.Y); 
double euclideanNorm = Math.Sqrt(Math.Pow((b.X - a.X), 2) + Math.Pow((b.Y - a.Y), 2)); 
double offset = _config.StepSize * (diff/euclideanNorm); 

agent.NextLocation = new Point(a.X + offset, a.Y + offset); 
//--- 

正しいですか?

+0

さて、どのようなテストケースを試しましたか? –

+2

ピラタスがユークリッドで彼の杖を振っている:「私の芝生から降りてください! –

+1

一言で言えば、いいえ。あなたのeuclideanNormは基本的に斜辺ですが、私はdiffがあなたに与えることが意図されているか分かりません。正しく計算されていてもオフセットはxとyに加えられます。まったく)。あなたは、ベクトルの角度を見て、それを斜辺と使って、新しいxとyの位置を決定する必要があります。おそらくPythagorasよりも速く計算する巧妙な方法がありますが、それはうまくいくでしょう。 – Lazarus

答えて

9

に向けて別のポイントとし、ステップサイズに距離単位があると仮定すると、計算は正しくありません。

正しい式は次のとおりです。

public Point MovePointTowards(Point a, Point b, double distance) 
{ 
    var vector = new Point(b.X - a.X, b.Y - a.Y); 
    var length = Math.Sqrt(vector.X * vector.X + vector.Y * vector.Y); 
    var unitVector = new Point(vector.X/length, vector.Y/length); 
    return new Point(a.X + unitVector.X * distance, a.Y + unitVector.Y * distance); 
} 

編集:C#ので

  • nextLocation = a + UnitVector(a, b) * stepSize

、単純なPointクラスとMathライブラリを使用して、これは次のようになります。コメント内のTrevorSeniors提案に基づくコードを更新しました

+0

これはそのままコンパイルされません。 'length'はdouble *で、*は常にベクトルのX/Y成分より大きくなります。つまり、 'new Point()'は常に{0,0}になります。 – Brad

+0

@ブラッド:どのPointクラスが使われているのかは分かりませんでした。上記のコードは、['System.Windows.Point'](http://msdn.microsoft.com/en-us/library/system.windows.point.point.aspx)のような倍精度をサポートするものと仮定しています。カスタムクラス。 'System.Drawing.Point'や他の整数ベースのポイントクラスを使うときは、それに応じてコードを適合させる必要があります。 –

+0

ああ面白い!私はSystem.Windows.Pointクラスについて知らなかった。ニース – Brad

関連する問題