###向量间投影和距离
这段时间用到了点到向量的距离,发现已经还给高数老师了。借这篇博客(参考英文博客)总结回顾一下,并且附上Python代码。先回顾下向量点积和叉乘公式, a ⋅ b = ∣ a ∣ ∣ b ∣ c o s ( θ ) a \cdot b = |a||b|cos(\theta) a⋅b=∣a∣∣b∣cos(θ),| a × b ∣ = ∣ a ∣ ∣ b ∣ s i n ( θ ) a \times b| = |a||b|sin(\theta) a×b∣=∣a∣∣b∣sin(θ)。
从下图可以看出***b***向量在***a***向量上的投影长度是 ∣ b ∣ c o s ( θ ) |b|cos(\theta) ∣b∣cos(θ),可以通过***b***和***a***的点积除以***a***的长度,实际的投影向量 p r o j a b = ( a / ∣ a ∣ ) ( a ⋅ b / ∣ a ∣ ) proj_a^b = (a/|a|)(a \cdot b /|a|) projab=(a/∣a∣)(a⋅b/∣a∣)。同理,***b***到***a***的距离为 ∣ b ∣ s i n ( θ ) |b|sin(\theta) ∣b∣sin(θ),可以通过***b***和***a***的叉乘除以***a***的长度得到,即 o r t h a b = ( a × b ) / ∣ a ∣ orth_a^b = (a \times b)/|a| orthab=(a×b)/∣a∣。可知 d i s t a n c e = ∣ a × b ∣ / ∣ a ∣ distance = |a \times b|/|a| distance=∣a×b∣/∣a∣,并且 b = p r o j a b + o r t h a b b = proj_a^b + orth_a^b b=projab+orthab。
###点到向量的距离
考虑下图中上半部分,求点P到直线L的距离,其中L的方向向量是***v***。任取直线上一点Q, d = ∣ Q P × v ∣ / ∣ v ∣ d = |QP \times v|/|v| d=∣QP×v∣/∣v∣ ,设P点坐标为(1,3,8),Q点坐标是(-2,1,-3),可知 Q P = < 3 , 2 , 11 > QP = <3,2,11> QP=<3,2,11>,另设 v = < 1 , − 2 , − 1 > v = <1,-2,-1> v=<1,−2,−1>。
通过叉乘的计算公式(如下图,联想行列式计算公式),我们可知 Q P × v = 20 i + 14 j − 8 k QP \times v = 20i + 14j - 8k QP×v=20i+14j−8k。通过 d i s t a n c e = ∣ a × b ∣ / ∣ a ∣ distance = |a \times b|/|a| distance=∣a×b∣/∣a∣,可知 d ≈ 10.49 d \approx 10.49 d≈10.49。
Python程序
可以通过Python脚本模拟上述过程,代码如下。 n p . c r o s s ( Q P , v ) np.cross(QP, v) np.cross(QP,v)求 Q P × v QP \times v QP×v, n p . l i n a l g . n o r m ( v ) np.linalg.norm(v) np.linalg.norm(v)求 ∣ v ∣ |v| ∣v∣,两者相除之后再进行一次 n p . l i n a l g . n o r m np.linalg.norm np.linalg.norm得到 d = ∣ Q P × v ∣ / ∣ v ∣ d = |QP \times v|/|v| d=∣QP×v∣/∣v∣,结果跟手动计算一致。
import numpy as np
QP = np.array([3,2,11])
v = np.array([1,-2,-1])
h = np.linalg.norm(np.cross(QP, v)/np.linalg.norm(v))
print h