Bei einem gegebenen Anfangs- und Endpunkt und ein Abstand, berechnet einen Punkt entlang einer Linie

StackOverflow https://stackoverflow.com/questions/1800138

Frage

Sie suchen den schnellsten Weg, um einen Punkt zu berechnen, die auf einer Linie liegt, in einem gegebenen Abstand von dem Endpunkt der Linie weg:

void calculate_line_point(int x1, int y1, int x2, int y2, int distance, int *px, int *py) 
{
    //calculate a point on the line x1-y1 to x2-y2 that is distance from x2-y2
    *px = ???
    *py = ???
}  

Danke für die Antworten, keine ist diese Hausaufgaben nicht, um nur einige aus Hacking mein normales Fachgebiet.

Dies ist die Funktion unten vorgeschlagen. Es ist nicht in der Nähe arbeiten. Wenn ich berechnen Punkte alle 5 Grad auf der oberen rechten 90-Grad-Abschnitt ein Kreis als Ausgangspunkt und der Mittelpunkt des Kreises als x2, y2 mit einem Abstand von 4 die Endpunkte sind völlig falsch, die Funktion unten nennen. Sie liegen unterhalb und rechts von der Mitte und die Länge ist so lang wie der Mittelpunkt. Jemand irgendwelche Vorschläge?

void calculate_line_point(int x1, int y1, int x2, int y2, int distance)
{

//calculate a point on the line x1-y1 to x2-y2 that is distance from x2-y2

  double vx = x2 - x1; // x vector
  double vy = y2 - y1; // y vector

  double mag = sqrt(vx*vx + vy*vy); // length

  vx /= mag;
  vy /= mag;

// calculate the new vector, which is x2y2 + vxvy * (mag + distance).

  px = (int) ( (double) x2 + vx * (mag + (double)distance) );
  py = (int) ( (double) y2 + vy * (mag + (double)distance) );

}

Ich habe gefunden diese Lösung auf Stackoverflow aber nicht verstehen, es vollständig, kann jemand erklären?

War es hilfreich?

Lösung

Ich denke, das auf MathOverflow gehört, aber ich werde beantworten, da dies Ihr erster Beitrag ist. Zuerst Sie den Vektor von x1y1 bis x2y2 berechnen:

float vx = x2 - x1;
float vy = y2 - y1;

Dann berechnen die Länge:

float mag = sqrt(vx*vx + vy*vy);

Normalisieren des Vektors zu Einheitslänge:

vx /= mag;
vy /= mag;

berechnen schließlich den neuen Vektor, der x2y2 ist + vxvy * (mag + Abstand).

*px = (int)((float)x1 + vx * (mag + distance));
*py = (int)((float)y1 + vy * (mag + distance));

Sie können stattdessen einige der Berechnungen multipliziert mit der Entfernung / mag wegzulassen.

Andere Tipps

Diese Gleichungen sind falsch:

px = (int) ( (double) x2 + vx * (mag + (double)distance) );

py = (int) ( (double) y2 + vy * (mag + (double)distance) );

Die richtigen Gleichungen sind:

px = (int) ( (double) x2 + vx * (double)distance );

py = (int) ( (double) y2 + vy * (double)distance );

Tom

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top