2011-01-15 2 views
2

Ich möchte einen Punkt a in zweidimensionalen Suchraum zu einem anderen Punkt b mit einigen Stepsize (_config.StepSize = 0.03) verschieben.Verschieben Sie Punkt zu einem anderen in 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); 
//--- 

Ist es korrekt?

+0

Nun, welche Testfälle haben Sie versucht? –

+2

Pythagoras schüttelt seinen Stock bei Euklid: "Verschwinde von meinem Rasen!" –

+1

Mit einem Wort, nein. Deine euklidischeNorm ist im Grunde genommen die Hypotenuse, ich bin mir nicht sicher, was diff dir geben soll und der Versatz, wenn er richtig berechnet wird, wird zu x und y addiert und bedeutet eine Stufe in einem 45 Grad Winkel (wenn es eine Stufe gibt überhaupt). Sie müssen den Winkel des Vektors betrachten und diesen mit der Hypotenuse verwenden, um die neuen x- und y-Positionen zu bestimmen. Es gibt wahrscheinlich einige schlaue Wege, das schneller zu berechnen als Pythagoras, aber es würde funktionieren. – Lazarus

Antwort

9

Angenommen, Sie meinen, Sie möchten einen Punkt in Richtung einen anderen Punkt verschieben und unter der Annahme, dass Ihre Schrittweite Abstandseinheiten hat, dann ist Ihre Berechnung nicht korrekt.

Die richtige Formel ist:

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

In C#, mit nur einer einfachen Point Klasse und die Math Bibliothek, das wie folgt aussieht:

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: Aktualisierter Code gemäß TrevorSeniors-Vorschlag in Kommentaren

+0

Dies wird nicht wie es kompiliert wird. 'length' ist ein double * und * wird immer größer sein als die X/Y-Komponenten des Vektors, der dazu verwendet wurde. Das bedeutet, dass 'new Point()' immer {0,0} ist. – Brad

+0

@Brad: Die Frage hat nicht klar gemacht, welche "Point" -Klasse verwendet wurde. Sie haben Recht, dass der obige Code einen Code annimmt, der Doubles wie [System.Windows.Point'] (http://msdn.microsoft.com/en-us/library/system.windows.point.point.aspx) oder unterstützt eine benutzerdefinierte Klasse Bei der Verwendung von 'System.Drawing.Point' oder einer anderen Integer-basierten Punktklasse muss der Code entsprechend angepasst werden. –

+0

ahhh interessant! Ich kannte die Klasse System.Windows.Point nicht. Nice – Brad