2014-10-27 34 views
1

假設您獲得了一個要測試的3D點以及另外兩個代表立方體最大值和最小值的3D點。確定3D點是否在軸對齊的立方體內的最快方法?

顯而易見的解決方案使用,在最壞的情況,6條條件語句如下:

if (point.x < cubemin.x || point.y < cubemin.y || point.z < cubemin.z 
|| point.x > cubemax.x || point.y > cubemax.y || point.z > cubemax.z) 
    return false; //is not within cube 
return true; //is within cube 

條件語句是一些最計算昂貴的指令來執行。是否有任何的方式來減少所需的檢查次數?這種情況下的性能至關重要。

+0

「計算量很大」的部分是有一個分支的事實,而不是它有6個測試。我看不出如何減少測試的次數。 – ooga 2014-10-27 03:39:00

+0

@ooga你是說每個測試都不等於新的分支,否則不需要額外的分支預測? – Slight 2014-10-27 03:54:19

+0

你不告訴數據類型,這是必不可少的信息!你的內點或外點更頻繁嗎?你嘗試過使用按位還是|而不是邏輯或|| ? – 2014-10-27 09:23:03

回答

2

在數學上,沒有其他方法可以解決最多6個比較問題。

但是,在計算機體系結構方面,可以並行執行所有操作。 矢量計算機可以並行處理大量類似的東西(比如最大和最小等的比較)。

所以,這取決於你的程序將在什麼平臺上實現,並且該平臺是否提供了一些向量指令。或者極其重要的是,如果你的工作如此重要,你可能會嘗試製造自己的ASIC CPU芯片。

2

有這一招,以減少測試次數(我不建議使用它...):

假設所有座標是無符號整數,然後xmin <= x && x <= xmax可降至x - xmin <= xmax - xmin

  1. 如果xmin <= x && x <= xmax,則按預期返回true
  2. 如果xmax < x,然後x - xmin > xmax - xmin,所以這返回false如預期。
  3. 如果x < xmin,然後x - xmin環繞(給出MAX_UINT + 1 + x - xmin)和xmax - xmin < MAX_UINT + 1 + x - xmin,所以這返回false按預期方式。
+0

這實際上是爲減法進行交易比較。計算的成本幾乎相同。 (兩個比較+一個邏輯OR或兩個減法+一個比較) – 2014-11-04 02:15:53

相關問題