直線の表し方(一般形か傾き切片形か)を選び、係数と点の座標を入力してください。下の数式は入力欄と連動していて、数式の数字を直接書き換えても計算できます。
このページでできること
- 点 \(\mathrm{P}(x_0,\ y_0)\) と直線 \(ax + by + c = 0\) の距離(点から直線に下ろした垂線の長さ=最短距離)を、係数と座標を入れるだけでその場で計算できます
- 答えは \(\dfrac{7\sqrt{5}}{5}\) のように分母を有理化した厳密値と、小数(有効12桁)の両方で表示します
- 距離だけでなく、垂線の足 \(\mathrm{H}\)(直線上で点 \(\mathrm{P}\) に最も近い点)の座標と、垂線そのものの式も求められます
- 直線は一般形 \(ax + by + c = 0\) と傾き切片形 \(y = mx + k\) のどちらでも入力できます(傾き切片形のときは一般形に直す途中式も表示します)
- 平行な2直線 \(ax + by + c_1 = 0\) と \(ax + by + c_2 = 0\) の距離も同じ画面で計算できます
- 計算結果は座標平面の図でも確認できます。公式のやさしい解説・Excel/Googleスプレッドシート/Python用のコピペ数式・計算ドリル(演習問題)もこのページにまとまっています
この計算は何の役に立つ?
スマートフォンやカーナビが受け取る位置情報には数メートルから数十メートルの誤差があり、そのまま点を打つと建物の中や田んぼの真ん中に表示されてしまいます。そこで地図アプリは、測った点と周辺の道路(地図の上では線分の集まり)との距離を片っ端から計算し、一番近い道路の上に点を載せ直しています。この処理はマップマッチングと呼ばれ、その中心にあるのが点と直線の距離の計算です。
垂線の足の座標まで求めれば「その道路上のどこにいるか」まで決まるので、残り何メートルで交差点か、といった案内もできるようになります。
建築の図面には通り芯、道路や鉄道の設計には中心線という基準の直線が引かれていて、柱・壁・縁石・杭の位置は「基準線からどれだけ離れているか」で指定されます。この離れ(オフセット)はまさに点と直線の距離で、現場ではトータルステーションなどで測った座標から計算し、設計値とのずれを確認します。
道路の中心線から幅員の半分だけ離れた位置に縁石を並べる、といった作業も、同じ計算の繰り返しで位置を決めています。
サポートベクターマシンという分類の手法は、2つのグループのデータを分ける直線(高次元では平面)を引くとき、「どちらのグループのデータ点からもできるだけ遠い」直線を選びます。この「遠さ」を測っているのが、まさに点と直線の距離です。すき間(マージン)を最大にする直線を選ぶことで、まだ見ていないデータに対しても間違えにくい境界になると考えられています。
迷惑メールの判定や画像の分類など、深層学習が広まる前から使われてきた定番の手法で、今でも学習データが少ない場面では有力な選択肢です。
自動運転の車線認識や、書類をスキャンしたときの傾き補正では、画像から検出した点の集まりに「一番よく当てはまる直線」を引きます。当てはまりの良さは、各点とその直線との距離の2乗を合計した値で測り、これが最小になる直線を選びます。
外れ値を除きながら直線を当てはめるRANSACという手法でも、「その直線からの距離が一定以内にある点を仲間と数える」という形で点と直線の距離が使われています。
地図アプリで縮尺を小さくすると、海岸線や道路の細かい凹凸が自動的に省かれます。このとき使われるのがラマー・ダグラス・ポイカー法という手法で、折れ線の両端を結ぶ直線からの距離が一番大きい点を探し、その距離が決めた値より小さければ間の点をまとめて省く、という判断を繰り返します。
データ量を大きく減らしても見た目の形が崩れないのは、「直線からどれだけ外れているか」を距離できちんと測っているからです。
式と図
用語・記号の解説
記号
| \(d\) | ディー | 距離を表すのによく使われる文字。distance(距離)の頭文字です。このページでは、点と直線の距離(=垂線の長さ)を表します。 |
| \(a,\ b,\ c\) | エー・ビー・シー | 直線の式 \(ax + by + c = 0\) の係数。\(a\) は \(x\) に付く数、\(b\) は \(y\) に付く数、\(c\) は数字だけの項(定数項)です。「決まった数」を表すときはアルファベットの最初の方の文字を使う慣例があります。 |
| \(x_0,\ y_0\) | エックス・ゼロ、ワイ・ゼロ | 距離を測りたい点 \(\mathrm{P}\) の座標。右下に小さく書く 0 は添え字で、「動く変数 \(x\) ではなく、ある特定の1点の座標」を表すために付けています。 |
| \(\mathrm{P},\ \mathrm{H},\ \mathrm{A}\) | ピー・エイチ・エー | 点に付ける名前。\(\mathrm{P}\) は point(点)、\(\mathrm{H}\) は垂線の足に使う慣例の文字で、真下に下ろす意味の Height(高さ)や Foot の位置づけで使われます。\(\mathrm{A}\) は直線上にとった補助の点です。 |
| \(\left|\ \right|\) | ぜったいち | 絶対値の記号。中身が正ならそのまま、負なら符号を取り去った値になります(\(|-7| = 7\))。距離はマイナスにならないので、公式では代入した値を絶対値にします。 |
| \(\sqrt{\ }\) | ルート | 平方根(2乗するとその数になる、0以上の数)を表す記号。\(\sqrt{5}\) は2乗すると 5 になる数です。root(根)の頭文字 r を変形した形に由来するといわれます。 |
| \(\vec{n}\) | エヌ・ベクトル | 法線ベクトル。直線に垂直な向きを表すベクトルで、normal(法線・垂直)の頭文字 n を使います。直線 \(ax + by + c = 0\) では \(\vec{n} = (a,\ b)\) です。 |
| \(\left|\vec{n}\right|\) | エヌ・ベクトルのおおきさ | ベクトルの大きさ(矢印の長さ)。\(\vec{n} = (a,\ b)\) なら \(|\vec{n}| = \sqrt{a^2 + b^2}\) で、これが距離の公式の分母です。 |
| \(\vec{n}\cdot\overrightarrow{\mathrm{AP}}\) | ないせき | 2つのベクトルの内積。成分どうしを掛けて足した値(\((a,\ b)\) と \((p,\ q)\) なら \(ap + bq\))で、2つの向きがどれだけそろっているかを表します。中黒(・)は掛け算とは別の演算を表す記号です。 |
| \(t\) | ティー | 点 \(\mathrm{P}\) から法線ベクトル何個分だけ進めば直線に届くかを表す倍率。「動かせる量」を表す文字として、時間を表す time の頭文字 \(t\) がそのまま使われます。 |
| \(m,\ k\) | エム・ケー | 傾き切片形 \(y = mx + k\) の傾きと切片。\(m\) は傾きを表す文字として世界的に使われています。切片は日本の教科書では \(b\) と書くことが多いのですが、このページでは一般形の \(b\) と紛らわしいので \(k\) を使っています。 |
| \(c_1,\ c_2\) | シー・イチ、シー・ニ | 平行な2直線それぞれの定数項。右下の小さい数字は添え字で、「1本目」「2本目」を区別するための番号です。 |
| \(\ell_1,\ \ell_2\) | エル・イチ、エル・ニ | 直線に付ける名前。直線を表す文字には line(直線)の頭文字 l の筆記体 \(\ell\) を使う慣例があります。 |
用語
| 点と直線の距離 | てんとちょくせんのきょり | 点から直線に下ろした垂線の長さのこと。直線上のどの点までの長さよりも短いので、点と直線の「最短距離」でもあります。高校では数学IIの図形と方程式で学びます。 |
| 垂線 | すいせん | ある直線に垂直に交わるように引いた直線・線分のこと。点から直線に垂線を下ろすと、その長さが点と直線の距離になります。 |
| 垂線の足 | すいせんのあし | 点から下ろした垂線が、もとの直線と交わる点のこと。直線上で、その点に一番近い場所です。 |
| 一般形 | いっぱんけい | 直線の式を \(ax + by + c = 0\) の形で書いた表し方。\(y\) 軸に平行な直線(\(x = 3\) など)も書けるので、すべての直線を同じ形で扱えます。 |
| 傾き切片形 | かたむきせっぺんけい | 直線の式を \(y = mx + k\) の形で書いた表し方。傾きと \(y\) 軸との交点がひと目でわかる反面、\(y\) 軸に平行な直線は書けません。 |
| 法線ベクトル | ほうせんベクトル | 直線(や平面)に垂直な向きを表すベクトル。直線 \(ax + by + c = 0\) の法線ベクトルは \((a,\ b)\) です。点と直線の距離の公式は、この法線ベクトルの向きに測った長さを求めています。 |
| 内積 | ないせき | 2つのベクトルから1つの数を作る計算。成分どうしを掛けて足したもの(\((a,\ b)\cdot(p,\ q) = ap + bq\))で、\(|\vec{u}||\vec{v}|\cos\theta\) とも等しくなります。値が 0 なら2つのベクトルは垂直です。 |
| 正射影 | せいしゃえい | あるベクトルを、別のベクトルの向きに真上から光を当てて落とした影のこと。点と直線の距離は、\(\overrightarrow{\mathrm{AP}}\) を法線ベクトルの向きに落とした影の長さにあたります。 |
| 絶対値 | ぜったいち | 数から符号を取り去った大きさ。数直線上で0からの距離にあたります(\(|-7| = 7\)、\(|7| = 7\))。距離は負にならないので、公式では絶対値を使います。 |
| 有理化 | ゆうりか | 分母に残った根号を、分母と分子に同じ数を掛けて消すこと。\(\dfrac{7}{\sqrt{5}}\) の分母と分子に \(\sqrt{5}\) を掛けて \(\dfrac{7\sqrt{5}}{5}\) にする操作です。中学3年で学び、高校の答案でも有理化した形にそろえるのが慣例です。 |
| 平行 | へいこう | 2直線が交わらない(どこまで延ばしてもぶつからない)関係のこと。一般形 \(a_1x + b_1y + c_1 = 0\)、\(a_2x + b_2y + c_2 = 0\) では、\(x\) と \(y\) の係数の比が等しいとき(式で書くと \(a_1b_2 - a_2b_1 = 0\))に平行または一致になり、定数項まで同じ比なら2直線は重なります。 |
| 対称点 | たいしょうてん | ある直線について、鏡に映したように折り返した点のこと。垂線の足 \(\mathrm{H}\) がわかれば、点 \(\mathrm{P}\) の対称点は \(2\mathrm{H} - \mathrm{P}\) で求められます。 |
| 座標平面 | ざひょうへいめん | \(x\) 軸と \(y\) 軸を引いて、平面上の点を \((x,\ y)\) の組で表せるようにした平面のこと。図形の問題を式の計算に置き換えられるのが利点です。 |
前提として理解しておくといいこと
このページの計算を「意味がわかって」使えるようになるために、前提として理解しておくといいことをまとめました。
つまずいたら、この表の内容に戻って復習するのが近道です。
| 座標平面と点の座標(中学1〜2年) |
|
| 直線の式(中学2年〜高校 数学II) |
|
| 平方根と有理化(中学3年) |
|
| 絶対値(中学1年〜高校 数学I) |
|
| 三平方の定理と2点間の距離(中学3年〜高校 数学II) |
|
| ベクトルと内積(高校 数学C) |
|
Excelで計算する方法
| x の係数 a | 1 |
| y の係数 b | 2 |
| 定数項 c | -3 |
| 点 P の x 座標 | 4 |
| 点 P の y 座標 | 3 |
| 分子 |a*x0+b*y0+c| | =ABS(B1*B4+B2*B5+B3) |
| 分母 √(a^2+b^2) | =SQRT(B1^2+B2^2) |
| 距離 d | =B6/B7 |
| x の係数 a | 1 |
| y の係数 b | 2 |
| 直線上の点 A の x 座標 | 3 |
| 直線上の点 A の y 座標 | 0 |
| 点 P の x 座標 | 4 |
| 点 P の y 座標 | 3 |
| 内積 n・AP | =B1*(B5-B3)+B2*(B6-B4) |
| 法線ベクトルの大きさ |n| | =SQRT(B1^2+B2^2) |
| 距離 d | =ABS(B7)/B8 |
| 傾き m | 2 |
| 切片 k | 1 |
| 点 P の x 座標 | 4 |
| 点 P の y 座標 | 3 |
| 距離 d | =ABS(B1*B3-B4+B2)/SQRT(B1^2+1) |
| x の係数 a | 1 |
| y の係数 b | 2 |
| 定数項 c | -3 |
| 点 P の x 座標 | 4 |
| 点 P の y 座標 | 3 |
| 倍率 t | =(B1*B4+B2*B5+B3)/(B1^2+B2^2) |
| H の x 座標 | =B4-B1*B6 |
| H の y 座標 | =B5-B2*B6 |
| x の係数 a | 1 |
| y の係数 b | 2 |
| 1本目の定数項 c1 | -3 |
| 2本目の定数項 c2 | 7 |
| 距離 d | =ABS(B3-B4)/SQRT(B1^2+B2^2) |
「^」はべき乗、ABS は絶対値、SQRT は平方根を求める関数です。
1つ目の表は点(4, 3)と直線 x + 2y - 3 = 0 の例で、分子が 7、分母が約 2.2360679775、距離が約 3.1304951685 になります。
2つ目の表は、同じ距離が「法線ベクトルと AP の内積 ÷ 法線ベクトルの大きさ」でも求まることを確かめる表で、内積は 7、距離は1つ目の表と同じ約 3.1304951685 になります。
3つ目の表は点(4, 3)と直線 y = 2x + 1 の例で、距離は約 2.683281573 です。
4つ目の表の答えは 1.4 と 2.6 と 0.2 で、垂線の足が(2.6, 0.2)=(13/5, 1/5)だとわかります。
5つ目の表は x + 2y - 3 = 0 と x + 2y + 7 = 0 の距離で、答えは約 4.472135955 です。
Googleスプレッドシートで計算する方法
| x の係数 a | 1 |
| y の係数 b | 2 |
| 定数項 c | -3 |
| 点 P の x 座標 | 4 |
| 点 P の y 座標 | 3 |
| 分子 |a*x0+b*y0+c| | =ABS(B1*B4+B2*B5+B3) |
| 分母 √(a^2+b^2) | =SQRT(B1^2+B2^2) |
| 距離 d | =B6/B7 |
| x の係数 a | 1 |
| y の係数 b | 2 |
| 直線上の点 A の x 座標 | 3 |
| 直線上の点 A の y 座標 | 0 |
| 点 P の x 座標 | 4 |
| 点 P の y 座標 | 3 |
| 内積 n・AP | =B1*(B5-B3)+B2*(B6-B4) |
| 法線ベクトルの大きさ |n| | =SQRT(B1^2+B2^2) |
| 距離 d | =ABS(B7)/B8 |
| 傾き m | 2 |
| 切片 k | 1 |
| 点 P の x 座標 | 4 |
| 点 P の y 座標 | 3 |
| 距離 d | =ABS(B1*B3-B4+B2)/SQRT(B1^2+1) |
| x の係数 a | 1 |
| y の係数 b | 2 |
| 定数項 c | -3 |
| 点 P の x 座標 | 4 |
| 点 P の y 座標 | 3 |
| 倍率 t | =(B1*B4+B2*B5+B3)/(B1^2+B2^2) |
| H の x 座標 | =B4-B1*B6 |
| H の y 座標 | =B5-B2*B6 |
| x の係数 a | 1 |
| y の係数 b | 2 |
| 1本目の定数項 c1 | -3 |
| 2本目の定数項 c2 | 7 |
| 距離 d | =ABS(B3-B4)/SQRT(B1^2+B2^2) |
Pythonで計算する方法
from fractions import Fraction
# 直線 ax + by + c = 0(3/4 のような分数は Fraction(3, 4) と書ける)
a = Fraction(1)
b = Fraction(2)
c = Fraction(-3)
# 点 P の座標
x0 = Fraction(4)
y0 = Fraction(3)
# 点の座標を式に代入した値(符号付き)と、法線ベクトルの大きさの2乗
substituted = a * x0 + b * y0 + c
square = a * a + b * b
distance = abs(float(substituted)) / float(square) ** 0.5
print(f"分子 |a*x0+b*y0+c| = {abs(substituted)}")
print(f"分母 √(a^2+b^2) = √{square}")
print(f"距離 d = {distance}")
# 垂線の足 H(法線ベクトルの向きに t 倍だけ戻った点)
t = substituted / square
foot_x = x0 - a * t
foot_y = y0 - b * t
print(f"倍率 t = {t}")
print(f"垂線の足 H = ({foot_x}, {foot_y})")
数式記述言語(LaTeX等)での書き方(コピペ可)
d = |a·x₀ + b·y₀ + c| ÷ √(a² + b²)
d = \frac{\left|a x_0 + b y_0 + c\right|}{\sqrt{a^{2} + b^{2}}}
<math xmlns="http://www.w3.org/1998/Math/MathML" display="block">
<mrow>
<mi>d</mi>
<mo>=</mo>
<mfrac>
<mrow>
<mo>|</mo>
<mi>a</mi><msub><mi>x</mi><mn>0</mn></msub>
<mo>+</mo>
<mi>b</mi><msub><mi>y</mi><mn>0</mn></msub>
<mo>+</mo>
<mi>c</mi>
<mo>|</mo>
</mrow>
<msqrt>
<mrow>
<msup><mi>a</mi><mn>2</mn></msup>
<mo>+</mo>
<msup><mi>b</mi><mn>2</mn></msup>
</mrow>
</msqrt>
</mfrac>
</mrow>
</math>
d = abs(a*x_0 + b*y_0 + c)/sqrt(a^2 + b^2)
d = Abs[a x0 + b y0 + c]/Sqrt[a^2 + b^2]
d := abs(a*x0 + b*y0 + c)/sqrt(a^2 + b^2);
d = abs(a*x0 + b*y0 + c)/sqrt(a^2 + b^2);
d = |a x_0+b y_0+c|/√(a^2+b^2)
d = |n・AP| ÷ |n|
d = \frac{\left|\vec{n}\cdot\overrightarrow{\mathrm{AP}}\right|}{\left|\vec{n}\right|}
<math xmlns="http://www.w3.org/1998/Math/MathML" display="block">
<mrow>
<mi>d</mi>
<mo>=</mo>
<mfrac>
<mrow>
<mo>|</mo>
<mover><mi>n</mi><mo>→</mo></mover>
<mo>⋅</mo>
<mover><mrow><mi>A</mi><mi>P</mi></mrow><mo>→</mo></mover>
<mo>|</mo>
</mrow>
<mrow>
<mo>|</mo>
<mover><mi>n</mi><mo>→</mo></mover>
<mo>|</mo>
</mrow>
</mfrac>
</mrow>
</math>
d = abs(vec n * vec(AP))/abs(vec n)
d = Abs[n . ap]/Norm[n]
d := abs(DotProduct(n, ap))/Norm(n, 2);
d = abs(dot(n, ap))/norm(n);
d = |n\vec ∙AP\vec |/|n\vec |
d = |m·x₀ − y₀ + k| ÷ √(m² + 1)
d = \frac{\left|m x_0 - y_0 + k\right|}{\sqrt{m^{2} + 1}}
<math xmlns="http://www.w3.org/1998/Math/MathML" display="block">
<mrow>
<mi>d</mi>
<mo>=</mo>
<mfrac>
<mrow>
<mo>|</mo>
<mi>m</mi><msub><mi>x</mi><mn>0</mn></msub>
<mo>−</mo>
<msub><mi>y</mi><mn>0</mn></msub>
<mo>+</mo>
<mi>k</mi>
<mo>|</mo>
</mrow>
<msqrt>
<mrow>
<msup><mi>m</mi><mn>2</mn></msup>
<mo>+</mo>
<mn>1</mn>
</mrow>
</msqrt>
</mfrac>
</mrow>
</math>
d = abs(m*x_0 - y_0 + k)/sqrt(m^2 + 1)
d = Abs[m x0 - y0 + k]/Sqrt[m^2 + 1]
d := abs(m*x0 - y0 + k)/sqrt(m^2 + 1);
d = abs(m*x0 - y0 + k)/sqrt(m^2 + 1);
d = |m x_0-y_0+k|/√(m^2+1)
H = (x₀ − t·a, y₀ − t·b) t = (a·x₀ + b·y₀ + c) ÷ (a² + b²)
\mathrm{H} = \left(x_0 - t a,\ y_0 - t b\right),\quad t = \frac{a x_0 + b y_0 + c}{a^{2} + b^{2}}
<math xmlns="http://www.w3.org/1998/Math/MathML" display="block">
<mrow>
<mi mathvariant="normal">H</mi>
<mo>=</mo>
<mo>(</mo>
<mrow><msub><mi>x</mi><mn>0</mn></msub><mo>−</mo><mi>t</mi><mi>a</mi></mrow>
<mo>,</mo>
<mrow><msub><mi>y</mi><mn>0</mn></msub><mo>−</mo><mi>t</mi><mi>b</mi></mrow>
<mo>)</mo>
<mo>,</mo>
<mi>t</mi>
<mo>=</mo>
<mfrac>
<mrow>
<mi>a</mi><msub><mi>x</mi><mn>0</mn></msub>
<mo>+</mo>
<mi>b</mi><msub><mi>y</mi><mn>0</mn></msub>
<mo>+</mo>
<mi>c</mi>
</mrow>
<mrow>
<msup><mi>a</mi><mn>2</mn></msup>
<mo>+</mo>
<msup><mi>b</mi><mn>2</mn></msup>
</mrow>
</mfrac>
</mrow>
</math>
H = (x_0 - t*a, y_0 - t*b), t = (a*x_0 + b*y_0 + c)/(a^2 + b^2)
t = (a x0 + b y0 + c)/(a^2 + b^2); h = {x0 - t a, y0 - t b}
t := (a*x0 + b*y0 + c)/(a^2 + b^2); H := [x0 - t*a, y0 - t*b];
t = (a*x0 + b*y0 + c)/(a^2 + b^2); H = [x0 - t*a, y0 - t*b];
H = (x_0-t a, y_0-t b), t = (a x_0+b y_0+c)/(a^2+b^2)
d = |c₁ − c₂| ÷ √(a² + b²)
d = \frac{\left|c_1 - c_2\right|}{\sqrt{a^{2} + b^{2}}}
<math xmlns="http://www.w3.org/1998/Math/MathML" display="block">
<mrow>
<mi>d</mi>
<mo>=</mo>
<mfrac>
<mrow>
<mo>|</mo>
<msub><mi>c</mi><mn>1</mn></msub>
<mo>−</mo>
<msub><mi>c</mi><mn>2</mn></msub>
<mo>|</mo>
</mrow>
<msqrt>
<mrow>
<msup><mi>a</mi><mn>2</mn></msup>
<mo>+</mo>
<msup><mi>b</mi><mn>2</mn></msup>
</mrow>
</msqrt>
</mfrac>
</mrow>
</math>
d = abs(c_1 - c_2)/sqrt(a^2 + b^2)
d = Abs[c1 - c2]/Sqrt[a^2 + b^2]
d := abs(c1 - c2)/sqrt(a^2 + b^2);
d = abs(c1 - c2)/sqrt(a^2 + b^2);
d = |c_1-c_2|/√(a^2+b^2)
ChatGPT に聞いて計算してもらう方法
あなたは数学(図形と方程式)の計算アシスタントです。次の計算を、必ずPythonコードを実際に実行して行い、実行結果の数値だけを根拠に回答してください(暗算や推測で答えないでください)。 点(4, 3)と直線 x + 2y - 3 = 0 について、次を求めてください。 1. 点と直線の距離(分母を有理化した厳密値と、小数の両方で) 2. 点から直線に下ろした垂線の足の座標(約分した分数で) 3. その垂線(点を通り直線に垂直な直線)の式 Pythonでは標準ライブラリの fractions モジュールと sympy を使って厳密に計算し、計算に使った式と実行結果の数値を示してください。
計算ドリル(演習問題)
このページの式を、自分の手で計算できるようになるための演習問題です。
答えと解説は解答ページにあります。
使い方
-
1数値を入力計算したい数値を入力欄に入力します
-
2計算「計算する」ボタンを押します
-
3結果を確認計算結果がその場に表示されます。計算の考え方や式の解説も同じページで確認できます
DataChefの特徴
専門知識不要、直感的で簡単な操作
個人情報を登録することなく使用できます
「ダウンロード」押下でファイルを自動削除
クレジット表記不要
商用利用許諾の連絡も不要です
