计算点到(以端点描述的)线段的距离

这里讨论的是点到线段的距离,其中线段是用两个端点的坐标表示的。

点与线段

点: ( p x , p y ) (p_x, p_y) (px,py)
线段: l = { ( x 1 , y 1 ) , ( x 2 , y 2 ) } l=\{(x_1,y_1),(x_2,y_2)\} l={(x1,y1),(x2,y2)}

基本知识

对直线 a x + b y + c = 0 ax+by+c=0 ax+by+c=0 外一点 ( p x , p y ) (p_x, p_y) (px,py),其到直线的距离为:
( 1 )           distance = ∣ a p x + b p y + c ∣ a 2 + b 2 (1)\ \ \ \ \ \ \ \ \ \ \text{distance}=\frac{|ap_x+bp_y+c|}{\sqrt{a^2+b^2}} (1)          distance=a2+b2 apx+bpy+c
对两个不相同的点 ( x 1 , y 1 ) , ( x 2 , y 2 ) (x_1,y_1),(x_2,y_2) (x1,y1),(x2,y2),其构成的直线为:
( 2 )            { x = x 1 + λ ( x 2 − x 1 ) y = y 1 + λ ( y 2 − y 1 ) (2)\ \ \ \ \ \ \ \ \ \ \begin{cases} x=x_1+\lambda(x_2-x_1) \\ y=y_1+\lambda(y_2-y_1) \end{cases} (2)          {x=x1+λ(x2x1)y=y1+λ(y2y1)

计算距离

点到线段的距离有两种情况:

  1. 利用点到直线的距离公式直接计算;
  2. 点到两个端点距离的最小值;

所以需要找一个条件判断该用那种情况。从下图可知,可以利用锐角钝角的情况判定:
在这里插入图片描述

  1. 如果向量 A P ⃗ \vec{AP} AP 与向量 A B ⃗ \vec{AB} AB 之间的点积 小于0,则P在直线上的投影在线段外,此时距离为点到端点的距离。
  2. 否则,就需要计算点到直线的投影距离 (1)。
判定方式

点的投影在线段外的判定方式:
( p x − x 1 ) ( x 2 − x 1 ) + ( p y − y 1 ) ( y 2 − y 1 ) < 0 或者 ( p x − x 2 ) ( x 1 − x 2 ) + ( p y − y 2 ) ( y 1 − y 2 ) < 0 (p_x-x_1)(x_2-x_1)+(p_y-y_1)(y_2-y_1)<0 \\ 或者 \\ (p_x-x_2)(x_1-x_2)+(p_y-y_2)(y_1-y_2)<0 (pxx1)(x2x1)+(pyy1)(y2y1)<0或者(pxx2)(x1x2)+(pyy2)(y1y2)<0

点到线段的距离

如果点的投影在 线段外部,找到点到两端点的距离最小值即可:
min ⁡ ( ( p x − x 1 ) 2 + ( p y − y 1 ) 2 , ( p x − x 2 ) 2 + ( p y − y 2 ) 2 ) \min(\sqrt{(p_x-x_1)^2+(p_y-y_1)^2},\sqrt{(p_x-x_2)^2+(p_y-y_2)^2}) min((pxx1)2+(pyy1)2 ,(pxx2)2+(pyy2)2 )

如果点的投影在 线段内部,计算投影距离:

利用 (2),可得:
{ a = y 2 − y 1 b = − ( x 2 − x 1 ) c = − b y 1 − a x 1 \begin{cases} a=y_2-y_1 \\ b=-(x_2-x_1) \\ c=-by_1-ax_1 \end{cases} a=y2y1b=(x2x1)c=by1ax1

带入 (1),整理得:
distance = ∣ ( y 2 − y 1 ) ( p x − x 1 ) − ( x 2 − x 1 ) ( p y − y 1 ) ∣ ( x 2 − x 1 ) 2 + ( y 2 − y 1 ) 2 \pmb{\text{distance}}=\frac{|(y_2-y_1)(p_x-x_1)-(x_2-x_1)(p_y-y_1)|}{\sqrt{(x_2-x_1)^2+(y_2-y_1)^2}} distance=(x2x1)2+(y2y1)2 (y2y1)(pxx1)(x2x1)(pyy1)

  • 10
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值