点到线的距离计算公式

    图形编程中可能会用到点到线的距离计算这个问题。找了下资料,五花八门,仔细试了下,许多是错的。还有许多是起始条件不一样而不适用的。经过最近的研究、推算与总结。终于把这一块搞清楚了。写出来一是给自己的劳动成果拍照留底,二是分享给大家,让大家不必走弯路。

 

点:(x0,y0)
线:Ax+By+C=0
①距离=ABS(A*x0+B*y0+C) / SQRT(A*A+B*B)

线:y=kx+b
②距离=ABS(k*x0-y0+b) / SQRT(k*k+1)

变量关系
k=-A/B
A=-kB
b=-C/B
C=-bB

线为2个不同点(x1,y1)和(x2,y2)来确定
A=-(y1-y2)/(x1-x2)*B
C=-(y2*x1-y1*x2)/(x1-x2)*B
代入①,得
③距离=ABS[-(y1-y2)/(x1-x2)*x0 + y0 - (y2*x1-y1*x2)/(x1-x2)] / SQRT{1+[(y1-y2)/(x1-x2)]^2}
化简得
④距离=ABS[(y1-y2)*x0 - (x1-x2)*y0 + y2*x1 - y1*x2] / SQRT[(x1-x2)^2+(y1-y2)^2]

变量关系
k=(y1-y2)/(x1-x2)
b=(y2*x1-y1*x2)/(x1-x2)

以上公式已通过测试。
测试数据:
(x0,y0)=(1,1)
(x1,y1)=(1,4)
(x2,y2)=(5,1)
根据勾3股4弦5,得高= 3*4/5=2.4,即距离=2.4

    太久没推导数学公式了,中途在数学与编程都犯了点小错,搞了3天终于算是OK。各位就不必再像我这么犯傻了。

转载于:https://www.cnblogs.com/BillySir/p/PointAndLineDistance.html

