2025.06.12

直線と点の距離

はじめに

(x1,y1)と(x2,y2)を通る直線と点(x,y)の距離dを求める方法を詳しく説明します。

線分と点の距離

直線と点の距離は、点から直線におろした垂線の長さです。

ここでは、直線と点の距離を求める一般的な公式を使わずに、(x1,y1)と(x2,y2)と(x,y)を頂点とする三角形の面積を利用して距離を計算する方法を使います。

直線と点の距離の計算方法

まず、3つの座標(x1,y1)と(x2,y2)と(x,y)を頂点とした三角形の各辺の長さを計算します。

辺aの長さ : (x1,y1)と(x2,y2)の直線距離
辺bの長さ : (x1,y1)と(x,y)の直線距離
辺cの長さ : (x2,y2)と(x,y)の直線距離

2つの座標直線距離は、「ピタゴラスの定理」で計算することができます。

3角形の頂点座標から辺の長さを計算

次に、辺aと辺bと辺cの長さを使って三角形の面積を求めます。この面積の計算には「ヘロンの公式」を使います。

ヘロンの公式

ヘロンの公式」は、三角形の3辺の長さから面積を計算する公式です。

下図は、3つの頂点座標から計算した辺の長さで面積Tを計算するイメージです。

3角形の頂点座標から面積を計算

最後に、計算した三角形の面積を辺aの長さで割って2倍すると、直線と点の距離dが求められます。

辺aは三角形底辺距離dは三角形の高さと考えることができるので、以下の式が成り立ちます。

三角形の面積T = a × d ÷ 2

これをdを計算する式にすると、

d = 三角形の面積T ÷ a × 2

となります。

この方法で、直線と点の距離を求めることができます。

Javaソースコード

以下は、ヘロンの公式を使って直線と点の距離を求めるJavaソースコードです。

DistanceHeron.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
037
038
039
040
041
042
043
044
045
046
047
048
049
050
051
052
053
054
055
056
057
058
059
060
061
062
063
064
065
066
067
068
069
070
071
072
073
074
075
076
077
078
079
080
081
082
083
084
085
086
087
088
089
090
091
092
093
094
095
096
097
098
099
100
101
102
103
104
public class DistanceHeron {
	// 3角形の3辺の長さa,b,cから面積を計算するメソッド
	private static double herons_formula( double a, double b, double c )
	{
		double s;	// s = ( a + b + c ) / 2
		double t;	// 面積
		double d;	// 作業用変数

		// 3辺のどれか1つでも0より小さければ-1.0を返す
		if ( ( 0.0 > a ) || ( 0.0 > b ) || ( 0.0 > c ) ) return -1.0;

		// sを計算
		s = ( a + b + c ) / 2.0;

		// s(s-a)(s-b)(s-c)を計算し、マイナスになれば-1.0を返す
		d = s * ( s - a ) * ( s - b ) * ( s - c );
		if ( 0.0 > d ) return -1.0;

		// 面積tを計算
		t = Math.sqrt( d );

		// 計算した面積tを返す
		return t;
	}


	// (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;
	}


	// (x1,y1)-(x2,y2)を通る直線と点(x,y)の直離を計算するメソッド
	private static double dist_ltop( double x1, double y1, double x2, double y2, double x, double y )
	{
		double a, b, c;	// 3辺の長さ
		double t;	// 3角形の面積
		double d;	// 求める距離
		double eps = 0.0000000000000000000000001;	// 0と判定する値(任意の値)

		// 3角形の各辺の長さを計算
		a = dist( x1, y1, x2, y2 );
		b = dist( x, y, x1, y1 );
		c = dist( x, y, x2, y2 );

		// 3角形の面積を計算
		t = herons_formula( a, b, c );
		if ( 0.0 > t ) return -1.0;

		// 直線と点の距離を計算
		if ( eps < a )
			d = t * 2.0 / a;	// 直線と点の距離を計算結果をdに代入
		else
			d = b;			// (x1,y1)と(x,y)の直線距離をdに代入

		return d;
	}


	// メイン
	public static void main( String[] args )
	{
		// 変数の宣言
		double x1, y1;	// 直線の1点目の座標
		double x2, y2;	// 直線の2点目の座標
		double x, y;	// 点の座標
		double d;	// 求める距離

		// 直線の1つめの座標(x1,y1)を代入
		x1 = 0.0;
		y1 = 10.0;

		// 直線の2つめの座標(x2,y2)を代入
		x2 = 10.0;
		y2 = 0.0;

		// 点の座標(x,y)を代入
		x = 10.0;
		y = 10.0;

		// 直線と点の距離を計算
		d = dist_ltop( x1, y1, x2, y2, x, y );
		if ( 0.0 > d ) {
			System.out.println( "3角形の面積計算に失敗しました" );
			return;
		}

		// 結果を出力
		System.out.println( d );
	}
}

