Schnittpunkt zweier Geraden berechnen

ibhi

Mitglied
Hallo,

ich habe folgendes Problem: ich habe 2 Geraden, von denen ich jeweils die Endpunkte kenne, also P1(x1,y1), P2(x2,y2) usw. und ich weiß, dass sie sich schneiden. Ich benötige nun die Koordinaten des Schnittpunktes. Eigentlich dürfte das nicht allzu schwer sein, aber ich hab bei dem Thema wohl ein Brett vorm Kopf. Kann mir vielleicht jemand helfen? Google und die Suchfunktion haben nicht dazu geführt, dass es bei mir klick macht 🙁

LG
 
Hm, mit konkreten Werten krieg ich das berechnet, aber wie ich das in Javacode übersetzen kann ist ein Problem. Die Geradengleichungen zu bekommen geht ja noch, aber wie ich das mit dem Gleichsetzen hinkriegen kann ist mir ein Rätsel...
 
Dann könntest du es etwa so machen:
Code:
import java.awt.geom.Point2D;

/**
 *
 * @author Juergen
 */
public class Gerade {

    // Gerade der Form y = m*x + b
    public final double m, b;

    public Gerade(double m, double b) {
        this.m = m;
        this.b = b;
    }
    public Gerade(double x1, double y1, double x2, double y2) {
        this.m = (y2-y1)/(x2-x1);
        this.b = y2-m*x2;
    }

    public Point2D.Double intersect(Gerade line) {
        double x = (this.b - line.b) / (this.m - line.m);
        double y = this.m * x + this.b;
        return new Point2D.Double(x, y);
    }
}
 
Ein bisschen mathematische Herleitung:
Angenommen du hast diese zwei Geraden:

y = m1*x + b1
y = m2*x + b2

Für den Schnittpunkt:

m1*x+b1 = m2*x+b2
m1*x-m2*x = b2 - b2
x(m1-m2) = (b2-b1)

x = (b2-b1) / (m1-m2)

Eingesetzt und nach y aufgelöst:

y = m1 * [(b2-b1) / (m1-m2)] + b1 = m1 * x + b1
 
Anwenden kannst du es dann so:
Code:
    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        Gerade gerade1 = new Gerade(0.3, 6.4);
        Gerade gerade2 = new Gerade(16.3, 17.4);
       
        System.out.println("Schnittpunkt "+gerade1.intersect(gerade2));
    }
 
Ja. Guck es dir nochmal an, vielleicht habe ich mich auf die Schnelle auch irgendwo verhauen ... ist noch nicht getestet. Und die main wenn du insgesamt 4 Punkte hast muss wie folgt aussehen:
Code:
    public static void main(String[] args) {
        Gerade gerade1 = new Gerade(0.3, 6.4, 21.4, 17.5);
        Gerade gerade2 = new Gerade(16.3, 17.4, 0.3, -7.1);
       
        System.out.println("Schnittpunkt "+gerade2.intersect(gerade1));
    }
 
Bei der Schnittpunktberechnung war noch ein Dreher drin:
Code:
    public Point2D.Double intersect(Gerade line) {
        double x = (line.b - this.b) / (this.m - line.m);
        double y = this.m * x + this.b;
        return new Point2D.Double(x, y);
    }
 
😡

Mit Vektors funktioniert das nicht, hier wäre meine Herleitung:

g(a) = A + a*(B-A)
g(a) = (x1,y1) + a*(x2-x1,y2-y1)
g(a) = (a*(x2-x1)+x1, a*(y2-y1)+y1)

(a*(x2-x1)+x1, a*(y2-y1)+y1) = (b*(x4-x3)+x3, b*(y4-y3)+y3)

a*(x2-x1)+x1 = b*(x4-x3)+x3 => b = (a*(x2-x1)+x1)/((x4-x3)+x3)
a*(y2-y1)+y1 = b*(y4-y3)+y3 => a = (b*(y4-y3)+y3)/((y2-y1)+y1)

a = (((a*(x2-x1)+x1)/((x4-x3)+x3))*(y4-y3)+y3)/((y2-y1)+y1)
1 = (((a*(x2-x1)+x1)/((x4-x3)+x3))*(y4-y3)+y3)/ (a*((y2-y1)+y1))

