2011-01-15 3 views
2

Я хотел бы переместить некоторую точку a в двумерном пространстве поиска в другую точку b с помощью нескольких шагов (_config.StepSize = 0.03).Переместить точку в другую в 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 - это, в основном, гипотенуза, я не уверен, что различие предназначено для вас, и смещение, даже если оно правильно рассчитано, добавляется к x и y, равнозначно шаг в 45 градусов (если есть шаг вообще). Вы должны смотреть на угол вектора и использовать это с гипотенузой для определения новых местоположений x и y. Вероятно, есть некоторые умные способы вычисления, которые быстрее, чем Пифагор, но это сработает. – Lazarus

ответ

9

Предполагаете, вы хотите переместить одну точку в направлении другой точки и при условии, что ваш размер шага имеет единицы измерения расстояния, то нет, то ваш расчет некорректен.

Правильная формула:

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

В C#, используя только простой Point класс и Math библиотеку, это выглядит следующим образом:

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

Edit: Обновленный код в соответствии с предложением TrevorSeniors в комм. ents

+0

Это не компилируется как есть. 'length' - это double * и *, всегда будет больше, чем компоненты X/Y вектора, которые вошли в его создание. Это означает, что 'new Point()' всегда будет {0,0}. – Brad

+0

@Brad: В вопросе не было указано, какой класс 'Point' использовался. Вы правы, что вышеприведенный код предполагает тот, который поддерживает удвоения, такие как ['System.Windows.Point'] (http://msdn.microsoft.com/en-us/library/system.windows.point.point.aspx) или пользовательский класс. При использовании 'System.Drawing.Point' или другого целочисленного класса точек код должен быть соответствующим образом адаптирован. –

+0

ahhh интересно! Я не знал о классе System.Windows.Point. Nice – Brad