実行結果

コンパイル ソースコードが「ANSI」の場合

C:\talavax\javasample>javac -encoding sjis DistanceHeron.java

コンパイル ソースコードが「UTF-8」の場合

C:\talavax\javasample>javac DistanceHeron.java

DistanceHeronを実行

C:\talavax\javasample>java DistanceHeron 
7.071067811865475

2つの座標(0,10)-(10,0)を通る直線と、点(10,10)の距離7.071067811865475で出力されました。

この距離は、下図のように正方形の対角線の長さの半分です。

対角線の長さは、

√(102+102) = √200 = 10√2

です。この値の半分の「5√2」が距離になります。

正方形の対角線の長さ

Javaソースコードの解説

ここからは、このソースコードを上から順番に解説していきます。

001
public class DistanceHeron {

クラス名を、DistanceHeronとしています。

002
003
004
	// 3角形の3辺の長さa,b,cから面積を計算するメソッド
	private static double herons_formula( double a, double b, double c )
	{

三角形の3辺の長さで面積を計算するherons_formulaメソッドを定義しています。

double型変数a,b,cで3つの辺の長さを与え、double型面積を返すメソッドです。

005
006
007
		double s;	// s = ( a + b + c ) / 2
		double t;	// 面積
		double d;	// 作業用変数

面積計算で使う変数を宣言しています。

009
010
		// 3辺のどれか1つでも0より小さければ-1.0を返す
		if ( ( 0.0 > a ) || ( 0.0 > b ) || ( 0.0 > c ) ) return -1.0;

与えられた3つの引数のうち1つでも0.0より小さい場合は、エラーとして-1.0を返しています。

012
013
		// sを計算
		s = ( a + b + c ) / 2.0;

ヘロンの公式で使うsを計算しています。

015
016
017
		// s(s-a)(s-b)(s-c)を計算し、マイナスになれば-1.0を返す
		d = s * ( s - a ) * ( s - b ) * ( s - c );
		if ( 0.0 > d ) return -1.0;

s,a,b,cをヘロンの公式平方根に渡す値dを計算しています。これは、平方根を計算するMath.sqrtメソッドにマイナスの値を渡さないようするためです。値がマイナスであれば-1.0を返すようにしています。

019
020
		// 面積tを計算
		t = Math.sqrt( d );

dの平方根を計算し、tに代入しています。このtの値が面積です。

Math.sqrtメソッド

public static double Math.sqrt( double a )
・引数aで指定した数値の平方根を返します。

  パラメータ a : 平方根を求める数値

  戻り値     aの平方根
022
023
		// 計算した面積tを返す
		return t;

計算した面積tをreturnで戻して終了です。

027
028
029
	// (x1,y1)-(x2,y2)の直線距離を計算するメソッド
	private static double dist( double x1, double y1, double x2, double y2 )
	{

次に、2つの座標(x1,y1)と(x2,y2)の直線距離を計算するdistメソッドを定義しています。

距離計算には、ピタゴラスの定理を使用しています。

030
031
		double l;
		double dx, dy;

距離計算で使う変数を宣言しています。

033
034
		// x座標の差を計算してdxに代入
		dx = x2 - x1;

2つのx座標の差を変数dxに代入しています。

035
036
		// y座標の差を計算してdyに代入
		dy = y2 - y1;

2つのy座標の差を変数dyに代入しています。

038
039
		// 2点間の距離を計算してlに代入
		l = Math.sqrt( dx * dx + dy * dy );

2つの座標直線距離を計算して変数lに代入しています。

下の図は、2つの座標間の距離を計算する方法を示した図で、l2点間の距離で、dxがX方向の差を、dyがY方向の差を表しています。これをピタゴラスの定理に当てはめると、lが斜辺、dxdyがその他の2辺です。2点の座標の位置関係によって、2つの辺の長さ(dxとdy)がマイナス(-)の値になることがありますが、これらの値は計算時に2乗するので、結果的に符号が無視され、正しい結果が得られます。

ピタゴラスの定理
041
042
		// 計算した距離を返す
		return l;

計算した距離lをreturn文で戻しています。

046
047
048
	// (x1,y1)-(x2,y2)を通る直線と点(x,y)の直離を計算するメソッド
	private static double dist_ltop( double x1, double y1, double x2, double y2, double x, double y )
	{

2つの座標(x1,y1)と(x2,y2)を通る直線と点(x,y)の距離を計算するdist_ltopメソッドを定義しています。

049
050
051
052
		double a, b, c;	// 3辺の長さ
		double t;	// 3角形の面積
		double d;	// 求める距離
		double eps = 0.0000000000000000000000001;	// 0と判定する値(任意の値)

距離計算に使用する変数を定義しています。

054
055
056
057
		// 3角形の各辺の長さを計算
		a = dist( x1, y1, x2, y2 );
		b = dist( x, y, x1, y1 );
		c = dist( x, y, x2, y2 );

三角形の各辺の長さa、b、cをdistメソッドで計算しています。

059
060
		// 3角形の面積を計算
		t = herons_formula( a, b, c );

ヘロンの公式」を使って面積を計算するherons_formulaメソッドに3辺の長さa、b、cを渡して面積を計算し、その結果を変数tに代入しています。

面積計算に失敗した場合、変数tの値は「-1.0」です。

061
		if ( 0.0 > t ) return -1.0;

変数tの値が、0.0未満かをif文条件式で判定しています。

0.0未満の場合は面積計算に失敗しているので、return文で-1.0を戻しています。

063
064
065
066
067
		// 直線と点の距離を計算
		if ( eps < a )
			d = t * 2.0 / a;	// 直線と点の距離を計算結果をdに代入
		else
			d = b;			// (x1,y1)と(x,y)の直線距離をdに代入

辺aの長さが0.0より大きい場合、三角形の面積Tと辺aの長さから距離dを計算しています。

距離d = 三角形の面積T ÷ a × 2

辺aの長さが0.0の場合は辺bの長さを距離dに代入しています。

直線距離

辺aの長さが0.0であるかの判定は、変数aが変数epsの値より大きいという条件を使っています。

あらかじめ変数epsに0.0と判定できる値を代入しています。これは、距離dの長さを計算する際に0.0で割り算をすることを防ぐためです。

epsの値は任意ですが、割り算でエラーにならない値に設定する必要があります。

073
074
075
	// メイン
	public static void main( String[] args )
	{

このmainメソッドからプログラムを実行します。

076
077
078
079
080
		// 変数の宣言
		double x1, y1;	// 直線の1点目の座標
		double x2, y2;	// 直線の2点目の座標
		double x, y;	// 点の座標
		double d;	// 求める距離

このプログラムで使う変数を宣言しています。

082
083
084
085
086
087
088
		// 直線の1つめの座標(x1,y1)を代入
		x1 = 0.0;
		y1 = 10.0;

		// 直線の2つめの座標(x2,y2)を代入
		x2 = 10.0;
		y2 = 0.0;

直線の2つの座標(x1,y1)と(x2,y2)の値を代入しています。

ここでは、(0,10)-(10,0)を代入しています。

090
091
092

		// 点の座標(x,y)を代入
		x = 10.0;
		y = 10.0;

点の座標(x,y)の値を代入しています。

ここでは、(10,10)を代入しています。

094
095
		// 直線と点の距離を計算
		d = dist_ltop( x1, y1, x2, y2, x, y );

直線と点の距離を求めるdist_ltopメソッドに、直線の2つの座標x1,y1)と(x2,y2)、点の座標(x,y)を渡して得られた距離を格納する変数dに代入しています。

096
097
098
099
		if ( 0.0 > d ) {
			System.out.println( "3角形の面積計算に失敗しました" );
			return;
		}

距離dが0.0未満の場合は計算に失敗しているので、printlnメソッドでエラーメッセージをコンソール出力して、returnによってmainメソッドを抜けています。

101
102
		// 結果を出力
		System.out.println( d );

printlnメソッド距離dを出力しています。

以上です。

関連コンテンツ

条件式を判断して処理を分岐する方法を詳しく説明しています。

2023.03.20

メソッドを抜けるときに使用するreturn文について説明しています。

2020.03.20

変数やクラスに格納されている値をコンソール出力する方法は?

2020.03.23

プログラムの最初に実行されるメソッドは?

2022.12.13

プログラミングで使う変数って何?

2020.03.23

Javaのプログラムを書いてみませんか?プログラムの書き方をくわしく説明しています。

2020.03.23

「Javaソースコード」から実行可能な「オブジェクトコード」に変換する方法をくわしく説明しています。

2020.03.23

Javaのプログラムを作ってみませんか?プログラミングに必要なものの用意から実行までを説明しています。

2020.03.23

Javaの学習に役立つソースコードを多数紹介しています。是非、ご覧ください。

2022.09.10

Swingパッケージを使ってグラフィック表示を行う方法を解説しています。

2020.03.23

画像フォーマット形式・色・大きさ・傾きなどの変更、特定の図形(文字・記号など)を見つけたり、取り出したりする画像処理について詳しく解説。

2015.11.29

繰り返し処理を使ったJavaのソースコードサンプルを紹介しています。

2020.03.23

配列を使うJavaソースコードを多数紹介しています。

2021.05.18

数学に関係するJavaのメソッドやソースコードなどを紹介しています。

2022.10.25

三角形、台形、円などいろいろな図形の面積を計算するプログラムを紹介しています。詳しくは、記事をご覧ください。

2021.05.18

StringクラスとStringBuilderクラスを利用したプログラミングの仕方を紹介しています。

2016.12.16

Javaを使った簡単な応用プログラム(生年月日から年齢を計算プログラムなど)を紹介しています。

2022.07.07

プログラミング、ITに関する用語をまとめています。

2022.10.17

日本で使われてきた伝統文様「和柄」について解説しています。

2022.07.27

2つの座標(x1,y1)と(x2,y2)の直線距離を求める計算式は?

2020.03.23

底辺と高さを使った三角形の面積を計算する方法を説明しています。図を使って詳しく解説しています。

2020.03.23

平面上の位置を表す座標系の1つXY座標系について詳しく解説。

2020.03.23

三角形って何?

2022.07.26

ピタゴラスの定理は、直角三角形の三辺の長さの関係を表すもので、2つの座標間の距離計算などに利用できます。興味がある方は、記事をご覧ください。

2020.03.23

ヘロンの公式は、三角形の3つの辺の長さから面積を計算する公式です。この公式を使って三角形の面積を計算するjavaソースコードを紹介しています。

2020.03.23

面積について詳しく解説しています。いろいろな図形の面積計算のリンク付き。

2019.10.7

二等辺三角形の面積、周長、内角、等辺、頂角について説明しています。興味のある方は、記事をご覧ください。

2020.03.23

プログラミング言語とは?種類や特徴について説明しています。

2022.08.03

正方形の面積、周の長さ、関連する記事を紹介しています。興味のある方は、ご覧ください。

2020.03.23

Javaプログラムの構成について解説しています。詳しくは、こちらをご覧ください。

2020.03.23

メソッドの定義方法を詳しく解説しています。Javaのサンプルソースコードを使った説明もあります。

2020.03.23

平方根の意味と、Math.sqrtメソッドの使い方をソースコードを使って詳しく解説しています。

2020.03.23

for文で変数名iがよく使われる理由について説明しています。興味のある方は是非。

2022.08.29

値の2乗を計算するメソッドの作り方を解説しています。

2020.03.23

Javaの演算子'/'を使って割り算を行った結果と注意点などについて説明。

2020.03.23

「ゆるゆるプログラム」のコンテンツを紹介しています。興味のある方はこの記事をご覧ください。

2020.03.23

広告