python和numpy求解圓上一點到直線最小距離
本文探討如何利用Python和NumPy庫計算三維空間中圓上一點到直線的最小距離,并給出該點的坐標。 我們將處理圓與直線不共面的情況。
問題描述
已知圓心 o = (0.3501, -0.0881, -4.8466),圓的法向量 n = (0.4163, -0.8326, -0.3653),圓的半徑 r = 1.34954,以及直線上的兩點 a = (3.1932, -0.9005, 0.8082) 和 b = (1.9885, -0.9691, -0.8353)。 目標是找到圓上一點 p,使其到直線 ab 的距離最小,并計算 p 的坐標。
算法原理
由于圓與直線可能不共面,最小距離并非圓心到直線的垂線距離。我們需要:
- 計算直線的方向向量: 通過 b – a 得到。
- 計算直線的方向向量: 將其標準化,得到單位方向向量。
- 計算圓心到直線的距離向量: 找到圓心到直線上一點的向量,并投影到直線的方向向量上,從而得到圓心到直線的距離。
- 計算圓心到直線垂足的向量: 利用步驟3的結果,計算圓心到直線垂足的向量。
- 計算圓心到直線垂足的向量在垂直于直線的平面上的投影: 這個投影向量指向圓上距離直線最近的點。
- 計算圓上最近點: 將投影向量標準化,乘以圓的半徑,然后加到直線垂足上,得到圓上最近點的坐標。
Python代碼實現
import numpy as np # 輸入數據 o = np.array([0.3501, -0.0881, -4.8466]) n = np.array([0.4163, -0.8326, -0.3653]) r = 1.34954 a = np.array([3.1932, -0.9005, 0.8082]) b = np.array([1.9885, -0.9691, -0.8353]) # 計算直線方向向量 v = b - a v = v / np.linalg.norm(v) # 標準化 # 計算圓心到直線一點的向量 oa = o - a # 計算圓心到直線的距離 d = np.dot(oa, v) # 計算直線垂足 f = a + d * v # 計算圓心到垂足的向量 of = o - f # 計算投影到垂直于直線的平面上的向量 proj = of - np.dot(of, v) * v # 計算圓上最近點 p = f + r * proj / np.linalg.norm(proj) print("圓上距離直線最近的點的坐標為:", p)
代碼解釋
代碼清晰地實現了上述算法步驟。 numpy 庫提供了高效的向量運算,簡化了計算過程。 最終輸出結果為圓上一點 p 的坐標,該點到直線 ab 的距離最小。
立即學習“Python免費學習筆記(深入)”;
這個改進后的版本更加簡潔高效,并對算法步驟進行了更清晰的解釋。
? 版權聲明
文章版權歸作者所有,未經允許請勿轉載。
THE END