Berechnen Sie einen Punkt entlang einer Linie, wenn Sie einen Start- und Endpunkt sowie eine Entfernung angegeben haben

Lesezeit: 4 Minuten

Benutzer-Avatar
Amanda

Suchen Sie nach dem schnellsten Weg, um einen Punkt zu berechnen, der auf einer Linie in einem bestimmten Abstand vom Endpunkt der Linie entfernt liegt:

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, nein, das ist keine Hausaufgabe, nur etwas aus meinem normalen Fachgebiet heraushacken.

Dies ist die unten vorgeschlagene Funktion. Es ist nicht in der Nähe zu arbeiten. Wenn ich Punkte alle 5 Grad auf dem oberen rechten 90-Grad-Teil eines Kreises als Startpunkte berechne und die Funktion unten mit dem Mittelpunkt des Kreises als x2,y2 mit einem Abstand von 4 aufrufe, sind die Endpunkte völlig falsch. Sie liegen unterhalb und rechts vom Mittelpunkt und sind so lang wie der Mittelpunkt. Hat jemand 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 diese Lösung auf Stackoverflow gefunden, verstehe sie aber nicht vollständig. Kann mir das jemand erklären?

  • Vielleicht sollten Sie Floats/Doubles verwenden, da Sie Rundungsfehler erhalten. Dies könnte ein Problem sein.

    – Lukas

    25. November 2009 um 21:41 Uhr

  • Was Lukas gesagt hat. Außerdem hast du wahrscheinlich meinen Beitrag gelesen, während ich einen Tippfehler hatte. Wenn x1y1 der Ursprung ist, möchten Sie x1y1 + vxvy * (mag + distance), nicht x2y2. Das heißt, Sie möchten ausgehend vom Ursprung die Entfernung zurücklegen zu x2y2 plus die zusätzliche Entfernung, wobei die Richtung von x1y1 nach x2y2 verwendet wird. Obwohl ich denke, dass Sie Ihre Frage vielleicht umformulieren möchten. Was genau willst du machen? Die Frage, wie sie jetzt ist, scheint eher ein Zwischenproblem zu sein.

    Mads Elvheim

    5. Dezember 2009 um 2:19 Uhr

Ich denke, das gehört zu MathOverflow, aber ich werde antworten, da dies Ihr erster Beitrag ist. Zuerst berechnet man den Vektor von x1y1 nach x2y2:

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

Dann berechnen Sie die Länge:

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

Normalisieren Sie den Vektor auf Einheitslänge:

vx /= mag;
vy /= mag;

Berechnen Sie schließlich den neuen Vektor, der x2y2 + vxvy * (mag + Distanz) ist.

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

Sie können einige der Berechnungen weglassen, indem Sie stattdessen mit Distanz / Mag multiplizieren.

  • leider ist mathoverflow zu snobistisch, um diese Art von Frage zu stellen; es gehört hierher.

    – Viktor Liu

    25. November 2009 um 21:51 Uhr

  • Tut mir leid, wenn es zu einfach ist, Jungs, völlig außerhalb meines normalen Kompetenzbereichs. Danke für die Hilfe.

    – Amanda

    1. Dezember 2009 um 19:58 Uhr

  • Gute Arbeit. Ich war einmal Professor, und die erste, größte Lektion, die ich gelernt habe, war, dass das, was ich für einfach hielt, für andere nicht einfach war. Ich mag SO als Mittel, um sich gegenseitig zu helfen.

    – Mike Dunlavey

    1. Dezember 2009 um 22:24 Uhr

  • Was auch immer die Vorzüge von MathOverflow sind, die Aufgabe, das Richtige zu schreiben Code eigentlich außerhalb der Kernkompetenzen der Mitarbeiter von MathOverflow liegen würde. Ich bin jetzt aktiver bei MathOverflow (ich habe dort ungefähr 3.000 Repräsentanten), aber ich werde auch weiterhin mathematische Fragen zu SO beantworten. Die Seiten ergänzen sich meiner Meinung nach gut.

    – Ilja n.

    10. Dezember 2009 um 19:00 Uhr

  • Ich denke, das könnte viel einfacher sein: *px = (int)((float)x2 + vx * distance)); *py = (int)((float)y2 + vy * Distanz));

    – Nicolas Mommaerts

    16. Juli 2012 um 17:18 Uhr


Benutzer-Avatar
Tom Orsi

Diese Gleichungen sind falsch:

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

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

Die richtigen Gleichungen lauten:

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

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

Tom

1130350cookie-checkBerechnen Sie einen Punkt entlang einer Linie, wenn Sie einen Start- und Endpunkt sowie eine Entfernung angegeben haben

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy