想象一下笛卡爾空間中三角形的表面。我怎樣才能找到三角形表面上給定點的距離?查找三維空間中三角形的點距離
點1:[30,24,22]
點2:[35,13,19]
點3:[21,29,85]
在這種情況下,有多遠距上面定義的三角形表面的點[40,25,77]?
或者特別是 - 公式是什麼來確定這個距離?
想象一下笛卡爾空間中三角形的表面。我怎樣才能找到三角形表面上給定點的距離?查找三維空間中三角形的點距離
點1:[30,24,22]
點2:[35,13,19]
點3:[21,29,85]
在這種情況下,有多遠距上面定義的三角形表面的點[40,25,77]?
或者特別是 - 公式是什麼來確定這個距離?
我會假設你的意思最小距離。否則,距離會根據您選擇的三角形上的哪個點而變化。要看到這一點,只需在桌子上畫一個三角形,並在上面畫一支筆。
簡短的回答是,找到的最小距離,你需要建立一個矩陣,每列一個點,就像這樣:
[ 30 35 21 ]
A = [ 24 13 29 ]
[ 22 19 85 ]
而對於細節讀about projections。如果你研究過這種東西已經有一段時間了,不要被嚇倒。這不是火箭科學(實際上,也許是火箭科學的入門),但需要一些投資才能理解。爲了幫助你,我會首先提及一些理論,然後討論實施。
給你一些直覺,堅持那支筆。
讓我們從最簡單的情況開始:爲了獲得最小的距離,請將筆垂直於桌子,筆的末端放在三角形的某處。將您的觀點描繪爲筆尖。你只是證明了三角形中最接近你點的三角形中的點是投影到三角形中三點所定義的空間上的點。換句話說,筆的另一端。三角形中的任何其他點必須具有比筆長更長的距離。
現在我們來看看一個複雜化。假設你想要的點不是完全位於三角形的「上方」,而是位於某處。說,完全離開桌子的表面。在這種情況下,距離該點最近的三角形中的點將是其自身的三個點中的一個,或者是連接三個初始點的三條線段上的一個點。
現在的實施:瘦身是,如果你可以使用一個簡單的圖書館的線性代數,你會爲自己節省很多的悲傷。最難的步驟是反轉矩陣,而反轉3x3矩陣通常很容易,當點是共線時(即考慮三點對齊),當幅度非常不同時,它會變得複雜(即,想象一個非常長的三角形)等等。
你可以針對這個問題編寫一個特定於問題的算法,因爲它只有3x3,但是在一天結束時你需要解算投影系統,所以你的算法會做基本相同的數學運算在維基百科頁面上。所以你最終可能會重新發現線性代數,這是浪費大量時間的一種可靠方法。
我最近的實施建議是檢查遊戲或3D庫中的關鍵字「投影」。如果幸運的話,你可以打電話給你。否則,得到一些體面的CLR線性代數庫,建立矩陣,並有效地完成整個計算,並在100行代碼左右。
非常感謝所有這些偉大的信息獅子座。就在我閱讀本文之前,我發現了以下matlab函數:http://www.mathworks.com/matlabcentral/fileexchange/22857-distance-between-a-point-and-a-triangle-in-3d似乎完全正確我想要的是。現在我只需要將該代碼「移植」到c#。嗯 - 聽起來很有趣! :) – eejai42 2013-05-06 03:54:16
不客氣!如果您使用底層庫,請在此處更新。 – Leo 2013-06-03 02:58:49
嗨eejai42,感謝您的鏈接到filexchange。你會如此友善地分享你所做的C#代碼嗎? – Nic 2016-06-21 15:42:40
這一切都取決於你想要的距離來自哪裏(三角形的哪個部分?)。如果你知道三角形的點從(中心也許?)開始,然後,從數學的角度來看,其公式爲:
Point 1: [a1,b1,c1] (point on triangle)
Point 2: [a2,b2,c2] (point to find distance to)
distance vector = [a2-a1, b2-b1, c2-c1]
distance = the magnitude of above = sqrt((a2-a1)^2 + (b2-b1)^2 + (c2-c1)^2))
我不知道C#,但是這將是它的僞代碼(它背後的數學)
編輯:要查找三角形的中心......
Point 1: [x1, y1, z1]
Point 2: [x2, y2, z2]
Point 3: [x3, y3, z3]
Centre = [(x1+x2+x3)/3, (y1+y2+y3)/3, (z1+z2+z3)/3]
http://math.stackexchange.com/? – spender 2013-05-06 01:53:41