这里讨论的是点到线段的距离,其中线段是用两个端点的坐标表示的。
点与线段
点:
(
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+λ(x2−x1)y=y1+λ(y2−y1)
计算距离
点到线段的距离有两种情况:
- 利用点到直线的距离公式直接计算;
- 点到两个端点距离的最小值;
所以需要找一个条件判断该用那种情况。从下图可知,可以利用锐角钝角的情况判定:
- 如果向量 A P ⃗ \vec{AP} AP 与向量 A B ⃗ \vec{AB} AB 之间的点积 小于0,则P在直线上的投影在线段外,此时距离为点到端点的距离。
- 否则,就需要计算点到直线的投影距离 (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
(px−x1)(x2−x1)+(py−y1)(y2−y1)<0或者(px−x2)(x1−x2)+(py−y2)(y1−y2)<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((px−x1)2+(py−y1)2,(px−x2)2+(py−y2)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=y2−y1b=−(x2−x1)c=−by1−ax1
带入 (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=(x2−x1)2+(y2−y1)2∣(y2−y1)(px−x1)−(x2−x1)(py−y1)∣