<think> 首先,用户查询的是“两式直线方程到圆的距离计算公式”。意思是找到两式定义的直线和一个圆的距离。这里的距离应该指的是圆心到直线距离,因为直线和圆的距离通常指的是圆心到直线的垂直距离。 回顾引用: - [1] 给出了空间直线的两式方程:$L: \frac{x-x_{1}}{x_{2}-x_{1}} = \frac{y-y_{1}}{y_{2}-y_{1}} = \frac{z-z_{1}}{z_{2}-z_{1}}$。[^1] 这是三维空间中的方程。 - [2] 提供了一个函数来计算到一个直线距离(在二维),代码是: ```javascript function getPointToLineDistance(list, point){ let [[x1, y1], [x2, y2]] = list; let [x, y] = point; if(x1 === x2){ return Math.abs(x - x1); } else if(y1 === y2){ return Math.abs(y - y1); } return Math.abs((y1-y2)*x + (x2 - x1)*y + x1*y2 - y1*x2) / Math.sqrt((y1 - y2)**2 + (x1 - x2)**2); } ``` [^2] 这看起来是二维的。 - [3] 是关于计算坐标和解方程的讨论。[^3] 用户的问题是“两式直线方程到圆的距离”,但引用中[1]是三维方程,而[2]是二维的到直线距离。用户提到“圆”,所以应该是二维平面上的情况。 用户说“我想查找两式直线方程到圆的距离计算公式”,所以焦是直线和圆在二维平面上的距离。 在二维平面中,两式直线方程可以表示为: $\frac{x - x_1}{x_2 - x_1} = \frac{y - y_1}{y_2 - y_1}$ 或者更常见的是参数形式或标准形式。 到平面的距离公式在二维中就是到直线距离。 圆心到直线距离是计算的关键。一旦有了这个距离,我们可以判断直线和圆的位置关系(相交、相切、相离),但用户明确要求“距离计算公式”,所以焦是圆心到直线距离。 假设圆心坐标为$(x_0, y_0)$,直线由两$(x_1,y_1)$和$(x_2,y_2)$定义。 到直线距离公式在二维中为: $d = \frac{|ax_0 + by_0 + c|}{\sqrt{a^2 + b^2}}$ 其中直线方程为$ax + by + c = 0$。 所以,我需要首先将两式方程转化为标准形式$ax + by + c = 0$。 从两式: $\frac{x - x_1}{x_2 - x_1} = \frac{y - y_1}{y_2 - y_1}$ 可以写成: $(x - x_1)(y_2 - y_1) = (y - y_1)(x_2 - x_1)$ 整理得: $(y_2 - y_1)(x - x_1) - (x_2 - x_1)(y - y_1) = 0$ 展开: $(y_2 - y_1)x - (y_2 - y_1)x_1 - (x_2 - x_1)y + (x_2 - x_1)y_1 = 0$ 所以系数为: $a = y_2 - y_1$ $b = -(x_2 - x_1)$ (因为 $b$ 是 $y$ 的系数) $c = - (y_2 - y_1)x_1 + (x_2 - x_1)y_1$ 简化 $c$: $c = -a x_1 - b y_1$,但直接写为: $c = (x_2 - x_1)y_1 - (y_2 - y_1)x_1$ 在距离公式中,常数项是 $c$,所以: $a = y_2 - y_1$ $b = x_1 - x_2$ (因为我用了 $-(x_2 - x_1) = x_1 - x_2$) $c = (x_2 - x_1)y_1 - (y_2 - y_1)x_1$ 从展开式: $a x + b y + c = 0$,其中 $a = y_2 - y_1$ $b = -(x_2 - x_1) = x_1 - x_2$ $c = - (y_2 - y_1)x_1 + (x_2 - x_1)y_1$ $c = -a x_1 - b y_1$? 让我验证。 $a x_1 + b y_1 + c = (y_2 - y_1)x_1 + (x_1 - x_2)y_1 + [ - (y_2 - y_1)x_1 + (x_2 - x_1)y_1 ]$ 计算: $(y_2 - y_1)x_1 + (x_1 - x_2)y_1 - (y_2 - y_1)x_1 + (x_2 - x_1)y_1$ 注意 $(x_2 - x_1)y_1 = - (x_1 - x_2)y_1$,但简化: 第一项和第三项抵消:$(y_2 - y_1)x_1 - (y_2 - y_1)x_1 = 0$ 然后 $(x_1 - x_2)y_1 + (x_2 - x_1)y_1 = (x_1 - x_2)y_1 + (- (x_1 - x_2))y_1 = 0$ 是的,所以 $a x_1 + b y_1 + c = 0$,正确。 所以,对于直线通过 $(x_1,y_1)$ 和 $(x_2,y_2)$,标准形式: $a = y_2 - y_1$ $b = x_1 - x_2$ $c = (x_2 - x_1)y_1 - (y_2 - y_1)x_1$ 或等价 $c = -a x_1 - b y_1$ 现在,圆心为 $(x_0, y_0)$,距离 $d$ 为: $d = \frac{|a x_0 + b y_0 + c|}{\sqrt{a^2 + b^2}}$ 代入 $a, b, c$: $d = \frac{ | (y_2 - y_1) x_0 + (x_1 - x_2) y_0 + [(x_2 - x_1) y_1 - (y_2 - y_1) x_1] | }{ \sqrt{ (y_2 - y_1)^2 + (x_1 - x_2)^2 } }$ 简化分子: 分子:$| (y_2 - y_1) x_0 + (x_1 - x_2) y_0 + (x_2 - x_1) y_1 - (y_2 - y_1) x_1 |$ 注意 $x_1 - x_2 = - (x_2 - x_1)$,所以: $= | (y_2 - y_1) x_0 - (x_2 - x_1) y_0 + (x_2 - x_1) y_1 - (y_2 - y_1) x_1 |$ $= | (y_2 - y_1) (x_0 - x_1) - (x_2 - x_1) (y_0 - y_1) |$ 因为 $(y_2 - y_1) x_1 + (x_2 - x_1) y_1$ 部分被重组。 是的,标准写法: 分子可以写为: $| (y_2 - y_1)(x_0 - x_1) - (x_2 - x_1)(y_0 - y_1) |$ 分母是 $\sqrt{ (x_2 - x_1)^2 + (y_2 - y_1)^2 }$,因为 $(x_1 - x_2)^2 = (x_2 - x_1)^2$。 所以,距离 $d$: $d = \frac{ | (y_2 - y_1)(x_0 - x_1) - (x_2 - x_1)(y_0 - y_1) | }{ \sqrt{ (x_2 - x_1)^2 + (y_2 - y_1)^2 } }$ 这与引用[2]中的代码一致: `Math.abs((y1-y2)*x + (x2 - x1)*y + x1*y2 - y1*x2) / Math.sqrt((y1 - y2)**2 + (x1 - x2)**2)` 比较: 在代码中,`(y1-y2)` 相当于 $-(y_2 - y_1)$,但绝对值相同。 分子:`(y1-y2)*x + (x2 - x1)*y + x1*y2 - y1*x2` 其中 `x` 和 `y` 是圆心的坐标。 `x1*y2 - y1*x2` 部分。 让我们写成: $a = y1 - y2$(在代码中是 `y1-y2`) 但在我的公式中,我用了 $a = y_2 - y_1$,所以符号不同。 代码:分子 `| (y1-y2) * x + (x2 - x1) * y + x1 * y2 - y1 * x2 |` 展开 `x1 * y2 - y1 * x2`。 注意 `x1 * y2 - y1 * x2` 不是常数?在标准形式中,常数项依赖于。 在代码中,当 `x` 和 `y` 是变量时,但对于 `(x,y)`。 对于直线方程,`(y1-y2)*x + (x2-x1)*y + (x1*y2 - y1*x2) = 0` 因为当 `(x,y) = (x1,y1)`: `(y1-y2)*x1 + (x2-x1)*y1 + x1*y2 - y1*x2 = y1*x1 - y2*x1 + x2*y1 - x1*y1 + x1*y2 - y1*x2` 计算:`y1*x1 - y2*x1 + x2*y1 - x1*y1 + x1*y2 - y1*x2 = (y1*x1 - x1*y1) + (-y2*x1 + x1*y2) + (x2*y1 - y1*x2) = 0 + 0 + 0 = 0` 类似地对于 `(x2,y2)`。 所以是的,直线方程为:$(y_1 - y_2)x + (x_2 - x_1)y + (x_1 y_2 - y_1 x_2) = 0$ 所以系数: $a = y_1 - y_2$ $b = x_2 - x_1$ $c = x_1 y_2 - y_1 x_2$ 然后距离 $d = \frac{|a x_0 + b y_0 + c|}{\sqrt{a^2 + b^2}} = \frac{ | (y_1 - y_2) x_0 + (x_2 - x_1) y_0 + x_1 y_2 - y_1 x_2 | }{ \sqrt{ (y_1 - y_2)^2 + (x_2 - x_1)^2 } }$ 这与代码一致。 在我的推导中,我有 $d = \frac{ | (y_2 - y_1)(x_0 - x_1) - (x_2 - x_1)(y_0 - y_1) | }{ \sqrt{ (x_2 - x_1)^2 + (y_2 - y_1)^2 } }$ 展开分子:$| (y_2 - y_1)(x_0 - x_1) - (x_2 - x_1)(y_0 - y_1) | = | (y_2 - y_1) x_0 - (y_2 - y_1) x_1 - (x_2 - x_1) y_0 + (x_2 - x_1) y_1 |$ 比较代码分子:$| (y_1 - y_2) x_0 + (x_2 - x_1) y_0 + x_1 y_2 - y_1 x_2 |$ 注意 $y_1 - y_2 = - (y_2 - y_1)$ $x_1 y_2 - y_1 x_2 = - (y_1 x_2 - x_1 y_2)$,但不同。 计算:代码分子 = $(y_1 - y_2) x_0 + (x_2 - x_1) y_0 + x_1 y_2 - y_1 x_2$ = $- (y_2 - y_1) x_0 + (x_2 - x_1) y_0 + x_1 y_2 - y_1 x_2$ 我的分子:$(y_2 - y_1) x_0 - (y_2 - y_1) x_1 - (x_2 - x_1) y_0 + (x_2 - x_1) y_1$ = $(y_2 - y_1) x_0 - (x_2 - x_1) y_0 - (y_2 - y_1) x_1 + (x_2 - x_1) y_1$ 现在,$(y_2 - y_1) x_1 - (x_2 - x_1) y_1$ 是常数部分,但代码有 $x_1 y_2 - y_1 x_2$ $x_1 y_2 - y_1 x_2 = - (y_1 x_2 - x_1 y_2)$ 而 $ (y_2 - y_1) x_1 - (x_2 - x_1) y_1 = y_2 x_1 - y_1 x_1 - x_2 y_1 + x_1 y_1 = y_2 x_1 - x_2 y_1 $ 因为 $-y_1 x_1 + x_1 y_1 = 0$ 所以 $ x_1 y_2 - y_1 x_2 $ 相同。 在我的表达式中,常数部分是 $ - (y_2 - y_1) x_1 + (x_2 - x_1) y_1 = - y_2 x_1 + y_1 x_1 + x_2 y_1 - x_1 y_1 = - y_2 x_1 + x_2 y_1$ 这等于 $ x_2 y_1 - x_1 y_2 $,而代码中是 $x_1 y_2 - y_1 x_2 = x_1 y_2 - x_2 y_1$? 等等: $x_1 y_2 - y_1 x_2 = x_1 y_2 - x_2 y_1$ 如果 $y_1$ 和 $x_2$ 是标量。 而 $x_2 y_1 - x_1 y_2 = - (x_1 y_2 - x_2 y_1)$ 所以,代码分子:$ (y_1 - y_2) x_0 + (x_2 - x_1) y_0 + x_1 y_2 - y_1 x_2 $ = $ (y_1 - y_2) x_0 + (x_2 - x_1) y_0 + (x_1 y_2 - x_2 y_1) $ 我的分子:$ (y_2 - y_1) x_0 - (x_2 - x_1) y_0 + (x_2 y_1 - x_1 y_2) $ = $ - (y_1 - y_2) x_0 - (x_2 - x_1) y_0 - (x_1 y_2 - x_2 y_1) $ 因此,绝对值相同:|A| = | -A |。 所以,公式是相同的。 因此,对于圆心 $(x_0, y_0)$ 和直线通过 $(x_1,y_1)$ 和 $(x_2,y_2)$,距离 $d$ 为: $$ d = \frac{ | (y_2 - y_1) x_0 - (x_2 - x_1) y_0 + (x_2 y_1 - x_1 y_2) | }{ \sqrt{ (x_2 - x_1)^2 + (y_2 - y_1)^2 } } $$ 或等价: $$ d = \frac{ | (y_1 - y_2) x_0 + (x_2 - x_1) y_0 + (x_1 y_2 - y_1 x_2) | }{ \sqrt{ (x_2 - x_1)^2 + (y_2 - y_1)^2 } } $$ 现在,用户问的是“两式直线方程到圆的距离”,但圆有圆心和半径。距离 $d$ 是圆心到直线距离。然后,直线和圆的距离通常指的是最小距离,即如果 $d > r$(半径),则距离是 $d - r$;如果 $d < r$,则为 $r - d$(但可能为负,表示相交);但严格来说,距离是 $\left| d - r \right|$ 当它们不相交,但实际中,几何距离是圆心距离减去半径的绝对值,或者更准确地说,如果 $d > r$,则最小距离是 $d - r$;如果 $d < r$,则最小距离是 $r - d$(当相交时,最小距离为0)。 但用户说“距离计算公式”,可能指的是圆心到直线距离,因为那是关键量。或者直接给出 $d$。 在上下文中,引用[2]给出了到直线距离,所以类似地,这里应该是圆心到直线距离。 为了完整,我应该指定。 此外,用户提到“圆”,所以假设圆是给定的圆心和半径。 但在公式中,半径不会直接影响距离到直线的计算;距离是到直线的,然后与半径比较。 但用户明确说“到圆的距离”,所以可能是指直线到圆的最短距离。 在几何中,一条直线和一个圆(不相交时)的距离是圆心到直线距离减去半径的绝对值,即 $\left| d - r \right|$。 但通常,如果 $d > r$,距离是 $d - r$;如果 $d < r$,距离是 $r - d$(但为负或零时距离为零)。 最小距离是 $\max(0, |d - r|)$?不,标准定义:当直线和圆不相交时,距离是 $|d - r|$,如果 $d > r$;如果相交,距离为0。 但数学上,距离通常是到集合的最短距离,所以对于直线和圆,是 $\inf\{ \text{dist}(P,Q) | P \text{ on line}, Q \text{ on circle} \}$,即 $\max(0, d - r)$。 是的,所以最小距离是 $|d - r|$ 当 $d \neq r$,但实际是 $\max(0, d - r)$ 如果 $d > r$,否则为0。 但用户可能只关心 $d$,即圆心到直线距离,因为那是核心计算。 回顾引用,[2]给出了到直线距离,所以类似地,这里应该是圆心到直线距离。 此外,在问题中,“两式直线方程到圆的距离”,可能有模糊,但标准理解为圆心到直线距离。 为了安全,我可以给出圆心到直线距离公式。 现在,回答需要用中文,结构清晰。 也需要生成相关问题,就像在系统指令中。 最后,添加引用标识。 引用[1]是关于空间直线的,但这里是平面,因为圆是二维的。引用[2]是二维的,更相关。 所以,在回答中,我可以引用[2]。 回答结构: - 解释两式直线方程。 - 给出圆心到直线距离公式。 - 可能解释如何用于直线到圆的距离。 步骤: 1. 首先,确认问题:在二维平面中,给定两确定直线,和圆(给定圆心和半径),求圆心到直线距离。 2. 公式:如上述。 3. 然后,直线到圆的距离可以用 $\max(0, d - r)$ 或类似表达,但可能超出范围。 用户说“距离计算公式”,所以焦是 $d$。 在引用[2]中,有代码,所以我可以给出公式。 现在,写回答。 </think> ### 两式直线方程到圆的距离计算公式 在二维平面中,两式直线方程用于表示通过两个已知 \((x_1, y_1)\) 和 \((x_2, y_2)\) 的直线,其标准形式为: \[ \frac{x - x_1}{x_2 - x_1} = \frac{y - y_1}{y_2 - y_1} \] 或等价的标准直线方程: \[ ax + by + c = 0 \] 其中系数 \(a = y_1 - y_2\),\(b = x_2 - x_1\),\(c = x_1 y_2 - y_1 x_2\)(推导见下文)[^2]。 对于圆,假设圆心坐标为 \((x_0, y_0)\),半径为 \(r\)。直线到圆的距离实质上是直线到圆心的垂直距离(记为 \(d\))与半径的比较结果。但核心部分是计算圆心到直线距离 \(d\),公式如下: #### 圆心到直线距离公式 \[ d = \frac{|a x_0 + b y_0 + c|}{\sqrt{a^2 + b^2}} \] 代入系数: \[ d = \frac{| (y_1 - y_2) x_0 + (x_2 - x_1) y_0 + (x_1 y_2 - y_1 x_2) |}{\sqrt{(x_2 - x_1)^2 + (y_2 - y_1)^2}} \] 等价形式(便于计算): \[ d = \frac{| (y_2 - y_1)(x_0 - x_1) - (x_2 - x_1)(y_0 - y_1) |}{\sqrt{(x_2 - x_1)^2 + (y_2 - y_1)^2}} \] **推导说明**: - 系数推导:从两式方程 \(\frac{x - x_1}{x_2 - x_1} = \frac{y - y_1}{y_2 - y_1}\) 化为标准形式 \((y_1 - y_2)x + (x_2 - x_1)y + (x_1 y_2 - y_1 x_2) = 0\)。 - 距离公式:基于到直线距离公式,分子取绝对值确保非负,分母是直线方向向量的模(即两距离公式)[^2]。 #### 直线到圆的距离线到圆的最小距离 (记为 \(d_{\text{min}}\)) 取决于 \(d\) 和半径 \(r\): - 如果 \(d > r\)(直线在圆外),最小距离为 \(d - r\)。 - 如果 \(d < r\)(直线与圆相交或包含),最小距离为 0(因为直线与圆有交)。 - 如果 \(d = r\)(直线与圆相切),最小距离为 0。 因此,通用公式为: \[ d_{\text{min}} = \max(0, d - r) \] 但实际问题中,通常先计算 \(d\),再根据 \(r\) 判断位置关系。 **示例计算**: 给定两 \(P_1(1, 2)\) 和 \(P_2(3, 4)\) 定义直线,圆心 \(C(0, 0)\),半径 \(r = 1\)。 - 计算系数: \(a = y_1 - y_2 = 2 - 4 = -2\), \(b = x_2 - x_1 = 3 - 1 = 2\), \(c = x_1 y_2 - y_1 x_2 = 1 \cdot 4 - 2 \cdot 3 = -2\)。 - 圆心到直线距离: \[ d = \frac{|(-2)(0) + (2)(0) + (-2)|}{\sqrt{(-2)^2 + 2^2}} = \frac{2}{\sqrt{8}} = \frac{2}{2\sqrt{2}} = \frac{\sqrt{2}}{2} \approx 0.707 \] - 直线到圆的距离: 因为 \(d \approx 0.707 < r = 1\),所以最小距离 \(d_{\text{min}} = 0\)(直线与圆相交)。 ### 注意事项 - 本公式适用于二维平面。引用[1]的空间直线方程(三维)不直接适用,因为圆是二维对象[^1]。 - 代码实现可参考引用[2]的JavaScript函数,只需输入圆心坐标作为“”,两坐标作为“列表”[^2]。 - 如果直线垂直于坐标轴(如 \(x_1 = x_2\) 或 \(y_1 = y_2\)),公式简化为到直线的投影(见引用[2]中的条件分支)[^2]。 ### 相关问题 1. 如何判断直线和圆的位置关系(相交、相切、相离)? 2. 给定圆心到直线距离和半径,如何计算直线到圆的最短距离? 3. 在三维空间中,如何计算到空间直线距离? 4. 两式直线方程有哪些其他形式(如参数式),如何相互转换? [^1]: 空间直线的两式方程基于三维坐标,适用于空间几何问题。 [^2]: 到直线距离的计算代码可直接用于圆心距离计算,前提是二维平面。 [^3]: 直线方程求解涉及坐标变换和方程组,但本问题核心是距离公式而非方程求解。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值