点到线段的最短矩离 及垂足的计算

在这里插入图片描述
过P做MN的垂线,垂足为Q,若Q在线段MN以内(包括与点M点N重合),则最短距离为垂线段长度,若垂足在MN以外,则最短距离为PM,PN中的较小者。(若P与MN共线,垂线长度为零,同样适用)
所以可由 Q位置判断

一、代数法

若Q在线段MN上 则
∣ M Q ∣ + ∣ Q N ∣ = ∣ M N ∣ \lvert MQ \rvert + |QN| = |MN| MQ+QN=MN
或不开方的
∣ M Q ∣ 2 + ∣ Q N ∣ 2 ≤ ∣ M N ∣ 2 \lvert MQ \rvert ^2 + |QN|^2 \leq |MN|^2 MQ2+QN2MN2

所以最小距离可表示为
{ ∣ P Q ∣ | M Q ∣ + ∣ Q N ∣ = ∣ M N ∣ M I N ( ∣ P N ∣ , ∣ P M ∣ ) ∣ M Q ∣ + ∣ Q N ∣ > ∣ M N ∣ \left\{ \begin{array}{lcr} \lvert PQ \rvert & & \text |MQ | + |QN| = |MN| \\\\ MIN(|PN|,|PM|) & & \lvert MQ \rvert + |QN| \gt |MN| \end{array} \right. PQMIN(PN,PM)|MQ+QN=MNMQ+QN>MN

{ ∣ P Q ∣ | M Q ∣ 2 + ∣ Q N ∣ 2 ≤ ∣ M N ∣ 2 M I N ( ∣ P N ∣ , ∣ P M ∣ ) ∣ M Q ∣ 2 + ∣ Q N ∣ 2 > ∣ M N ∣ 2 \left\{ \begin{array}{lcr} \lvert PQ \rvert & & \text |MQ | ^2 + |QN|^2 \leq |MN|^2 \\\\ MIN(|PN|,|PM|) & & \lvert MQ \rvert ^2 + |QN|^2 \gt |MN|^2 \end{array} \right. PQMIN(PN,PM)|MQ2+QN2MN2MQ2+QN2>MN2

计算垂足
∠ b = ∠ a + 90 ° \angle b = \angle a + 90\degree b=a+90°
tan ⁡ ( b ) = tan ⁡ ( a + π 2 ) = − cot ⁡ ( a ) \tan(b) = \tan (a + \frac {\pi}{2} ) = - \cot(a) tan(b)=tan(a+2π)=cot(a)
MN斜率为k PQ斜率为 -1/k

{ y q − y p x q − x p = − 1 k y = k x + b \left\{ \begin{array}{lcr} \frac { y_q - y_p} { x_q - x_p} = -\frac {1}{k} \\\\ y= kx + b & & \end{array} \right. xqxpyqyp=k1y=kx+b

点Q在MN上求解

{ x q = x p + k y p − k b 1 + k 2 y q = k x p + k 2 y p + b 1 + k 2 \left\{ \begin{array}{lcr} x_q = \frac { x_p + k y_p - kb}{ 1 + k^2}\\\\ y_q = \frac { k x_p + k^2 y_p + b}{ 1 + k^2} \\ \end{array} \right. xq=1+k2xp+kypkbyq=1+k2kxp+k2yp+b

其中
{ b = y m − y n − y m x n − x m x m = x n y m − x m y n x n − x m k = y n − y m x n − x m \left\{ \begin{array}{lcr} b = y _m - \frac { y_n - y_m} { x_n - x_m} x_m = \frac { x_ny_m - x_m y_n} { x_n - x_m} & & \\\\ k = \frac { y_n - y_m} { x_n - x_m} & & \end{array} \right. b=ymxnxmynymxm=xnxmxnymxmynk=xnxmynym

代入 M N P 坐标 可算出 垂足坐标

水平与坚直另分一种情况直接求解

二、向量法

在这里插入图片描述

M N → ˙ M P → = ∣ M N ∣    ∣ M P ∣    c o s    α \quad \overrightarrow {MN} \dot \quad \overrightarrow {MP} = \lvert MN\rvert\; \lvert MP \rvert \; cos \; \alpha MN ˙MP =MNMPcosα
∠ P M N > 90 ° \angle PMN > 90 \degree PMN>90° 点积结果为负
∠ P M N = 90 ° \angle PMN = 90 \degree PMN=90° 点积结果为零
∠ P M N < 90 ° \angle PMN < 90 \degree PMN<90° 点积结果为正

∣ M P ∣    c o s    α = M N → ˙ M P → ∣ M N ∣ \lvert MP \rvert \; cos \; \alpha = \frac {\quad \overrightarrow {MN} \dot \quad \overrightarrow {MP} } { \lvert MN\rvert } MPcosα=MNMN ˙MP
结果为MQ的长度 带符号 另比一次

∣ M P ∣    c o s    α ∣ M N ∣ = M N → ˙ M P → ∣ M N ∣ 2 \frac { \lvert MP \rvert \; cos \; \alpha}{ \lvert MN\rvert } = \frac {\quad \overrightarrow {MN} \dot \quad \overrightarrow {MP} } { \lvert MN\rvert ^2 } MNMPcosα=MN2MN ˙MP

结果为MQ与MN长度比带符号 设为 λ \lambda λ
若Q在线段MN上 则
0 ≤ λ ≤ 1 0 \leq \lambda \leq 1 0λ1
其它情况Q在线段外
垂足坐标
x q = λ ( x n − x m ) + x m      y q = λ ( y n − y m ) + y m x_q = \lambda (x_n-x_m)+x_m \; \; \\\\ y_q =\lambda (y_n-y_m)+y_m xq=λ(xnxm)+xmyq=λ(ynym)+ym

 typedef double real;
 typedef struct {
 	real x;
 	real y;
} PT;

 real dist(PT* a, PT* b, PT* c,PT* foot)
{
  real ab = length(a,b);
  if (ab < EPS){  
    return length(a,c);
  }   
  
  real lambda = dot(a,b,a,c)/(ab*ab);

  real dx = b->x - a->x;
  real dy = b->y - a->y;

  foot->x = lambda*dx + a->x;
  foot->y = lambda*dy + a->y;

  if( lambda >= 0 && lambda <= 1) {
    return  length(c,foot); // or cross(a,b,a,c)/ab;
  }else {
    real ac = length(a,c);
    real bc = length(b,c);
    return MIN(ac,bc);
  }
}
  • 6
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
在MATLAB中,我们可以使用向量运算和标量运算来计算点到线段的最短距离。下面将展示一个简单的MATLAB程序,用于计算点到线段的最短距离。 ```matlab function distance = shortestDistance(point, lineStart, lineEnd) % 计算线段的向量 lineVector = lineEnd - lineStart; % 计算点到线段起点的向量 pointVector = point - lineStart; % 计算点到线段结束点的向量 endVector = point - lineEnd; % 计算点到线段起点的投影向量 projectionVector = dot(pointVector, lineVector) / dot(lineVector, lineVector) * lineVector; % 如果投影向量在线段向量的范围之外,则最短距离是点到线段的起点或结束点的距离 if dot(projectionVector, lineVector) < 0 distance = norm(pointVector); elseif dot(endVector, lineVector) > 0 distance = norm(endVector); else % 否则,最短距离是点到投影向量的距离 distance = norm(pointVector - projectionVector); end end ``` 在这个程序中,我们定义了一个名为`shortestDistance`的函数,它有三个输入参数:`point`代表点的坐标,`lineStart`代表线段的起点坐标,`lineEnd`代表线段的结束坐标。函数使用向量运算和标量运算来计算点到线段的最短距离。 首先,我们计算线段的向量`lineVector`、点到线段起点的向量`pointVector`和点到线段结束点的向量`endVector`。 然后,我们计算点到线段起点的投影向量`projectionVector`,通过点到线段起点向量与线段向量的内积除以线段向量的模长,再乘以线段向量。 接下来,我们通过判断投影向量是否在线段向量的范围之外来确定最短距离是点到线段的起点或结束点的距离,或是点到投影向量的距离。 最后,我们将最短距离返回。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

yvee

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值