2012-11-18 22 views
4

檢查點積是否接近0應該有多大?檢查點積是否接近0應該有多大?

我正在開發光線跟蹤項目,我需要檢查點積是否爲0,但 可能永遠不會發生,所以我想將其作爲0,如果它的值在小型 區域[ eps,+ eps],但我不確定eps應該有多大?

謝謝

+4

這取決於很多因素,比如什麼樣的計算導致了你比較的向量,什麼會影響每個方向的錯誤決策。 – MvG

回答

1

由於您將此描述爲光線跟蹤項目的一部分,因此您所需的準確度可能由場景的「世界座標」或甚至是翻譯過的屏幕座標決定。這兩者中的任何一個都可以爲計算中的絕對誤差提供可接受的目標。

從中可能退化到您正在進行的中間計算所需的準確度,例如形成一個「理論上」假設爲零的內積。例如,您可能試圖找到兩個光滑物體之間的最短路徑(反射光),並且內積的消失(垂直度)給出了一個點的位置。

在這種情況下,內積可能是您尋求的未知數(點的位置)的二次方。未知數可能形成一個「雙根」(重數爲2的零),使得該根的位置對內積的計算非常敏感,爲零。

對於這樣的情況,您希望獲得內部產品中位數「零」數量的大致兩倍,這是位置精度所需的。基本上,內部產品變化非常緩慢,位於雙根附近。

但您的應用程序可能不那麼敏感;所涉及的算法分析是必要的,以給你一個很好的答案。作爲一般規則,我以雙精度來做內積​​以獲得單精度可靠的答案,但如果要實時進行光線追蹤,這可能會代價太高。

1

還沒有確定的答案。我使用兩種方法。

如果您只關心浮點錯誤,那麼您可以使用相當小的值,這與編譯器可以處理的最小浮點數相當。在c/C++中,您可以使用float.h中提供的定義(例如DBL_MIN)來檢查這些數字。我會使用數字的一小部分,例如10. * DBL_MIN作爲eps的值。

如果問題不是浮點數學舍入誤差,那麼我使用與最小向量的模值相比較小的值(比如1%)。