2012-12-12 76 views
1

在我正在進行的光線追蹤任務中,我必須計算從相機拍攝的光線的X偏移量;偏移量計算如下相同浮點計算的不同結果

FovY作爲輸入給出;當我讀取變量時,我已經將它轉換爲弧度。

OffsetX = tan (FovX/2) * ((col - (width/2))/(width/2))

FovX = tan(FovY/2) * aspect = tan(FovY/2) * (width/height)

代入原方程,並編寫代碼:

float OffsetX = tan(FovY/2.0f) * (width/height) * ((col - (width/2.0f))/(width/2.0f)); 

給了我一個不正確的擴展圖像,我花了時間得到它的權利,這是在發現簡化它之後相同的方程式運作後。

最終重新排列的方程爲:

float OffsetX = tan(FovY/2.0f) * (2.0f/height) * (col - (width/2.0f)); 

我試着調試乃至結果對於兩個方程不同。

會有什麼四捨五入錯誤的某種?有人可以向我解釋這個怪癖嗎?

#include <cmath> 
#include <iostream> 
#include <cstdint> 

using namespace std; 

int main() 
{ 
    const float PI = 3.1415f; 
    const uint32_t width = 160, height = 120; 
    const auto fovy = (30.0f * (PI/180.0f)); 
    size_t j = 0; 
    auto alpha = (tan(fovy/2.0f) * (width/height)) * (((j + 0.5f) - (width/2.0f))/(width/2.0f)); 
    cout << alpha << endl; 
    alpha = tan(fovy/2.0f) * (2.0f/height) * ((j + 0.5f) - (width/2.0f)); 
    cout << alpha << endl; 
} 
+1

請您提供表示計算結果並示出某些輸入,其中這兩種方法的發散兩種方式的完整的可運行的例子。它會消除你的問題中的許多含糊之處。 – NPE

+2

除非您可以顯示兩種不同的代碼片段來重現與您有關的任何行爲,否則很難提供幫助 –

+0

當我發現它需要時,我花了幾分鐘時間用代碼對其進行更新;在那裏有人已經投下了這個問題:( – legends2k

回答

6

讓我猜測:寬度和高度是整數。

當你這樣做:

(width/height) 

你得到整數除法,其中丟棄結果的小數部分。如果你反而這樣做:

((double)width/height) 

然後這兩個結果將打賭幾乎相同。


一邊

作爲,可以進一步簡化該表達式:

tan(FovY/2.0f) * (2.0f*col - width)/height 
+0

哇!在我的代碼文章之前,你已經猜到了!驚人的:) – legends2k

+4

這是一個常見的錯誤,而心理調試是我的特長。 =) –

+0

@StephenCanon:那讓我更容易爲你提交錯誤報告。 –

相關問題