Finden Sie den Schnittpunkt zweier Zeilen in Java

Finden Sie den Schnittpunkt zweier Linien in Java

1. Überblick

In diesem kurzen Tutorial zeigen wirhow to find the point of intersection of two lines defined by the linear functions in der Steigungsschnittform.

2. Die mathematische Formel der Schnittmenge

Jede gerade Linie (außer der vertikalen) in einer Ebene kann durch die lineare Funktion definiert werden:

y = mx + b

Dabei istm die Steigung undb der y-Achsenabschnitt.

Für eine vertikale Linie wärem gleich unendlich. Deshalb schließen wir sie aus. Wenn zwei Linien parallel sind, haben sie die gleiche Steigung, dh den gleichen Wert vonm.

Nehmen wir an, wir haben zwei Zeilen. Die erste Funktion definiert die erste Zeile:

y = m1x + b1

Und die zweite Funktion definiert die zweite Zeile:

y = m2x + b2

image Wir wollen den Schnittpunkt dieser Linien finden. Offensichtlich gilt die Gleichung für den Schnittpunkt:

y1 = y2

Ersetzen wiry-variables:

m1x + b1 = m2x + b2

Aus der obigen Gleichung können wir diex--Skoordinate finden:

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

Schließlich können wir die y-Koordinate des Schnittpunkts finden:

y = m1x + b1

Fahren wir nun mit dem Implementierungsteil fort.

3. Java-Implementierung

Erstens haben wir vier Eingangsvariablen -m1, b1 für die erste Zeile undm2, b2 für die zweite Zeile.

Zweitens konvertieren wir den berechneten Schnittpunkt in das Objekt vom Typjava.awt.Point.

Schließlich können Linien parallel sein, daher machen wir den zurückgegebenen WertOptional<Point>:

public Optional calculateIntersectionPoint(
    double m1,
    double b1,
    double m2,
    double b2) {

    if (m1 == m2) {
        return Optional.empty();
    }

    double x = (b2 - b1) / (m1 - m2);
    double y = m1 * x + b1;

    Point point = new Point();
    point.setLocation(x, y);
    return Optional.of(point);
}

Wählen Sie nun einige Werte aus und testen Sie die Methode für parallele und nicht parallele Linien.

Nehmen wir zum Beispiel diex-Achse (y = 0) als erste Linie und die durchy = x – 1 definierte Linie als zweite Linie.

Für die zweite Linie ist die Steigungm gleich1, was45 Grad bedeutet, und dery-Achsenabschnitt ist gleich-1, was bedeutet, dass die Die Linie schneidet diey-Achse im Punkt (0, -1) ab.

Es ist intuitiv klar, dass der Schnittpunkt der zweiten Linie mit derx-Achse(1,0 sein muss:

image

Lassen Sie es uns überprüfen.

Stellen Sie zunächst sicher, dassPoint vorhanden ist, da die Linien nicht parallel sind, und überprüfen Sie dann die Werte vonx undy:

@Test
public void givenNotParallelLines_whenCalculatePoint_thenPresent() {
    double m1 = 0;
    double b1 = 0;
    double m2 = 1;
    double b2 = -1;

    Optional point = service.calculateIntersectionPoint(m1, b1, m2, b2);

    assertTrue(point.isPresent());
    assertEquals(point.get().getX(), 1, 0.001);
    assertEquals(point.get().getY(), 0, 0.001);
}

Zuletzt nehmen wir zwei parallele Linien und stellen sicher, dass der zurückgegebene Wert leer ist:

image

@Test
public void givenParallelLines_whenCalculatePoint_thenEmpty() {
    double m1 = 1;
    double b1 = 0;
    double m2 = 1;
    double b2 = -1;

    Optional point = service.calculateIntersectionPoint(m1, b1, m2, b2);

    assertFalse(point.isPresent());
}

4. Fazit

In diesem Tutorial haben wir gezeigt, wie der Schnittpunkt zweier Linien berechnet wird.

Wie üblich ist der vollständige Quellcodeover on GitHub verfügbar.