ウィンドウの座標をデカルト座標系から楕円座標系に変換したいと思います。変換は次のとおりです。
x= e*cosh(eta)*cos(phi)
y= e*sinh(eta)*sin(ファイ)
そして逆:
eta=Re(acosh(x/e+i*y/e))
ファイ=イム(アコッシュ(x/e+i*y/e))
( http://itp.tugraz.at/~schnizer/AnalyticalMethods/AnMe6%267.pdfの p.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 は、_size で指定された楕円の内側のポイントでは <1、外側のポイントでは >1 でなければなりません。
アイデアをありがとう。