Trouver l’intersection de deux lignes en Java

Trouver l'intersection de deux lignes en Java

1. Vue d'ensemble

Dans ce rapide didacticiel, nous allons afficherhow to find the point of intersection of two lines defined by the linear functions sous la forme d'interception de pente.

2. La formule mathématique de l'intersection

Toute ligne droite (sauf verticale) sur un plan peut être définie par la fonction linéaire:

y = mx + b

m est la pente etb est l'ordonnée à l'origine.

Pour une ligne verticale,m serait égal à l'infini, c'est pourquoi nous l'excluons. Si deux droites sont parallèles, elles ont la même pente, soit la même valeur dem.

Disons que nous avons deux lignes. La première fonction définit la première ligne:

y = m1x + b1

Et la deuxième fonction définit la deuxième ligne:

y = m2x + b2

image Nous voulons trouver le point d'intersection de ces droites. Évidemment, l'équation est vraie pour le point d'intersection:

y1 = y2

Remplaçons les variablesy-:

m1x + b1 = m2x + b2

À partir de l'équation ci-dessus, nous pouvons trouver la coordonnéex-:

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

Enfin, nous pouvons trouver la coordonnée y du point d'intersection:

y = m1x + b1

Passons maintenant à la partie mise en œuvre.

3. Implémentation Java

Premièrement, nous avons quatre variables d'entrée -m1, b1 pour la première ligne etm2, b2 pour la deuxième ligne.

Deuxièmement, nous allons convertir le point d'intersection calculé en objet de typejava.awt.Point.

Enfin, les lignes peuvent être parallèles, donc faisons la valeur renvoyéeOptional<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);
}

Maintenant, choisissons quelques valeurs et testons la méthode pour les lignes parallèles et non parallèles.

Par exemple, prenons l’axex (y = 0) comme première ligne et la ligne définie pary = x – 1 comme deuxième ligne.

Pour la deuxième ligne, la pentem est égale à1 ce qui signifie45 degrés, et l'ordonnée à l'originey est égale à-1 ce qui signifie que le La ligne intercepte l'axe syau point (0, -1).

Il est intuitivement clair que le point d'intersection de la deuxième ligne avec l'axex doit être(1,0):

image

Vérifions-le.

Tout d'abord, assurons-nous qu'unPoint est présent, car les lignes ne sont pas parallèles, puis vérifions les valeurs dex ety:

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

Enfin, prenons deux lignes parallèles et assurez-vous que la valeur renvoyée est vide:

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

Dans ce didacticiel, nous avons montré comment calculer le point d'intersection de deux lignes.

Comme d'habitude, le code source complet est disponibleover on GitHub.