点在直线上的投影
已知直线上两点a、b和直线外一点p,求p在直线ab上的投影点
代码模板
Point projection(Point p,Point a,Point b)
{
Vector v = b - a,u = p - a;
return a + v * (dot(v,u) / dot(v,v)); //dot是两向量的点积
}
证明
如下图,p的投影点p’就是a+
x
⃗
\vec x
x(直线的点向式),所以我们只要求出
x
⃗
\vec x
x就能求出p’了。
而
x
⃗
\vec x
x = t
v
⃗
\vec v
v,这个t就是
∣
x
⃗
∣
|\vec x|
∣x∣和
∣
v
⃗
∣
|\vec v|
∣v∣的比值,
v
⃗
⋅
u
⃗
=
∣
v
⃗
∣
⋅
∣
u
⃗
∣
⋅
c
o
s
θ
\vec v \cdot \vec u = |\vec v| \cdot |\vec u| \cdot cos\theta
v⋅u=∣v∣⋅∣u∣⋅cosθ,所以
v
⃗
\vec v
v和
u
⃗
\vec u
u的点积就是
∣
v
⃗
∣
|\vec v|
∣v∣乘
∣
x
⃗
∣
|\vec x|
∣x∣,然后我们除以
∣
v
⃗
∣
|\vec v|
∣v∣再除以
∣
v
⃗
∣
|\vec v|
∣v∣就得到了比值t,而除以两次就相当于除以
∣
v
⃗
∣
2
|\vec v|^2
∣v∣2,就等于
v
⃗
\vec v
v和
v
⃗
\vec v
v自己的点积。
求出比值t就能求出向量x;求出向量x就能求出点p’。