Javaで2行の交点を探す

1概要

このクイックチュートリアルでは、線形関数で定義された2本の線の交点をどうやって勾配切片形式で見つけるかを示します。

2交点の数学式

平面上の任意の直線(垂直を除く)は線形関数で定義できます。

y = mx + b

ここで、 m は勾配、 b はy切片です。

垂直線の場合、 m は無限大に等しいため、除外します。 2本の線が平行である場合、それらは同じ勾配を持ち、それは m の同じ値です。

2行あるとしましょう。最初の関数は最初の行を定義します。

y = m1x + b1

そして2番目の関数は2行目を定義します。

y = m2x + b2

https://www.baeldung.com/uploads/general-y1-y2.png これらの線の交点を見つけます。明らかに、方程式は交点に当てはまります。

y1 = y2

__y - __変数に置き換えましょう。

m1x + b1 = m2x + b2
  • 上記の式から、 __ x - __座標を見つけることができます。

x(m1 - m2) = b2 - b1
x = (b2 - b1)/(m1 - m2)
  • 最後に、交点のy座標を見つけることができます。

y = m1x + b1

それでは実装部分に移りましょう。

3 Java実装

まず、最初の行に m1、b1 、2行目に m2、b2 の4つの入力変数があります。

次に、計算した交点を java.awt.Point タイプのオブジェクトに変換します。

最後に、線が平行になる場合があるので、戻り値を Optional <Point> にしましょう。

public Optional<Point> 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);
}

それでは、いくつかの値を選択し、平行線と非平行線の方法をテストしましょう。

たとえば、 x 軸( y = 0 )を1行目として、 y = x - 1 で定義される行を2行目として考えてみましょう。

2番目の線では、勾配 m 1 に等しく、これは 45 度を意味し、 y 切片は -1 に等しく、これは線が点(0、-1)で y 軸を横切ることを意味します。

2本目の線と x 軸との交点が (1,0 )でなければならないことは直感的に明らかです。

確認しましょう。

まず、行が平行ではないため、 Point が存在することを確認してから、 x y の値を確認します。

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

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

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

最後に、2本の平行線を取り、戻り値が空であることを確認しましょう。

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

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

    assertFalse(point.isPresent());
}

4結論

このチュートリアルでは、2本の線の交点を計算する方法を説明しました。

いつものように、完全なソースコードはhttps://github.com/eugenp/tutorials/tree/master/algorithms-miscellaneous-2[over on GitHub]から入手できます。