# Schnittpunkt zweier Geraden berechnen



## ibhi (31. Aug 2017)

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


----------



## JStein52 (31. Aug 2017)

Für zwei Geraden brauchst du aber vier Punkte (zwei pro Gerade) ...

Edit: und wenn du die hast stellst du zwei Geradengleichungen auf f(x) und g(x),
diese setzt du gleich, löst nach x auf, berechnest x und setzt dies in eine der Gleichungen ein um daraus y auszurechnen.

http://www.arndt-bruenner.de/mathe/9/geradedurchzweipunkte.htm


----------



## ibhi (31. Aug 2017)

Das meinte ich mit dem usw. in meinem Post. Ich habe P1(x1,y1), P2(x2,y2), P3(x3, y3), P4(x4,y4)


----------



## Flown (31. Aug 2017)

https://de.serlo.org/mathe/funktion...n/lineare-funktionen-geraden/geradengleichung


----------



## ibhi (31. Aug 2017)

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...


----------



## JStein52 (31. Aug 2017)

Dann könntest du es etwa so machen:

```
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);
    }
}
```


----------



## Flown (31. Aug 2017)

https://www.mathebibel.de/lineare-funktionen-schnittpunkt-berechnen


----------



## JStein52 (31. Aug 2017)

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


----------



## JStein52 (31. Aug 2017)

Anwenden kannst du es dann so:

```
/**
     * @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));
    }
```


----------



## ibhi (31. Aug 2017)

Ok, vielen Dank. Ich werde es mal durchgehen und versuchen, das Ganze umzusetzen


----------



## JStein52 (31. Aug 2017)

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:

```
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));
    }
```


----------



## JStein52 (31. Aug 2017)

Bei der Schnittpunktberechnung war noch ein Dreher drin:

```
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);
    }
```


----------



## Xyz1 (31. Aug 2017)

JStein52 hat gesagt.:


> Für den Schnittpunkt:
> 
> m1*x+b1 = m2*x+b2
> m1*x-m2*x = b2 - b2


Fehler, `m1*x-m2*x = b2-b1` wäre richtiger.

Ich hätte auch den Weg gegangen über Mathematik, aber mit Vektors.


----------



## JStein52 (31. Aug 2017)

Ja stimmt. Das kommt davon wenn man die Fehler mit Copy&Paste mit kopiert


----------



## Xyz1 (31. Aug 2017)

JStein52 hat gesagt.:


> Ja stimmt




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.


----------



## Xyz1 (1. Sep 2017)

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:

```
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:


Möchte das jemand berichtigen?


----------



## Xyz1 (1. Sep 2017)

DerWissende hat gesagt.:


> 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.


----------



## Xyz1 (1. Sep 2017)

DerWissende hat gesagt.:


> Man muss a noch in die erste Gleichung einsetzen, nach b bringen und alles in g einsetzen -


Das ist blödsinn.



DerWissende hat gesagt.:


> (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.


----------



## JStein52 (1. Sep 2017)

DerWissende hat gesagt.:


> Wer jetzt Angst hat, ob das in der Oberstufe in Klasse 12./13. dran kommt....


Natürlich kommt Schnittpunkt von Geraden dran. Aber warum denn einfach wenn es auch kompliziert geht 
Nehmt einfach meine Herleitung und Berechnung.


----------



## Xyz1 (1. Sep 2017)

JStein52 hat gesagt.:


> 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.


----------



## JStein52 (1. Sep 2017)

DerWissende hat gesagt.:


> Sonst verwirrt mich das Thema doch schon sehr.


Was ist da verwirrend dran ? Du hast es selber verkompliziert ?! Das Thema an für sich ist Schulmathematik Oberstufe ....


----------



## Xyz1 (1. Sep 2017)

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.


----------



## thecain (1. Sep 2017)

wo nimmst du denn 4 dimensionen her?


----------



## Xyz1 (1. Sep 2017)

thecain hat gesagt.:


> wo nimmst du denn 4 dimensionen her





DerWissende hat gesagt.:


> g(a) = A + a*(B-A)



Im Grundsatz ist es wurst, wie viele Komponenten/Dimensionen A und B (und C und D) haben. Mit drei Komponenten wäre es der/ein Punkt einer Geraden im dreidimensionalen Raum!


----------



## JStein52 (2. Sep 2017)

DerWissende hat gesagt.:


> 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:


Wir haben zwei Geraden im n-dimensionalen Raum in der Form in der du es hingeschrieben hast, deren Schnittpunkt wir finden möchten
Wir führen ein Gleichsetzen durch
Wir stellen ein lineares Gleichungssystem auf
Wir lösen dieses Gleichungssystem
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


----------



## Xyz1 (2. Sep 2017)

JStein52 hat gesagt.:


> Aber ich glaube dass du dich in deiner Herleitung oben für 2 Dimensionen irgendwo verhauen hast,





DerWissende hat gesagt.:


> 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.


----------

