向量法计算空间点到线段的距离(python)
生活随笔
收集整理的這篇文章主要介紹了
向量法计算空间点到线段的距离(python)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
中學數學告訴我們,計算點到線段的距離有兩種。
我們假設點是P,線段是AB。P和AB都由三維的笛卡爾坐標表示。現計算P到AB的距離。
第一種是,過點P向線段AB上畫垂線,判斷垂足有沒有落在線段上。如果落在線段上,ok,距離就是垂線段的長度;如果沒有,則距離轉化為點到線段兩端點的距離。
另一種方法是,獲取線段向量AB、以及點P與線段一端點組成的向量(AP或BP)。將這兩個向量做點乘AB·AP,點乘結果即為向量AP在AB上的投影。這時只需比較投影和AB的關系即可:投影小于零,說明P在A的外側,距離為AP的模長;投影大于0小于AB,說明P在AB中間,距離是垂足距離,這個距離也可以用向量算出來;投影大于AB,說明P在B的外側,距離為PB的長。
原理部分我簡單的寫寫了,不清楚的自行查閱中學數學教材。
顯然,向量法的計算量要遠小于第一種方法的。
我在做項目的時候,在網上找現成的代碼。沒有找到使用第二種向量法、用python寫出的。于是自己大概復習了下原理,寫了一個代碼。
python代碼如下:
import math import numpy as np from numpy import *#這里我給定了點P和線段AB兩端點的坐標 a = np.asarray([-1,1,0]) b = np.asarray([1,1,0]) p = np.asarray([0,0,0])#計算用到的向量 ab=b-a ap=p-a bp=p-b #計算投影長度,并做正則化處理 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即為所求總結
以上是生活随笔為你收集整理的向量法计算空间点到线段的距离(python)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 什么牌子的蓝牙耳机耐用?2023年最值得
- 下一篇: websocket python爬虫_p