点到向量距离(含Python代码)

###向量间投影和距离

这段时间用到了点到向量的距离,发现已经还给高数老师了。借这篇博客(参考英文博客)总结回顾一下,并且附上Python代码。先回顾下向量点积和叉乘公式, a ⋅ b = ∣ a ∣ ∣ b ∣ c o s ( θ ) a \cdot b = |a||b|cos(\theta) ab=abcos(θ),| a × b ∣ = ∣ a ∣ ∣ b ∣ s i n ( θ ) a \times b| = |a||b|sin(\theta) a×b=absin(θ)

从下图可以看出***b***向量在***a***向量上的投影长度是 ∣ b ∣ c o s ( θ ) |b|cos(\theta) bcos(θ),可以通过***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)(ab/a)。同理,***b***到***a***的距离为 ∣ b ∣ s i n ( θ ) |b|sin(\theta) bsin(θ),可以通过***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+14j8k。通过 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 d10.49

det
det1

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
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值