Javaで2点間の距離を計算する
1. 概要
このクイックチュートリアルでは、Javaで2点間の距離を計算する方法を示します。
2. 距離の数式
平面上に2つの点があるとします。最初の点Aは座標(x1、y1)を持ち、2番目の点Bは座標(x2、y2)を持ちます。 AB(ポイント間の距離)を計算します。
まず、斜辺ABで直角三角形を作成しましょう。
ピタゴラスの定理によると、三角形の脚の長さの2乗の合計は、三角形の斜辺の長さの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 packagesはすぐに使えるソリューションを提供しますが、最初に上記の式を次のように実装しましょう。
public double calculateDistanceBetweenPoints(
double x1,
double y1,
double x2,
double y2) {
return Math.sqrt((y2 - y1) * (y2 - y1) + (x2 - x1) * (x2 - x1));
}
解をテストするために、脚が3と4の三角形を見てみましょう(上の図を参照)。 数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点間の距離を計算するいくつかの方法を示しました。
いつものように、例で使用されているコードは利用可能なover on GitHubです。