向量法计算空间点到线段的距离(python)
中學(xué)數(shù)學(xué)告訴我們,計(jì)算點(diǎn)到線段的距離有兩種。
我們假設(shè)點(diǎn)是P,線段是AB。P和AB都由三維的笛卡爾坐標(biāo)表示。現(xiàn)計(jì)算P到AB的距離。
第一種是,過(guò)點(diǎn)P向線段AB上畫(huà)垂線,判斷垂足有沒(méi)有落在線段上。如果落在線段上,ok,距離就是垂線段的長(zhǎng)度;如果沒(méi)有,則距離轉(zhuǎn)化為點(diǎn)到線段兩端點(diǎn)的距離。
另一種方法是,獲取線段向量AB、以及點(diǎn)P與線段一端點(diǎn)組成的向量(AP或BP)。將這兩個(gè)向量做點(diǎn)乘AB·AP,點(diǎn)乘結(jié)果即為向量AP在AB上的投影。這時(shí)只需比較投影和AB的關(guān)系即可:投影小于零,說(shuō)明P在A的外側(cè),距離為AP的模長(zhǎng);投影大于0小于AB,說(shuō)明P在AB中間,距離是垂足距離,這個(gè)距離也可以用向量算出來(lái);投影大于AB,說(shuō)明P在B的外側(cè),距離為PB的長(zhǎng)。
原理部分我簡(jiǎn)單的寫(xiě)寫(xiě)了,不清楚的自行查閱中學(xué)數(shù)學(xué)教材。
顯然,向量法的計(jì)算量要遠(yuǎn)小于第一種方法的。
我在做項(xiàng)目的時(shí)候,在網(wǎng)上找現(xiàn)成的代碼。沒(méi)有找到使用第二種向量法、用python寫(xiě)出的。于是自己大概復(fù)習(xí)了下原理,寫(xiě)了一個(gè)代碼。
python代碼如下:
import math import numpy as np from numpy import *#這里我給定了點(diǎn)P和線段AB兩端點(diǎn)的坐標(biāo) a = np.asarray([-1,1,0]) b = np.asarray([1,1,0]) p = np.asarray([0,0,0])#計(jì)算用到的向量 ab=b-a ap=p-a bp=p-b #計(jì)算投影長(zhǎng)度,并做正則化處理 r = np.dot(ap,ab)/(np.linalg.norm(ab))**2 #分了三種情況 if r > 0 and r < 1:dis = math.sqrt((np.linalg.norm(ap))**2 - (r * np.linalg.norm(ab))**2) elif r >= 1:dis = np.linalg.norm(bp) else:dis = np.linalg.norm(ap) print(dis) #dis即為所求總結(jié)
以上是生活随笔為你收集整理的向量法计算空间点到线段的距离(python)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 什么牌子的蓝牙耳机耐用?2023年最值得
- 下一篇: 程矢Oracle PowerDesign