2020.03.23
2点間の距離計算
はじめに
下の図は、(x1,y1)と(x2,y2)を結んだ直線と、その距離lを表したものです。
Javaソースコード
Distance.java
001 002 003 004 005 006 007 008 009 010 011 012 013 014 015 016 017 018 019 020 021 022 023 024 025 026 027 028 029 030 031 032 033 034 035 036
public class Distance { public static void main( String[] args ) { double x1, y1; double x2, y2; // 1つ目の座標を代入 x1 = 60.0; y1 = 20.0; // 2つ目の座標を代入 x2 = 10.0; y2 = 40.0; // 結果を表示 System.out.println( dist( x1, y1, x2, y2 ) ); } // (x1,y1)-(x2,y2)の直線距離を計算するメソッド private static double dist( double x1, double y1, double x2, double y2 ) { double l; double dx, dy; // x座標の差を計算してdxに代入 dx = x2 - x1; // y座標の差を計算してdyに代入 dy = y2 - y1; // 2点間の距離を計算してlに代入 l = Math.sqrt( dx * dx + dy * dy ); // 計算した距離を返す return l; } }
実行結果
コンパイル ソースコードが「ANSI」の場合
C:\talavax\javasample>javac -encoding sjis Distance.java
コンパイル ソースコードが「UTF-8」の場合
C:\talavax\javasample>javac Distance.java
実行
C:\talavax\javasample>java Distance
53.85164807134504
Javaソースコードの解説
以下の部分が、2点間の距離を計算するメソッドです。
019 020 021 022 023 024 025 026 027 028 029 030 031 032 033 034 035
// (x1,y1)-(x2,y2)の直線距離を計算するメソッド private static double dist( double x1, double y1, double x2, double y2 ) { double l; double dx, dy; // x座標の差を計算してdxに代入 dx = x2 - x1; // y座標の差を計算してdyに代入 dy = y2 - y1; // 2点間の距離を計算してlに代入 l = Math.sqrt( dx * dx + dy * dy ); // 計算した距離を返す return l; }
この計算には、ピタゴラスの定理を使用しています。ピタゴラスの定理は、直角三角形の3辺の長さの関係を表したもので、斜辺の長さの2乗は、他の2つの辺の長さをそれぞれ2乗して値の和(合計)と同じになるというものです。
下の図は、2つの座標間の距離を計算する方法を示した図で、lが2点間の距離で、dxがX方向の差を、dyがY方向の差を表しています。これをピタゴラスの定理に当てはめると、lが斜辺、dxとdyがその他の2辺です。2点の座標の位置関係によって、2つの辺の長さ(dxとdy)がマイナス(-)の値になることがありますが、これらの値は計算時に2乗するので、結果的に符号が無視され、正しい結果が得られます。
実際に、ソースコードに書かれている数値で、解説していきます。
006 007 008 009 010 011 012
// 1つ目の座標を代入 x1 = 60.0; y1 = 20.0; // 2つ目の座標を代入 x2 = 10.0; y2 = 40.0;
dxは、x2 - x1で計算しているので、dx= 10.0 - 60.0 = -50.0です。dyは、y2-y1で計算しているので、dy=40.0-20.0=20.0です。
2点間の距離lは、dxの2乗とdyの2乗を足した値の平方根なので、dxの2乗= -50.0 x -50.0 = 2500.0と、dyの2乗= 20.0 x 20.0 = 400.0を足した2500.0 + 400.0 = 2900.0の平方根53.85164807134504が、2点間の距離として計算されます。
以上です。
関連コンテンツ
円の中に含まれる格子の数と格子の外の数から円周率πを計算する方法を紹介しています。図とJavaのソースコードでくわしく説明していますので、興味のある方は記事をご覧ください。