Schnittpunkt zweier Linien berechnen

  • VB.NET

Es gibt 23 Antworten in diesem Thema. Der letzte Beitrag () ist von goldengel.

    Schnittpunkt zweier Linien berechnen

    Hallo liebe Community,

    ich muss für unser CAD-Programm die Schnittpunkte zweier Linien berechnen, da die interne Funktion leider nicht richtig funktioniert.

    Ausgangssituation:

    Es sind zwei Linien definiert.
    Jede Linie besitzt eine Eigenschaft "Startpunkt" und eine Eigenschaft "Endpunkt"
    Sowohl Startpunkt als auch Endpunkt haben die Eigenschaften "X" und "Y"

    Nun fehlt mir allerdings die Formel um dies zu berechnen, da ich leider keinen Plan von Vektoren habe.

    Habt ihr vielleicht eine Idee?

    Mit freundlichen Grüßen
    Steve
    SWYgeW91IGNhbiByZWFkIHRoaXMsIHlvdSdyZSBhIGdlZWsgOkQ=

    Weil einfach, einfach zu einfach ist! :D
    Geraden-Gleichung:
    y=a+bx
    -> Gleichung (1):
    y=a1+b1*x
    -> Gleichung (2):
    y=a2+b2*x
    Gleichungen gleichsetzen:
    y(1) = y(2)
    a1+b1*x = a2+b2*x
    ==> nach x auflösen und in (1) oder (2) einsetzen, y berechnen.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!

    Beep! schrieb:

    brauchst ja praktisch nur die Steigung.

    das a in meinem letzten Post:
    a = dy / dx = (y2-y1) / (x2-x1)
    jeweils von / für Gl. (1) und (2).
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Hi
    warum nehmt ihr keine Vektorrechnung? Nicht durch jede Linie kann eine Funktion gelegt werden. Mit
    k * D_1 + S_1 = l * D_2 + S_2
    geht's sogar besser. Da der Aufpunkt S_i der Linien jeweils zweidimensionale Vektoren sind, kann man sowohl für k, als auch für l Lösungen finden, mit 0 <= k <= 1, 0 <= l <= 1, wenn D_i der Vektor von S_i zum Ziel und S_i der Aufpunkt der Linie ist.
    Sieht jetzt komplizierter aus, als es ist. Auf dem Papier löst man dann noch das Gleichungssystem. Wenn keine Lösung vorhanden ist oder die Lösungen für k, l nicht zwischen 0 und 1 liegen, ist kein Schnittpunkt vorhanden, sonst kann man ihn einfach berechnen, indem man ihn in eine der beiden Gleichungen einsetzt.

    Gruß
    ~blaze~
    Hallo.

    Zu folgender Frage:

    ~blaze~ schrieb:

    warum nehmt ihr keine Vektorrechnung?
    Weil ich mich mit Vektoren nicht auskenne. Ich hab leider keinen Hochschulabschluss (leider abgebrochen). Darum bin ich bis zu Winkelfunktionen ;) noch fit, aber darüber hinaus wirds für mich schwierig wenn nicht eine gute Erklärung dabei ist.

    Mein Problem ist das fast alle Formeln die ich finde, ein Grundwissen von Vektoren voraussetzt, welches ich einfach nicht habe. Darum frage ich hier, für einen Schubs in die richtige Richtung (Programmieren kann ich es eh selber ;))

    Zur Idee von picoflop:
    Kollisionsprüfung trifft leider nicht ganz zu, da die Linien sich nicht zwangsläufig berühren. Und ich muss trotzdem auf den Schnitt rechnen können

    Mfg
    Steve
    SWYgeW91IGNhbiByZWFkIHRoaXMsIHlvdSdyZSBhIGdlZWsgOkQ=

    Weil einfach, einfach zu einfach ist! :D

    BiedermannS schrieb:

    da die Linien sich nicht zwangsläufig berühren

    Dann ist der Kollisionspunkt "nothing".
    Der Code überprüft, OB sich zwei Linien (=Strecken) schneiden und WENN JA, in welchem Punkt.

    Und ich muss trotzdem auf den Schnitt rechnen können

    ???
    "auf den Schnitt rechnen"? 1. weiß ich nicht, was das heißt und zweitens kam das mit "trotzdem", was bedeuten würde, dass du den Schnittpunkt auf dann verwenden wolltest, wenn keiner existierte - mithin ein ziemlich unmögliches Unterfangen.
    Sieh Dir meinen Post #2 und Post #5 an, da steht alles drin, Vektoren kommen (explizit) nicht vor, Du musst nur noch Deine Werte einsetzen.
    Wenn Du das auch nicht kannst, :S , musst Du halt noch mal nachfragen.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!

    RodFromGermany schrieb:

    Sieh Dir meinen Post #2 und Post #5 an

    Das Problem dürfte sein, dass du den Schnittpunkt zweier Geraden (!) berechnest und nicht den Schnittpunkt zweier Strecken. Der TE nennt es "Linie", aber ich vermute, dass er eine Strecke aka GeradenABSCHNITT meint. 2 nicht parallele Geraden in zweidimensionalen Raum haben immer genau EINEN Schnittpunkt. 2 nicht parallele Strecken ... haben EINEN oder KEINEN Schnittpunkt. Dh im Fall deiner Formel muss man noch berechnen, ob der Schnittpunkt der beiden Geraden auch auf BEIDEN Strecken (!) liegt.
    Vermutlich ist der von mir gepostete Code (stammt ja nicht von mir, sondern ist nur ne Umsetzung von C -> VB.Net !) die "sinnvollste" Lösung. Stammt ja vermutlich von Leuten, die besser Mathe können als zb ich ;)

    picoflop schrieb:

    dass du den Schnittpunkt zweier Geraden (!) berechnest
    Ja, so isses. :(
    Da müsste mit meinen dann hinterher noch einen Bereichstest durchführen, ob die jeweiligen Koordinaten innerhalb der Streckenlänge liegen.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Da hab ich mich wohl falsch ausgedrückt.

    Ich hab meine zwei Linien gegeben und benötige die Punkte an denen sich die beiden schneiden (Falls sie sich berühren) oder den Punkt wo sich die beiden treffen würden (Wenn sie sich nicht berühren).

    Ich werde mir die Beispiele nochmal genauer durchsehen.

    P.S.: Bei uns hat es mit Winkelfunktionen aufgehört. Und in der Berufsschule ist es Hauptsächlich um Winkelfunktionen, Elektrotechnik und zum Schluss Logarithmen gegangen. :S

    Mfg
    SWYgeW91IGNhbiByZWFkIHRoaXMsIHlvdSdyZSBhIGdlZWsgOkQ=

    Weil einfach, einfach zu einfach ist! :D

    BiedermannS schrieb:

    Ich hab meine zwei Linien gegeben und benötige die Punkte

    Vlt könnten wir erstmal die Basisdaten klären? Am besten indem du die korrekten "Begriffe" verwendest ...
    2 Linien, die sich an mehr als einem Punkt schneiden, können keine Geraden sein - redest du von Kurven?
    "Wo sie sich treffen würden" - also geht es dir jetzt doch eher um GERADEN und nicht um STRECKEN?

    a1 + b1 * x = a2 + b2 * x
    => a1 - a2 = b2 * x - b1 * x
    => a1 - a2 = x * (b2 - b1)
    => x = (a1 - a2) / (b2 - b1)
    Die a und b sind bekannt, also läßt sich x berechnen. Hat man x, kann man y berechnen. Also hast du den Schnittpunkt ... der GERADEN (wenn er existiert). Spezialfälle (Parallel, deckungsgleich) lassen sich trivial mit einer IF Abfrage abfangen.

    PS: Eventuell vorhandene Fehler in obiger Gleichung mögen der Tatsache meines fortgeschrittenen Alters geschuldet sein ...

    picoflop schrieb:

    2 Linien, die sich an mehr als einem Punkt schneiden
    wären auch 2 identische Linien / Geraden.
    @BiedermannS: 2 Geraden, die nicht parallel sind und keinen gemeinsamen Schnittpunkt haben, nennt man windschief. Sie haben dann einen Punkt kürzesten Abstands voneinander.
    Nur mal so nebenbei:
    Rechnest Du 2- oder 3-dimensional?
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Also gegeben hab ich 2 Linien (Keine Bögen/Kurven)

    Es Gibt zwei Fälle die eintreten können:

    1) Die Linien berühren/schneiden sich, somit brauche ich hier den Punkt an dem sich diese schneiden.
    2) Die Linien berühren sich nicht, hier brauch ich den Punkt an dem sich die Linien treffen würden.

    Also wenn ich alles richtig verstanden habe, muss ich anhand der Linien zwei Geraden definieren. Und dann berechnen wo sich diese treffen (Unabhängig davon ob sich die Linien berühren oder nicht)

    Die beiden Linien können in jedem beliebigen Winkel im Raum liegen, haben aber zueinander keinen Winkel unter 45 Grad (Also keine zu spitzen Winkel). Die Linien liegen nicht Parallel zueinander also kann dies auch vernachlässigt werden.

    Gearbeitet wird 2D

    Ich erklär euch mal den Grund für diese Berechnung: (vl wird dann einiges klarer:))

    Bei uns im CAD werden Wände als Bauteile Platziert. Auf diese kann ich über VB zugreifen und mir bestimmte Daten herausholen. Startpunkt auf der Mittelachse, Endpunkt auf der Mittelachse, Winkel.

    Anhand dieser Daten, rechne ich auf die Aussenkante der Wand und bekomme somit folgende Daten: Startpunkt auf der Aussenkante, Endpunkt auf der Aussenkante, Winkel.
    Nun werden paarweise Linien gesucht die nicht parallel zueinander liegen und gemeinsam eine Ecke bilden.
    Diese Linien treffen sich allerdings nicht immer. Nun muss ich anhand dieser Linien(Geraden) auf den Schnittpunkt rechnen, um die Wandaussenkante zu bekommen.

    Im Anhang poste ich noch ein Bild einer Zeichnung. (Dies ist nur ein Beispiel, die Wände können jeden beliebigen Winkel haben)

    L1 = Linie1; S1 = Startpunkt von Linie1; E1 = Endpunkt von Linie1
    L2 = Linie2; S2 = Startpunkt von Linie2; E2 = Endpunkt von Linie2
    SP = Schnittpunkt
    Bilder
    • Beispiel_gesamt.JPG

      24,83 kB, 802×672, 315 mal angesehen
    • Beispiel_mit_Benennung.JPG

      21 kB, 779×785, 498 mal angesehen
    SWYgeW91IGNhbiByZWFkIHRoaXMsIHlvdSdyZSBhIGdlZWsgOkQ=

    Weil einfach, einfach zu einfach ist! :D
    Wenn Du jetzt noch sagst, dass es egal ist, ob sich die Geraden "in der Gerade oder in der Luft" schneiden - sieh Dir meine Posts an, da steht alles drin.
    Aufpassen musst Du, wenn eine Gerade senkrecht ist, da wäre der Anstieg unendlich.
    Deswegen wird im Fall eines Anstieges größer 1 / kleiner -1 x und y getauscht.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Ich habe jetzt folgenden Code erstellt:

    VB.NET-Quellcode

    1. Public Function schnittpunkt(ByVal linie1 As MicroStationDGN.LineElement, ByVal linie2 As MicroStationDGN.LineElement) As Point3d
    2. ' Berechne den Schnittpunkt der entsprechenden Geraden
    3. Dim x1 As Double = Round(linie1.StartPoint.X, 4, MidpointRounding.AwayFromZero), x2 As Double = Round(linie1.EndPoint.X, 4, MidpointRounding.AwayFromZero), x3 As Double = Round(linie2.StartPoint.X, 4, MidpointRounding.AwayFromZero), x4 As Double = Round(linie2.EndPoint.X, 4, MidpointRounding.AwayFromZero)
    4. Dim y1 As Double = Round(linie1.StartPoint.Y, 4, MidpointRounding.AwayFromZero), y2 As Double = Round(linie1.EndPoint.Y, 4, MidpointRounding.AwayFromZero), y3 As Double = Round(linie2.StartPoint.Y, 4, MidpointRounding.AwayFromZero), y4 As Double = Round(linie2.EndPoint.Y, 4, MidpointRounding.AwayFromZero)
    5. Dim xs As Double
    6. Dim ys As Double
    7. Dim k1 As Double
    8. Dim k2 As Double
    9. If x1 = x2 Then
    10. k1 = (y2 - y1) / (x1)
    11. Else
    12. k1 = (y2 - y1) / (x2 - x1)
    13. End If
    14. If x3 = x4 Then
    15. k2 = (y4 - y3) / (x3)
    16. Else
    17. k2 = (y4 - y3) / (x4 - x3)
    18. End If
    19. Dim d1 As Double = y1 - x1 * k1
    20. Dim d2 As Double = y3 - x3 * k2
    21. If k1 = k2 AndAlso d1 = d2 Then
    22. Throw New Exception("Unendlich viele Schnittpunkte!")
    23. ElseIf k1 = k2 AndAlso d1 <> d2 Then
    24. Throw New Exception("Kein Schnittpunkt!")
    25. End If
    26. xs = (d1 - d2) / (k2 - k1)
    27. ys = (k1 * xs) + d1
    28. Return New Point3d With {.X = xs, .Y = ys, .Z = 0}
    29. End Function


    Das funktioniert ziemlich gut, nur in wenn die erste Linie 0° hat und die 2te 90° bekomm ich einen falschen Wert heraus. Ich hab gestern noch einen Bekannten gefragt und der hat gemeint das liegt daran das bei 0° keine Steigung berechnet werden kann. Ich versuch mal diesen Fehler auszumerzen und Poste danach den Code in Sourcecodeaustausch, damit er für alle verfügbar ist :)
    SWYgeW91IGNhbiByZWFkIHRoaXMsIHlvdSdyZSBhIGdlZWsgOkQ=

    Weil einfach, einfach zu einfach ist! :D

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „BiedermannS“ ()