2012-11-10 132 views
0

我想將窗口的座標從笛卡爾座標轉換爲橢圓座標系。該變換是:C++橢圓座標映射

X = E * COSH(ETA)* COS(PHI)

Y = E *的sinh(ETA)* SIN(PHI)

和逆:

ETA =重新(ACOSH(X/E + I * Y/E))

披= IM(ACOSH(X/E + I * Y/E))

(見的http://itp.tugraz.at/~schnizer/AnalyticalMethods/AnMe6%267.pdf第14頁)

到目前爲止,我實現了以下內容:

cv::Size2f _size(33,70); 
float e = 0.0f; 
float eta0 = 0.0f; 
if(_size.height > _size.width) 
{ 
    e = sqrt(_size.height*_size.height - _size.width*_size.width); 
    std::complex<double> z0(0,_size.height/2/e); 
    eta0 = std::acosh(z0).real(); 
} else 
{ 
    e = sqrt(_size.width*_size.width - _size.height*_size.height); 
    std::complex<double> z0(_size.width/2/e,0); 
    eta0 = std::acosh(z0).real(); 
} 

for(int dx = ceil(-_size.width/2); dx < floor(_size.width/2); dx++) 
{ 
    for(int dy = ceil(-_size.height/2); dy < floor(_size.height/2); dy++) 
    { 
     float eta; 
     float phi; 
     if((dx == 0) && (dy == 0)) 
     { 
      eta = 0.0f; 
      phi = 0.0f; 
     }else 
     { 
      std::complex<double> z(dx/e,dy/e); 
      std::complex<double> k = std::acosh(z); 
      eta = (k.real())/eta0; 
      phi = fmod(k.imag() + 2.0f*CV_PI, 2.0f*CV_PI); 
     } 
     int x = 200 + dx; 
     int y = 200 + dy; 
    }  
} 

的問題是,橢圓座標不能擴展。 eta總是大於1,但它應該在0 < eta < inf之間縮放。對於橢圓內部的點,Eta應該爲< 1,由_size指定,對於外部點,> 1。

感謝您的任何想法。

+0

也許你應該說一些更多你想解決的問題。 – Nobody

回答

0

我不知道,但檢查你的雙(乘法)和除法運算產生了雙重即由常數鴻溝要麼/(雙)2或/2.0 希望幫助