C++ c++;椭圆坐标映射

C++ c++;椭圆坐标映射,c++,transformation,C++,Transformation,我想把窗口的坐标从笛卡尔坐标系转换成椭圆坐标系。转变是: x=e*cosh(eta)*cos(phi) y=e*sinh(预计到达时间)*sin(φ) 与之相反: eta=Re(acosh(x/e+i*y/e)) phi=Im(acosh(x/e+i*y/e)) (见本报告第14页) 到目前为止,我实施了以下措施: cv::Size2f _size(33,70); float e = 0.0f; float eta0 = 0.0f; if(_size.height > _size.widt

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

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

y=e*sinh(预计到达时间)*sin(φ)

与之相反:

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

phi=Im(acosh(x/e+i*y/e))

(见本报告第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;
    }    
}
cv::Size2f\u size(33,70);
浮球e=0.0f;
浮动eta0=0.0f;
如果(\u size.height>\u size.width)
{
e=sqrt(_size.height*_size.height-_size.width*_size.width);
标准:复合材料z0(0,尺寸高度/2/e);
eta0=std::acosh(z0).real();
}否则
{
e=sqrt(_size.width*_size.width-_size.height*_size.height);
标准:复合材料z0(尺寸宽度/2/e,0);
eta0=std::acosh(z0).real();
}
对于(int dx=ceil(-u size.width/2);dx
问题是,椭圆坐标不能缩放。eta始终大于1,但应在0
谢谢您的建议。

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

也许你应该多说一些你想解决的问题。