Вращение камеры вокруг заданной точки и своей оси (OpenGL). ЧЯДНТ?
Какие-то непонятные проблемы с преобразованием координат в полярные и обратно. При изменении и преобразовании координат они выводятся в консоль, и если преобразовать в полярные, а затем обратно, то получатся другие координаты, отличные от исходных. Не могу понять, где и что не так посчитано. Полный код могу выслать на почту.
Вот код, который используется для преобразований: :
//Структура, описывающая полярные координаты
struct v_polar
{
double radius, alfa, teta;
v_polar()
{
v_polar(0, 0, 0);
}
v_polar(double R, double ALFA, double TETA)
{
radius = R;
alfa = ALFA;
teta = TETA;
}
};
// Структура, описывающая декартовы координаты
struct v_xyz
{
double x, y, z;
v_xyz()
{
v_xyz(0, 0, 0);
}
v_xyz(double X, double Y, double Z)
{
x = X;
y = Y;
z = Z;
}
};
v_xyz operator - (const v_xyz &a, const v_xyz &b)
{
return v_xyz(a.x - b.x, a.y - b.y, a.z - b.z);
}
v_xyz operator + (const v_xyz &a, const v_xyz &b)
{
return v_xyz(a.x + b.x, a.y + b.y, a.z + b.z);
}
//Удерживать полярные координаты в пределах [0..2*PI]
void check_polar(v_polar &polar)
{
double coef = polar.teta/(2*M_PI);
if (abs(coef) >= 1)
{
coef -= floor(coef);
polar.teta = 2*M_PI*coef;
}
if (coef < 0)
{
polar.teta = 2*M_PI - polar.teta;
}
coef = polar.alfa/(2*M_PI);
if (abs(coef) >= 1)
{
coef -= floor(coef);
polar.alfa = 2*M_PI*coef;
}
if (coef < 0)
{
polar.alfa = 2*M_PI - polar.alfa;
}
}
v_xyz polar_to_dekartian(v_polar &polar)
{
check_polar(polar);
double X = cos(polar.alfa)*sin(polar.teta)*polar.radius;
double Y = cos(polar.teta)*polar.radius;
double Z = sin(polar.alfa)*sin(polar.teta)*polar.radius;
return v_xyz(X, Y, Z);
}
v_polar dekartian_to_polar(const v_xyz &dekartian)
{
v_polar polar;
polar.radius = sqrt(dekartian.x*dekartian.x + dekartian.y*dekartian.y + dekartian.z*dekartian.z);
if (polar.radius == 0)
{
polar.alfa = 0;
polar.teta = 0;
return polar;
}
else
{
polar.teta = acos(dekartian.y/polar.radius);
polar.alfa = atan2(dekartian.z, dekartian.x);
}
check_polar(polar);
return polar;
}