我想将窗口的坐标从笛卡尔坐标转换为椭圆坐标系。转型是:
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;
感谢任何想法。
答案 0 :(得分:0)
我不确定但是检查你的double(乘法)和除法产生一个double,即除以常数是/(double)2或/2.0 希望有帮助