我有3個點(A,B和X)和距離(d)。我需要做一個函數來測試點X比線段AB上的任何點的距離d更近。快速幾何接近式謂詞
問題是,首先,我的解決方案是否正確,然後提出更好(更快)的解決方案。
我第一遍是如下
AX = X-A
BX = X-B
AB = A-B
// closer than d to A (done squared to avoid needing to compute the sqrt in mag)
If d^2 > AX.mag^2 return true
// closer than d to B
If d^2 > BX.mag^2 return true
// "beyond" B
If (dot(BX,AB) < 0) return false
// "beyond" A
If (dot(AX,AB) > 0) return false
// find component of BX perpendicular to AB
Return (BX.mag)^2 - (dot(AB,BX)/AB.mag)^2 < d^2
此代碼將最終成爲一個大的集合P的的和一大組的A/B/d三聯體與找到P的全部的是通的意圖運行對於至少一個A/B/D,所以我懷疑有一種方法可以降低總體成本,但我還沒有研究過。
(順便說一句:我知道一些重新排序,一些臨時的價值觀和一些代數恆等式可以降低上述成本我只是省略了對它們的清晰度。)
編輯:這是一個這可以推廣到3D 2D問題(但解決辦法是冷靜
編輯:在進一步的思考,我想到的命中率是50%左右,可在嵌套層次結構來形成X點,所以我希望能。把大的子樹修剪爲全通和全失敗,限制三元組的A/B/d將更多的是tr ICK。
編輯:d與AB的數量級相同。
編輯:Artelius發佈了一個不錯的解決方案。我不確定自己在完全理解它之前是否正確地理解了他正在切入的內容。反正另一個想法浮現在腦海的結果:
- 首先Artelius'位,預cacluate將放置AB爲中心的矩陣吃的起源和與X軸對齊。 (2增加了,4個MULS和2相加)
- 它摺疊所有入第一象限(2個絕對)
- 規模在X & y以使該區域的中央部分到一個單位區域(2 MUL)
- 測試如果點是在正方形(2試驗)被如此退出
- 測試端蓋(返回到未縮放的值
- 平移x到末端放置在原點(1只添加)
- 平方並加(2 mul,1加)
- 比較d^2(1個CMP)
我相當肯定,這勝過我的解決方案。
(如果沒有更好的走來宋Artelius得到「獎賞」 :)
FWIW實現語言是d :)(你/是/是bengi史密斯吧?) – BCS 2008-10-31 21:47:03