Я хотел бы преобразовать координаты окна из декартовой в эллиптическую систему координат. Преобразование это:
x = e * cosh (eta) * cos (phi)
у = е * синх (эта) * грех (фи)
и обратный:
ETA = Re (ACOSH (х / е + я * у / е))
фи = Im (ACOSH (х / е + я * у / е))
(см. стр. 14 из http://itp.tugraz.at/~schnizer/AnalyticalMethods/AnMe6%267.pdf)
До сих пор я реализовал следующее:
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;
}
}
Проблема в том, что эллиптические координаты не масштабируются. Эта всегда больше 1, но она должна масштабироваться между 0 < расчетное время прибытия < инф. Эта должна быть <1 для точек внутри эллипса, заданного параметром _size, и> 1 для точек снаружи.
Спасибо за любые идеи.
Я не уверен, но проверяю, что ваши double (умножение) и деление производят double, т.е. деление на константы либо / (double) 2, либо /2.0
надеюсь, что поможет
Других решений пока нет …