1. 概要

このクイックチュートリアルでは、Javaで2点間の距離を計算する方法を示します。

2. 距離の数式

平面上に2つの点があるとします。最初の点Aは座標(x1、y1)を持ち、2番目の点Bは座標(x2、y2)を持ちます。 ポイント間の距離であるABを計算します。

まず、hypotenuseABで直角三角形を作成しましょう。

ピタゴラスの定理によれば、三角形の脚の長さの2乗の合計は、三角形のhypotenuseの長さの2乗と同じです: AB2 = AC2 +CB2

次に、ACとCBを計算しましょう。

明らかに:

AC = y2 - y1

同様に:

BC = x2 - x1

方程式の一部を置き換えてみましょう。

distance * distance = (y2 - y1) * (y2 - y1) + (x2 - x1) * (x2 - x1)

最後に、上記の式から、ポイント間の距離を計算できます。

distance = sqrt((y2 - y1) * (y2 - y1) + (x2 - x1) * (x2 - x1))

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

3. Javaの実装

3.1. プレーンフォーミュラの使用

java.lang.Mathおよびjava.awt.geom.Point2D パッケージはすぐに使えるソリューションを提供しますが、最初に上記の式をそのまま実装しましょう。

public double calculateDistanceBetweenPoints(
  double x1, 
  double y1, 
  double x2, 
  double y2) {       
    return Math.sqrt((y2 - y1) * (y2 - y1) + (x2 - x1) * (x2 - x1));
}

解をテストするために、脚が34の三角形を取りましょう(上の図を参照)。  斜辺の値として5という数値が適切であることは明らかです。

3 * 3 + 4 * 4 = 5 * 5

解決策を確認しましょう:

@Test
public void givenTwoPoints_whenCalculateDistanceByFormula_thenCorrect() {
    double x1 = 3;
    double y1 = 4;
    double x2 = 7;
    double y2 = 1;

    double distance = service.calculateDistanceBetweenPoints(x1, y1, x2, y2);

    assertEquals(distance, 5, 0.001);
}

3.2. java.lang.Mathパッケージの使用

calculateDistanceBetweenPoints()メソッドでの乗算の結果が大きすぎると、オーバーフローが発生する可能性があります。 それとは異なり、 Math.hypot()メソッドは、中間のオーバーフローまたはアンダーフローを防ぎます。

public double calculateDistanceBetweenPointsWithHypot(
    double x1, 
    double y1, 
    double x2, 
    double y2) {
        
    double ac = Math.abs(y2 - y1);
    double cb = Math.abs(x2 - x1);
        
    return Math.hypot(ac, cb);
}

前と同じポイントを取り、距離が同じであることを確認しましょう。

@Test
public void givenTwoPoints_whenCalculateDistanceWithHypot_thenCorrect() {
    double x1 = 3;
    double y1 = 4;
    double x2 = 7;
    double y2 = 1;

    double distance = service.calculateDistanceBetweenPointsWithHypot(x1, y1, x2, y2);

    assertEquals(distance, 5, 0.001);
}

3.3. java.awt.geom.Point2Dパッケージの使用

最後に、 Point2D.distance()メソッドを使用して距離を計算しましょう。

public double calculateDistanceBetweenPointsWithPoint2D( 
    double x1, 
    double y1, 
    double x2, 
    double y2) {
        
    return Point2D.distance(x1, y1, x2, y2);
}

次に、同じ方法でメソッドをテストしましょう。

@Test
public void givenTwoPoints_whenCalculateDistanceWithPoint2D_thenCorrect() {

    double x1 = 3;
    double y1 = 4;
    double x2 = 7;
    double y2 = 1;

    double distance = service.calculateDistanceBetweenPointsWithPoint2D(x1, y1, x2, y2);

    assertEquals(distance, 5, 0.001);
}

4. 結論

このチュートリアルでは、Javaの2点間の距離を計算するいくつかの方法を示しました。

いつものように、例で使用されているコードは、GitHubから入手できます。