請選擇直線的寫法(一般式或斜截式),再輸入係數和點的坐標。下方的數學式和輸入欄是連動的,直接改寫式中的數字也能計算。
這個頁面可以做什麼
- 只要輸入係數和坐標,就能當場算出點 \(\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\) 輸入(用斜截式時,也會顯示化成一般式的過程)
- 兩條平行直線 \(ax + by + c_1 = 0\) 和 \(ax + by + c_2 = 0\) 的距離,也能在同一個畫面計算
- 計算結果也能在坐標平面的圖上確認。淺顯易懂的公式解說,以及可直接複製到 Excel、Google 試算表、Python 的公式,也都整理在這個頁面
這個計算有什麼用?
手機或汽車導航收到的定位資訊,有數公尺到數十公尺的誤差。如果直接把那個點畫出來,可能會顯示在建築物裡或稻田中間。所以地圖 App 會計算測得的點到附近每條道路(在地圖上是一連串線段)的距離,再把點移到最近的道路上。這叫做地圖匹配(map matching),核心就是點到直線的距離。
如果再求出垂足,就能知道您正在那條路的哪個位置,也就能告訴您距離下一個轉彎還有多遠。
建築圖面上有柱中心線(軸線),道路和鐵路的設計有中心線等基準直線,柱子、牆壁、路緣石和樁的位置,都以「離基準線多遠」來指定。這個距離正是點到直線的距離。在工地,測量人員會用全站儀測得的坐標算出這個距離,再和設計值比對。
把路緣石放在離中心線半個路寬的位置,也就是沿著道路一再重複這個計算。
一種叫做支援向量機(SVM)的分類方法,會在兩群資料之間畫一條線(高維度時是平面)。它會選擇離兩群資料點都盡量遠的線,而這個「多遠」就是點到直線的距離。一般認為,選擇間隔(margin)最寬的線,對還沒看過的資料比較不容易出錯。
在深度學習普及之前,它就是垃圾郵件過濾和影像分類的標準方法,訓練資料少的時候至今仍是很有力的選擇。
自動駕駛的車道辨識,以及掃描文件時的傾斜校正,都需要找出最符合一群偵測點的直線。直線配合得好不好,是把每個點到直線的距離平方後相加來衡量,選出總和最小的那條直線。
RANSAC 這種忽略離群值來配合直線的方法,也是用點到直線的距離來判斷:離直線在一定距離以內的點,就算是符合這條直線。
在地圖 App 把畫面縮小時,海岸線和道路細小的彎曲會自動省略。這用的是 Ramer–Douglas–Peucker 演算法:找出離「連接路徑兩端的直線」最遠的點,若那個距離小於設定的上限,就把中間的點全部省略;若沒有,就在那個點把路徑切開,再重複同樣的檢查。
資料量大幅減少,形狀卻依然正確,是因為這個演算法用正確的距離衡量每個點「偏離直線多遠」。
公式與圖示
符號與用語解說
符號
| \(d\) | d | 常用來表示距離的字母,取自 distance(距離)的字首。本頁表示點到直線的距離(=垂線的長度)。 |
| \(a,\ b,\ c\) | a、b、c | 直線方程式 \(ax + by + c = 0\) 的係數。\(a\) 是 \(x\) 前面的數,\(b\) 是 \(y\) 前面的數,\(c\) 是只有數字的項(常數項)。固定的數習慣用字母表前面的字母表示。 |
| \(x_0,\ y_0\) | x 零、y 零 | 要量距離的點 \(\mathrm{P}\) 的坐標。右下角的小 0 是下標,用來表示「不是會變動的變數 \(x\),而是某個特定點的坐標」。 |
| \(\mathrm{P},\ \mathrm{H},\ \mathrm{A}\) | P、H、A | 點的名稱。\(\mathrm{P}\) 取自 point(點),\(\mathrm{H}\) 是習慣上用來表示垂足的字母(可聯想成高 height 的垂足),\(\mathrm{A}\) 是在直線上取的輔助點。 |
| \(\left|\ \right|\) | 絕對值 | 絕對值的符號。裡面是正數就不變,是負數就去掉負號(\(|-7| = 7\))。距離不會是負的,所以公式中會把代入後的值取絕對值。 |
| \(\sqrt{\ }\) | 根號 | 表示平方根(平方後等於裡面的數、且大於或等於 0 的數)的符號。\(\sqrt{5}\) 是平方後等於 5 的數。據說這個符號來自 radix(根)的字首 r 拉長的形狀。 |
| \(\vec{n}\) | 向量 n | 法向量:表示與直線垂直方向的向量,取 normal(法線、垂直)的字首 n。直線 \(ax + by + c = 0\) 的法向量是 \(\vec{n} = (a,\ b)\)。 |
| \(\left|\vec{n}\right|\) | 向量 n 的長度 | 向量的長度(箭頭的長度)。\(\vec{n} = (a,\ b)\) 時 \(|\vec{n}| = \sqrt{a^2 + b^2}\),這就是距離公式的分母。 |
| \(\vec{n}\cdot\overrightarrow{\mathrm{AP}}\) | 內積 | 兩個向量的內積:把對應的分量相乘再相加(\((a,\ b)\) 和 \((p,\ q)\) 就是 \(ap + bq\)),表示兩個方向有多一致。中間的點是和一般乘法不同的運算符號。 |
| \(t\) | t | 表示從點 \(\mathrm{P}\) 走幾個法向量才會到達直線的倍率。像這樣會變動的數,習慣用 \(t\)(取自 time)表示。 |
| \(m,\ k\) | m、k | 斜截式 \(y = mx + k\) 的斜率與 y 截距。\(m\) 是世界通用的斜率符號。y 截距在課本上常寫成 \(b\)(\(y = mx + b\)),但本頁為了不和一般式的 \(b\) 混淆,使用 \(k\)。 |
| \(c_1,\ c_2\) | c 1、c 2 | 兩條平行線各自的常數項。右下角的小數字是下標,用來區分「第 1 條」「第 2 條」。 |
| \(\ell_1,\ \ell_2\) | l 1、l 2 | 直線的名稱。表示直線的字母,習慣用 line(直線)的字首 l 的草寫體 \(\ell\)。 |
用語
| 點到直線的距離 | 從點到直線所作垂線的長度。它比到直線上其他任何點的長度都短,所以也是點與直線的「最短距離」。在高中數學的坐標幾何學習。 |
| 垂線 | 與某條直線垂直相交的直線或線段。從點到直線作垂線,垂線的長度就是點到直線的距離。 |
| 垂足 | 從點所作的垂線與原直線的交點,也是直線上離那個點最近的地方。 |
| 一般式 | 把直線方程式寫成 \(ax + by + c = 0\) 的形式。與 \(y\) 軸平行的直線(例如 \(x = 3\))也能寫,所以所有直線都能用同一個形式處理。 |
| 斜截式 | 把直線方程式寫成 \(y = mx + k\) 的形式(課本上常寫成 \(y = mx + b\))。斜率和與 \(y\) 軸的交點一目了然,但與 \(y\) 軸平行的直線無法這樣寫。 |
| 法向量 | 表示與直線(或平面)垂直方向的向量。直線 \(ax + by + c = 0\) 的法向量是 \((a,\ b)\)。點到直線的距離公式,就是在求沿著這個法向量方向量出的長度。 |
| 內積 | 由兩個向量算出一個數的計算:對應分量相乘再相加(\((a,\ b)\cdot(p,\ q) = ap + bq\)),也等於 \(|\vec{u}||\vec{v}|\cos\theta\)。值為 0 時兩個向量垂直。 |
| 正射影 | 把一個向量沿另一個向量的方向垂直投影所得的影子。點到直線的距離,就是 \(\overrightarrow{\mathrm{AP}}\) 投影到法向量方向的影子長度。 |
| 絕對值 | 去掉正負號後的大小,相當於數線上與 0 的距離(\(|-7| = 7\),\(|7| = 7\))。距離不會是負的,所以公式中使用絕對值。 |
| 分母有理化 | 把分子和分母乘上相同的數,消去分母中的根號。例如把 \(\dfrac{7}{\sqrt{5}}\) 的分子和分母都乘以 \(\sqrt{5}\),得到 \(\dfrac{7\sqrt{5}}{5}\)。台灣在國中八年級學習,答案習慣寫成這種形式。 |
| 平行 | 兩直線不相交(不論延長多遠都不會碰到)的關係。對 \(a_1x + b_1y + c_1 = 0\) 和 \(a_2x + b_2y + c_2 = 0\) 來說,\(x\) 和 \(y\) 係數的比相等(寫成式子是 \(a_1b_2 - a_2b_1 = 0\))時,兩直線平行或重合。常數項的比也相同時,兩直線重合。 |
| 對稱點 | 對某條直線像照鏡子一樣翻折過去的點。知道垂足 \(\mathrm{H}\) 之後,點 \(\mathrm{P}\) 的對稱點可以用 \(2\mathrm{H} - \mathrm{P}\) 求出。 |
| 坐標平面 | 畫出 \(x\) 軸和 \(y\) 軸,讓平面上的點能用 \((x,\ y)\) 表示的平面。好處是能把幾何問題轉換成式子的計算。 |
建議先了解的基礎知識
為了讓您「理解意義」地使用本頁的計算,這裡整理了事先了解會更好懂的基礎知識。
遇到卡關時,回頭複習這些內容是最快的捷徑。
| 坐標平面與點的坐標(國中七年級,12~13 歲) |
|
| 直線方程式(國中八年級~高中一年級,13~16 歲) |
|
| 平方根與分母有理化(國中八年級,13~14 歲) |
|
| 絕對值(國中七年級,12~13 歲) |
|
| 畢氏定理與兩點距離(國中八年級~高中一年級,13~16 歲) |
|
| 向量與內積(高中二年級,16~17 歲) |
|
用 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 |
| y 截距 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 是求平方根。
第一個表格是點 (4, 3) 和直線 x + 2y - 3 = 0 的例子,分子是 7,分母約 2.2360679775,距離約 3.1304951685。
第二個表格驗證用「法向量與 AP 的內積 ÷ 法向量的長度」也能求出同樣的距離。內積是 7,距離約 3.1304951685,和第一個表格相同。
第三個表格是點 (4, 3) 和直線 y = 2x + 1 的例子,距離約 2.683281573。
第四個表格得到 1.4、2.6、0.2,所以垂足是 (2.6, 0.2) = (13/5, 1/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 |
| y 截距 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)
# 代入點後的值(含正負號)與法向量長度的平方
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 的特色
不需專業知識,操作直覺又簡單
無須登錄任何個人資料
按下「下載」後自動刪除檔案
無須標註來源出處
亦無須事先取得商用授權