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]から入手できます。