Möchte das ja nach a bringen, aber anscheinend geht das nicht.
 
Moin,
man kann es über Vektors lösen, ist allerdings nicht so "normal".
Hier die Herleitung, in der ich ne Fehler habe 🙁 :

g(a) = A + a*(B-A)
g(a) = (x1,y1) + a*(x2-x1,y2-y1)
g(a) = (a*(x2-x1)+x1, a*(y2-y1)+y1)

(a*(x2-x1)+x1, a*(y2-y1)+y1) = (b*(x4-x3)+x3, b*(y4-y3)+y3)

a*(x2-x1)+x1 = b*(x4-x3)+x3 => b = (a*(x2-x1)+x1)/((x4-x3)+x3)
a*(y2-y1)+y1 = b*(y4-y3)+y3 => a = (b*(y4-y3)+y3)/((y2-y1)+y1)

a*(y2-y1)+y1 = ((a*(x2-x1)+x1)/((x4-x3)+x3))*(y4-y3)+y3
a*(y2-y1)+y1-y3 = ((a*(x2-x1)+x1)/((x4-x3)+x3))*(y4-y3)
(a*(y2-y1)+y1-y3)/(y4-y3) = (a*(x2-x1)+x1)/((x4-x3)+x3)
(a*(y2-y1)+y1-y3)/(y4-y3) = (a*(x2-x1)+x1)/x4
((a*(y2-y1)+y1-y3)*x4)/(y4-y3) = a*(x2-x1)+x1
(a*(y2-y1)+y1-y3)*x4 = a*(x2-x1)+x1*(y4-y3)
a*x4*(y2-y1)+x4*(y1-y3) = a*(x2-x1)+x1*(y4-y3)
a*x4*(y2-y1)-a*(x2-x1) = x1*(y4-y3)-x4*(y1-y3)
a*(x4*(y2-y1)-(x2-x1)) = x1*(y4-y3)-x4*(y1-y3)
a = (x1*(y4-y3)-x4*(y1-y3))/(x4*(y2-y1)-(x2-x1))
a = (x1*(y4-y3)+x4*(y3-y1)) / (x4*(y2-y1)+x1-x2)

Schnittpunkt:

S = (((x1*(y4-y3)+x4*(y3-y1)) / (x4*(y2-y1)+x1-x2))*(x2-x1)+x1, ((x1*(y4-y3)+x4*(y3-y1)) / (x4*(y2-y1)+x1-x2))*(y2-y1)+y1)
x = ((x1*(y4-y3)+x4*(y3-y1))/(x4*(y2-y1)+x1-x2))*(x2-x1)+x1
y = ((x1*(y4-y3)+x4*(y3-y1))/(x4*(y2-y1)+x1-x2))*(y2-y1)+y1

Code:
Java:
import java.awt.geom.Point2D;

/**
 * @author
 */
public class GeradenSchnittpunkt {

    public static void main(String[] args) {
        System.out.println(berechneSchnittpunkt(
                1.5, 4.5, 4.5, 1.5,
                1.5, 1.5, 4.5, 4.5));
        //
        // Ausgabe: Point2D.Double[3.0, 3.0]
        //
        System.out.println(berechneSchnittpunkt(
                2.5, 3.5, 4.5, 1.5,
                3, 1, 5, 3));
        //
        // Ausgabe: Point2D.Double[4.0, 2.0]
        //
    }

    private static Point2D.Double berechneSchnittpunkt(
            double x1, double y1, double x2, double y2,
            double x3, double y3, double x4, double y4) {
        return new Point2D.Double(
                (x1 * (y3 - y4) + x3 * (y4 - y1) + x4 * (y1 - y3)) / ((x1 - x2) * (y3 - y4) + x3 * (y2 - y1) + x4 * (y1 - y2)) * (x2 - x1) + x1,
                (x1 * (y3 - y4) + x3 * (y4 - y1) + x4 * (y1 - y3)) / ((x1 - x2) * (y3 - y4) + x3 * (y2 - y1) + x4 * (y1 - y2)) * (y2 - y1) + y1
        );
    }
}

