Как я могу найти угол окружности от оси X и Y - PullRequest
0 голосов
/ 21 ноября 2018

Не стесняйтесь, чтобы мой вопрос дублировался.Поскольку я абсолютно ничего не знаю о COS, SIN и TAN, и, возможно, кто-то еще уже задавал этот вопрос.

Итак, я попытался установить круговой индикатор выполнения на основе осей x и y, которые могут быть получены из ввода с геймпада.,Проще говоря, индикатор выполнения - это минимум 0 и максимум 360.

Я попытался немного поискать, но, насколько я понимаю, он работает только с 180 градусами и положительными x и y.Но входной сигнал, который я получаю от контроллера, равен y от -1 до 1 (где x -1 слева и 1 справа, y -1 снизу и 1 сверху)

Вот мой код.

var controller = Windows.Gaming.Input.Gamepad.Gamepads[0].GetCurrentReading();
x = controller.LeftThumbstickX
y = controller.LeftThumbstickY
//what do I have to do from here?
progress.Value = angle; //?

Ответы [ 2 ]

0 голосов
/ 21 ноября 2018

Метод, который вы хотите, это Math.Atan2.Это принимает два аргумента - сначала значение y, затем значение x - и дает вам угол в радианах.

Поскольку вам нужен угол в градусах, вам необходимо преобразовать - коэффициент преобразованияэто 180 / Math.PI.Таким образом, вы будете использовать что-то вроде:

var radiansToDegrees = 180 / Math.PI;
progress.Value = Math.Atan2(y,x) * radiansToDegrees;

В зависимости от того, какая именно комбинация x и y должна соответствовать 0, вам может понадобиться добавить несколько градусов впоследствии.Это как есть даст вам 0 градусов для x = 1, y = 0 и 90 градусов для x = 0, y = 1 и т. Д.

0 голосов
/ 21 ноября 2018

Тригонометрическая функция atan2 является инструментом для этой работы.В C # это реализуется с помощью Math.Atan2:

double angleInRadians = Math.Atan2(y, x);
double angleInDegrees = (180 / Math.PI) * angleInRadians;

Используя эту формулу с (например) параметрами (1,1), вы получите результат 45.

Однако, с точки зрения полярного выравнивания, этот угол измеряется против часовой стрелки от «востока».Чтобы преобразовать это в угол, который измеряется по часовой стрелке от «севера»:

double compassRadians = Math.PI / 2 - angleInRadians;
double compassDegrees = (180 / Math.PI) * compassRadians;

, но теперь мы можем столкнуться с отрицательными значениями, поэтому мы можем нормализовать их следующим методом:

double normalizeDegrees(double a) => ((a % 360) + 360) % 360; //convert to 0-360

тогда

var compassAngle = normalizeDegrees(compassDegrees);
...