Erweitern Sie ein Liniensegment um eine bestimmte Entfernung

Lesezeit: 3 Minuten

Benutzeravatar von goodgulf
Guter Golf

Ich versuche, einen Weg zu finden, um ein Liniensegment um eine bestimmte Entfernung zu verlängern. Wenn ich zum Beispiel ein Liniensegment habe, das bei 10,10 beginnt und sich bis 20,13 erstreckt, und ich die Länge um 3 verlängern möchte, wie berechne ich den neuen Endpunkt. Ich kann die Länge von sqrt (a ^ 2 + b ^ 2) in diesem Beispiel 10,44 erhalten. Wenn ich also den neuen Endpunkt von 10,10 mit einer Länge von 13,44 wissen wollte, was wäre rechnerisch der schnellste Weg? Ich kenne auch die Steigung, weiß aber nicht, ob mir das in diesem Fall weiterhilft.

  • Dies ist keine Programmierfrage, sondern einfache Mathematik, die Sie dann auf Ihren Code erweitern müssen.

    – Konstantinius

    12. Oktober 2011 um 13:08 Uhr

  • @Constantinius Es ist immer noch eine Algorithmusfrage, nur eine, die auf Mathematik basiert (in der Informatik extrem stark ist).

    – corsiKa

    12. Oktober 2011 um 13:30 Uhr

Benutzeravatar von saeedn
saeedn

Sie können dies tun, indem Sie den Einheitsvektor Ihres Liniensegments finden und auf die gewünschte Länge skalieren und dann den Endpunkt Ihres Liniensegments mit diesem Vektor übersetzen. Angenommen, die Endpunkte Ihrer Liniensegmente sind A und B und Sie möchten nach dem Endpunkt verlängern B (und lenAB ist die Länge des Liniensegments).

#include <math.h> // Needed for pow and sqrt.
struct Point
{
    double x;
    double y;
}

...

struct Point A, B, C;
double lenAB;

...

lenAB = sqrt(pow(A.x - B.x, 2.0) + pow(A.y - B.y, 2.0));
C.x = B.x + (B.x - A.x) / lenAB * length;
C.y = B.y + (B.y - A.y) / lenAB * length;

  • wobei lenAB = sqrt((Ax – Bx)**2 + (Ay – By)**2)

    – Andreas Koch

    12. Oktober 2011 um 14:31 Uhr

  • Nur für den Fall, dass Sie sich fragen, woher das kommt, (Bx – Ax) / lenAB * Länge ist dasselbe wie cos(slope_alpha) * Länge … hat mir geholfen

    – fersarr

    4. September 2013 um 9:41 Uhr

  • wobei length die zusätzliche Länge ist, die der Linie hinzugefügt werden soll

    – Markieren

    26. Februar 2015 um 6:45 Uhr

Wenn Sie die Steigung bereits haben, können Sie den neuen Punkt berechnen:

x = old_x + length * cos(alpha);
y = old_y + length * sin(alpha);

Ich habe das schon eine Weile nicht mehr gemacht, also nimm es mit einem Körnchen Salz.

  • wobei alpha = atan2(y-alt_y, x-alt_x)

    – Andreas Koch

    12. Oktober 2011 um 14:32 Uhr

  • Vielen Dank für Ihre Hilfe, diese Lösung scheint etwas langsamer zu sein als die niedrigere Lösung. Danke für die Hilfe, das hat auch funktioniert.

    – Guter Golf

    12. Oktober 2011 um 18:46 Uhr

  • Das hat bei mir nicht wirklich funktioniert, der neue Punkt war nie parallel zu den 2 angegebenen Linienpunkten. es war also keine gerade Linie mehr. könnte ein Fehler auf meiner Seite sein, vielleicht doppelt überprüfen

    – Peter Pohlmann

    28. Februar 2020 um 20:23 Uhr

Ich bin gerade darüber gestolpert, nachdem ich selbst danach gesucht hatte, und um Ihnen eine sofort einsatzbereite Lösung zu bieten, können Sie sich den Code in einer Standard-Vektorklasse (in jeder Sprache) ansehen und die Teile auswählen, die Sie benötigen , aber am Ende habe ich einen verwendet und der Code sieht so aus:

vector.set(x,y);
vector.normalize();
vector.multiply(10000);// scale it by the amount that you want

Viel Glück !

  • Ich denke, das ist die eleganteste Antwort

    – John Mott

    9. April 2017 um 15:51 Uhr

  • Schätzen Sie diese Antwort. Es ist ein guter Rat, Vektoren (lineare Algebra) zu lernen und regelmäßig nach diesem mathematischen Werkzeug zu greifen, um Geometrieprobleme zu lösen. Sie werden in der Tat in der Lage sein, eleganten Code zu schreiben. Wenn Sie in einem Team arbeiten, wird der gemeinsame Code besser, wenn Sie das Wissen des gesamten Teams in diesem Bereich einbringen.

    – Cervezas

    25. August um 13:12 Uhr

1390120cookie-checkErweitern Sie ein Liniensegment um eine bestimmte Entfernung

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

Privacy policy