Ольга Латушкина
Ольга Латушкина

Вращение камеры вокруг заданной точки и своей оси (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;
}

МН
Максим Нееми

Мне немного лень, уж извини, так что нашел я только один глюк. Просто оставлю комментарии, сам посмотри.. .
//Удерживать полярные координаты в пределах [0..2*PI]
void check_polar(v_polar &polar)
{
double coef = polar.teta/(2*M_PI);//сколько 2Pi укладывается в teta
if (abs(coef) >= 1)//если teta не от -2Pi до 2Pi
{
coef -= floor(coef);//оставляем от coef дробную часть. Дробная часть всегда положительная (!)
polar.teta = 2*M_PI*coef;//возвращаем в teta 2*Pi*(дробная часть)
}
if (coef < 0)//если coef попадает в (-1,0) (!)
{
polar.teta = 2*M_PI - polar.teta;//то угол заменяем на обратный (!), сдвинутый на 2*M_PI
}
Что после этих хитрых преобразований будет в teta - ХЕЗ. На будущее - есть функция fmod, но она возвращает от -делимое до делимое.
Варианты: 1)teta=-2*M_PI*floor(teta/(2*M_PI));
2) teta=fmod(teta,2*M_PI)*2*M_PI;
if(teta<0)teta+=2*M_PI;

Пара уточнений:
Во-первых, если уже пользуешься конструкторами, пиши все в ООП. Не пользуешься - не пиши конструкторы.
Во-вторых, не повторяй код. Если проверка угла на диапазон происходит 2 раза - создай одну функцию, которая будет возвращать угол в диапазон.

Похожие вопросы
У какой планеты самая большая скорость вращения вокруг своей оси???
что является причиной вращения Земли вокруг своей оси
Следствием вращения Земли вокруг своей оси является (-ются):
как найти относительные координаты центра дуги после вращения вокруг заданной точки
вращение земли вокруг своей оси?
Что будет с населением планеты, если скорость вращения вокруг своей оси увеличится?
какие выводы вращения земли вокруг своей оси и солнца
Как, кроме как случайностью, можно объяснить что скорости вращения Луны вокруг своей оси и вокруг земли совпадают.
Объясните особенности вращения Венеры и Урана вокруг своих осей
Можно ли считать земной шар материальной точкой при вращении его вокруг своей оси?