2011-03-17 37 views
0

我在this paper中實現了系統,我已經正確實現了徑向張量場的實現。這個張量的正確解決方案

在這個系統中的所有張量是3頁上給出的形式,部分4

R [ cos(2t), sin(2t); sin(2t), -cos(2t) ] 

徑向張量場被定義爲:

R [ yy - xx, -2xy; -2xy, -(yy-xx) ] 

在我的系統我只存儲R和Theta,因爲我可以根據這些信息計算張量。這意味着我需要計算徑向張量的R和Theta。不幸的是,我在這方面的嘗試失敗了。雖然看起來是正確的,但我的解決方案在左上角和右下角象限中失敗。

附錄:繼評論中關於系統映像無法正常工作的討論後,我也會在這裏寫一些硬編碼。 整個張量場是800x480,中心點位於{400,240},我們使用y軸爲負的標準圖形座標系(即左上角的原點)。

在{400,240},該張量爲R = 0,T = 0 在{200,120},該張量是R = 2.95936E + 9,T = 2.111216 在{600,120},張量是R = 2.95936E + 9,T = 1.03037679

我可以輕鬆地採樣任何更多的點,你認爲可能有所幫助。

我使用計算值的代碼是:

float x = i - center.X; 
float xSqr = x * x; 
float y = j - center.Y; 
float ySqr = y * y; 

float r = (float)Math.Pow(xSqr + ySqr, 2); 
float theta = (float)Math.Atan2((-2 * x * y), (ySqr - xSqr))/2; 
if (theta < 0) 
    theta += MathHelper.Pi; 
+3

特徵向量具有Tan []和Cotg []函數。你有沒有檢查你是否使用atan2等價物(以你的編程語言爲準)而不是atan? – 2011-03-17 22:59:21

回答

2

顯然您比較式(1)和(2)的紙張。注意標量倍數l = || (u_x,u_y)||在公式(1)中,並且在R中早期識別那個。這個因素在公式(2)中是隱含的,所以爲了使它們匹配,我們必須將R排除。

x = xp - x0 
y = yp - y0 

,以形成給定的2×2矩陣:

y^2 - x^2  -2xy 

    -2xy  -(y^2 - x^2) 

我們需要分解出一個

式(2)與來自「中心」的徑向地圖的(x0,y0)偏移工作從這個矩陣的標量R鍵得到一個無痕跡正交2×2矩陣如式(1):

cos(2t)  sin(2t) 

sin(2t)  -cos(2t) 

由於cos^2(2t) + sin^2(2t) = 1的因子R可被標識爲:

R = (y^2 - x^2)^2 + (-2xy)^2 = (x^2 + y^2)^2 

留下無痕跡正交2×2矩陣:

C   S 

    S   -C 

從該角度「黃褐色(2T)= S/C`可以通過提取反三角函數。

好吧,差不多。隨着belisarius警告,我們需要檢查角度t是否在正確的象限。該論文的作者在第二部分的開頭寫道。4根據公式R [ cos(2t), sin(2t); sin(2t) -cos(2t) ],它們的「t」(它是指張量)取決於R >= 0和theta(你的t)位於[0,2pi)。

由於正弦和餘弦的週期爲2pi,t(θ)只能在長度爲pi的區間內唯一確定。我懷疑作者的意圖是要麼寫2t在[0,2pi]或更多,只要它位於[0,pi]。 belisarius建議使用「atan2等效」將避免任何零分。我們可能(如果函數返回一個負值)需要添加pi使t >= 0。這相當於將2π加到2t,所以它不會影響無痕正交矩陣中條目的符號(因爲在公式(1)和(2)中符號的模式應該是一致的)。

+1

+1(可能)紙張錯誤 – 2011-03-18 20:00:57

+0

好的,我終於實現了這一點,它在左右象限中工作,但有一條中間線,它不會過渡。 http://i.imgur.com/5YgWm.png – Martin 2011-03-20 18:46:53

+0

@Martin:我看了一下這幅畫,它很引人注目,但我不知道它告訴我們什麼。有沒有辦法可以發佈一些數字,例如對於點'(x0,y0)'和'(xp,yp)',所以我們可以通過一個例子? – hardmath 2011-03-20 23:22:18

相關問題