0

我想将窗口的坐标从笛卡尔坐标系转换为椭圆坐标系。转变是:

x= e*cosh(eta)*cos(phi)

y= e*sinh(eta)*sin(phi)

和逆:

eta=Re(acosh(x/e+i*y/e))

phi=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。

感谢您的任何想法。

4

1 回答 1

0

我不确定,但请检查您的双倍(乘法)和除法是否产生双倍,即除以常数是 /(double)2 或 /2.0 希望有所帮助

于 2012-11-10T20:53:41.137 回答