Zeichnung:
fg.png

Möchte das jemand berichtigen? 😕
 
in der ich ne Fehler habe
Doch kein Fehler, aber unvollständig....
Man muss a noch in die erste Gleichung einsetzen, nach b bringen und alles in g einsetzen - sonst fällt x3 weg / is not used. Wie natürlich sofort zu erkennen ist. 🙄

Wieso ist berechneSchnittpunkt eigentlich richtig? Ich bin dann faul gewesen - und habe Wolframalpha um hilfe gefragt. 😕

Aber es ist schon so, dass mir Gleichungen ab einer bestimmter Länge schwer für mich sind.
 
Man muss a noch in die erste Gleichung einsetzen, nach b bringen und alles in g einsetzen -
Das ist blödsinn.

(a*(x2-x1)+x1, a*(y2-y1)+y1) = (b*(x4-x3)+x3, b*(y4-y3)+y3)

a*(x2-x1)+x1 = b*(x4-x3)+x3 => b = (a*(x2-x1)+x1)/((x4-x3)+x3)
a*(y2-y1)+y1 = b*(y4-y3)+y3 => a = (b*(y4-y3)+y3)/((y2-y1)+y1)
DAS habe ich nicht korrekt nach a und b gebracht... Im Folgenden ist dann alles Falsch. - private static Point2D.Double berechneSchnittpunkt( ist allerdings richtig, weil wie bereits gesagt ich habe Wolframalpha nach hilfe gefragt. :/

Wer jetzt Angst hat, ob das in der Oberstufe in Klasse 12./13. dran kommt.... NEIN, das ist mehr so eine Zusatzaufgabe. 😛 Also Eure 1 könnt ihr auch so bekommen, ohne das Geblubber zu verstehen.
 
Aber warum denn einfach wenn es auch kompliziert geht
Das funktioniert theoretisch auch mit x. Dimensionen. Wobei ich mir gerade keine 4-dimensionale Gerade vorstellen kann.
Das KÖNNTE genauer sein, aber das vermag ich nicht zu sagen.
Zu beachten ist aber bitte, das x3 != x4 und y1 != y2 gelten sollte (........... denn wenn nicht........... identisch oder parallel). 😕
Sonst verwirrt mich das Thema doch schon sehr.
 
Zuletzt bearbeitet von einem Moderator:
4-dimensionale "Geraden" ist der Übungsstoff der Linearen Algebra II, woran viele scheitern könnten.

So, ich habe keine Lust mehr auf das Thema. Das von @JStein52 ist naheliegender, nehmt einfach das. 🙂
 
Im Grundsatz ist es wurst, wie viele Komponenten/Dimensionen A und B (und C und D) haben.
Ja, du hast schon recht. Und man löst dies nach folgendem Schema:

  1. Wir haben zwei Geraden im n-dimensionalen Raum in der Form in der du es hingeschrieben hast, deren Schnittpunkt wir finden möchten
  2. Wir führen ein Gleichsetzen durch
  3. Wir stellen ein lineares Gleichungssystem auf
  4. Wir lösen dieses Gleichungssystem
  5. Mit dem Ergebnis berechnen wir den Schnittpunkt
Aber ich glaube dass du dich in deiner Herleitung oben für 2 Dimensionen irgendwo verhauen hast, war aber zu faul das nachzuprüfen
 
Aber ich glaube dass du dich in deiner Herleitung oben für 2 Dimensionen irgendwo verhauen hast,

DAS habe ich nicht korrekt nach a und b gebracht... Im Folgenden ist dann alles Falsch. -

DAS steht doch da... Sogar in roter Farbe...

Du brauchst dir da keine Mühe machen, was ich falsch gemacht hatte. Der Programmcode ist ja richtig... Um mehr als 2 Dimensionen ging es nicht...

Ich habe das eher als kleine sportliche Aufgabe für mich angesehen. Ich will niemanden verwirren. 😕

Das Thema ist doch schon fertisch... Eine Rückmeldung vom TE wäre noch schön. Aber ansonsten gibt es hier nix mehr zu diskutieren. Stürz dich auf andere Themen. 😉
 

Neue Themen


Zurück
Oben