Вычислить угол точки на окружности

Я уже знаю, как найти точку на окружности по углу. Код, который я использую для этого, приведен ниже.

x = Math.sin(Math.toRadians(angle)) * radius;
y = Math.cos(Math.toRadians(angle)) * radius;

Я пытаюсь отменить этот процесс.

Пока что у меня есть этот код, который полностью работает только для углов, меньших или равных 90 градусам.

DecimalFormat df = new DecimalFormat("###.####");

angleFromX = normalize(
    Double.parseDouble(
        df.format(
            Math.toDegrees(
                Math.asin(
                    (x / radius)
                )
            )
        )
    )
);
angleFromY = normalize(
    Double.parseDouble(
        df.format(
            Math.toDegrees(
                Math.acos(
                    (y / radius)
                )
            )
        )
    )
);

А вот метод normalize, использованный выше.

public static double normalize(double angle) {
    angle %= 360;

    if (angle < 0) {
        angle = angle + 360;
    }

    return angle;
}

person eshimoniak    schedule 29.05.2014    source источник


Ответы (1)


Вы перепутали грех и грех.

double x = Math.cos(Math.toRadians(angle)) * radius;
double y = Math.sin(Math.toRadians(angle)) * radius;

Чтобы преобразовать обратно, используйте эту формулу:

double newRadius = Math.hypot(x, y);
double theta = Math.atan2(y,x);
double newAngle = Math.toDegrees(theta);

В зависимости от реализации вам может потребоваться настроить значение тета (угла).

  • Если он находится в квадранте 2 или 3, добавьте 180 градусов.
  • Если он находится в квадранте 4, добавьте 360 градусов.

Также вам может понадобиться добавить:

newAngle = (newAngle+360)%360

Чтобы угол оставался положительным и находился в диапазоне от 0 до 360.

person Anubian Noob    schedule 29.05.2014
comment
Почему вы изменили радиус? - person eshimoniak; 29.05.2014
comment
Изменить? Вы имеете в виду radius = Math.sqrt(x*x + y*y)? - person Anubian Noob; 29.05.2014
comment
Два примера не зависят друг от друга, разве это неясно? - person Anubian Noob; 29.05.2014