Кстати, немного про atan2(y, x)
Функция определена для любых x и y, кроме x=y=0 и выдает результат от -pi до +pi, правильно определяя квадрант. Фактически она полагает при вычислении угла A, что y = K*sin(A), а x = K*cos(A), где K = 1/sqrt(x^2 + y^2)
Относительно недавно напоролся на интересный момент, связанный со случаем когда x = 0
Понятно, что в этом случае функция должна вернуть либо +pi/2 либо -pi/2 и определяется это знаком y. Но тут кроется засада, знак может иметь не только y, но и 0. В двоичном представлении числа с плавающей точкой ноль может иметь два написания: все биты 0 (т.н. +0) или старший бит 1, а остальные 0 (т.н. -0). При сравнении естественно полагается, что +0 = -0, но при вычислении atan2(y, x) = atan(y/x) из-за -0 может происходить инверсия результата. Разумеется это зависит от реализации функции в конкретном процессоре или библиотеке. Мне этот эффект попался на ARM платформе (iOS), в этих процессорах нет поддержки вычисления каких-либо тригонометрических функций самим процессором, все делается в соответствующей библиотеке и зависит от примененных в ней алгоритмов.