1. 程式人生 > >點到向量距離(含Python程式碼)

點到向量距離(含Python程式碼)

向量間投影和距離

這段時間用到了點到向量的距離,發現已經還給高數老師了。借這篇部落格(參考英文部落格)總結回顧一下,並且附上Python程式碼。先回顧下向量點積和叉乘公式,ab=|a||b|cos(θ)a×b=|a||b|sin(θ)

從下圖可以看出b向量在a向量上的投影長度是|b|cos(θ),可以通過ba的點積除以a的長度,實際的投影向量projab=(a/|a|)(ab/|a|)。同理,ba的距離為|b|sin(θ),可以通過ba的叉乘除以a

的長度得到,即orthab=(a×b)/|a|。可知distance=|a×b|/|a|,並且b=projab+orthab

內積

點到向量的距離

考慮下圖中上半部分,求點P到直線L的距離,其中L的方向向量是v。任取直線上一點Q,d=|QP×v|/|v| ,設P點座標為(1,3,8),Q點座標是(-2,1,3),可知QP=<3,2,11>,另設v=<1,2,1>

距離

通過叉乘的計算公式(如下圖,聯想行列式計算公式),我們可知

QP×v=20i+14j8k。通過distance=|a×b|/|a|,可知d10.49

det
det1

Python程式

可以通過Python指令碼模擬上述過程,程式碼如下。np.cross(QP,v)QP×vnp.linalg.norm(v)|v|,兩者相除之後再進行一次np.linalg.norm得到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