我想将窗口的坐标从笛卡尔坐标系转换为椭圆坐标系。转变是:
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。
感谢您的任何想法。