2009-11-25 17 views
15

der Suche nach dem schnellsten Weg zu berechnen, einen Punkt zu berechnen, die auf einer Linie liegt in einem gegebenen Abstand vom Endpunkt der Linie:einen Start- und Endpunkt gegeben, und ein Abstand, einen Punkt entlang einer Linie

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 = ??? 
} 

Vielen Dank für die Antworten, nein, das ist keine Hausaufgaben, nur ein wenig aus hacken mein normales Fachgebiet.

Dies ist die unten vorgeschlagene Funktion. Es ist nicht in der Nähe zu arbeiten. Wenn I Punkte alle 5 Grad auf der oberen rechten 90 Grad-Teil von einen Kreis als Startpunkte berechnen und die Funktion unten mit dem Mittelpunkt des Kreises als x2, y2 mit einem Abstand von 4 die Endpunkte sind total falsch. Sie liegen unterhalb und rechts von der Mitte und die Länge ist so lang wie der Mittelpunkt. Hat 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)); 

}

I this Lösung auf Stackoverflow gefunden habe, aber es nicht verstehen völlig, kann jeder klären?

+4

Vielleicht sollten Sie verwenden Schwimmern/Doppelzimmer, weil Sie werde abgerundet ng Fehler. Dies könnte ein Problem sein. – Lucas

+1

Was Lucas gesagt hat. Außerdem hast du wahrscheinlich meinen Post gelesen, als ich einen Tippfehler hatte. Wenn x1y1 der Ursprung ist, wollen Sie x1y1 + vxvy * (mag + Abstand), nicht x2y2. Das heißt, ausgehend vom Ursprung, möchten Sie die Entfernung _ bis x2y2_ plus die zusätzliche Entfernung zurücklegen, indem Sie die Richtung von x1y1 bis x2y2 verwenden. Obwohl ich denke, dass Sie vielleicht Ihre Frage neu formulieren möchten. Was genau willst du machen? Die Frage, so wie sie jetzt ist, scheint eher ein Zwischenproblem zu sein. –

+0

[Geometrie: Einen Punkt entlang einer Linie in einer bestimmten Entfernung von einem anderen Punkt finden!] (Http://math.stackexchange.com/questions/175896/finding-a-point-along-a-line-a-certain-) distance-away-from-after-point/1630886 # 1630886) –

Antwort

33

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

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

Dann die Länge berechnen:

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

den Vektor Längeneinheit Normalisieren:

vx /= mag; 
vy /= mag; 

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

Sie können einige Berechnungen weglassen, die stattdessen mit distance/mag multipliziert werden.

+16

leider ist mathoverflow zu snobistisch, um diese Frage zu beantworten; es gehört hierher. –

+0

Das ist bedauerlich. –

+1

Tut mir leid, wenn es zu einfach ist Jungs, völlig außerhalb meiner normalen Zuständigkeitsbereich. Danke für die Hilfe. – amanda

1

Diese Gleichungen sind falsch:

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

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

die korrekten Gleichungen sind:

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

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

Tom

Verwandte Themen