В чем отличие от atan(y/x) и atan2(y,x) в OpenGL GLSL

У меня есть некоторые проблемы в понимании результата функции atan в glsl. Документация также отсутствует.

Например, мне нужно преобразовать вершину в сферические координаты, преобразовать радиус сферической координаты и затем преобразовать ее обратно в декартовы координаты. Я использую следующее преобразование на вершинах икосферы радиуса 2 с центром в 0.

vec3 to_sphere(vec3 P)
{
    float r = sqrt(P.x*P.x + P.y*P.y + P.z*P.z);
    float theta = atan(P.y,(P.x+1E-18));
    float phi= acos(P.z/r); // in [0,pi]
    return vec3(r,theta, phi);
}

vec3 to_cart(vec3 P)
{
    float r = P.x;
    float theta = P.y;
    float phi = P.z;
    return r * vec3(cos(phi)*sin(theta),sin(phi)*sin(theta),cos(theta);
}

void main()
{
    vec4 V = gl_Vertex.xyz;
    vec3 S = to_sphere(V.xyz);
    S.x += S.y;
    V.xyz = to_cartesian(S);

    gl_Position = gl_ModelViewProjectionMatrix * V;
}

но результат будет другим, если я использую atan(y/x) или же atan2(y,x), Я положил маленький 1E-18 постоянная, чтобы избежать полюса.

Почему это поведение? Я предполагаю, что значение, возвращаемое atan(y/x) а также atan2(y,x) имеет разный диапазон. В частности, в этой реализации я думаю, что theta должен варьироваться от [0-Pi] в то время как Phi варьируется в [0,2Pi],

Я прав? Существуют ли более точные численные реализации преобразований сферических координат?

1 ответ

atan2 правильно учитывает все 4 сектора и может иметь дело с x==0,

atan2(-1,-1) правильно возвращается -3/4*PI в то время как atan(-1/-1) вернется 1/4*PI

Другие вопросы по тегам