Javaで2行の交点を探す

Javaで2行の交差点を見つける

1. 概要

このクイックチュートリアルでは、how to find the point of intersection of two lines defined by the linear functionsをスロープインターセプト形式で表示します。

2. 交差点の数式

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

y = mx + b

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

垂直線の場合、mは無限大に等しいため、除外します。 2つの線が平行である場合、それらの傾きは同じです。つまり、mの値は同じです。

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

y = m1x + b1

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

y = m2x + b2

imageこれらの線の交点を見つけたいと思います。 明らかに、この方程式は交差点に対して真です。

y1 = y2

y-variablesを置き換えましょう:

m1x + b1 = m2x + b2

上記の式から、x-coordinateを見つけることができます。

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

最後に、交点のy座標を見つけることができます。

y = m1x + b1

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

3. Java実装

まず、4つの入力変数があります。1行目はm1, b1、2行目はm2, b2です。

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

最後に、線は平行である可能性があるため、戻り値をOptional<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);
}

次に、いくつかの値を選択して、平行線と非平行線の方法をテストしましょう。

たとえば、x軸(y = 0)を最初の行とし、y = x – 1で定義された行を2番目の行とします。

2行目では、傾きm1に等しく、これは45度を意味し、y切片は-1に等しく、これは線は、点(0、-1)のy軸をインターセプトします。

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

image

確認してみましょう。

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

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

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

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

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

いつものように、完全なソースコードはover on GitHubで利用できます。