c ++椭圆坐标映射

时间:2012-11-10 20:06:31

标签: c++ transformation

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

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

y = e * sinh(η)* 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到0之间。 eta&lt; INF。对于椭圆内的点,Eta应该<1;由_size指定,对于外面的点指定为&1;

感谢任何想法。

1 个答案:

答案 0 :(得分:0)

我不确定但是检查你的double(乘法)和除法产生一个double,即除以常数是/(double)2或/2.0 希望有帮助