Рассчитать градусы угла, используя координаты x, y - PullRequest
0 голосов
/ 20 января 2019

Моя цель - вычислить сопротивление пользователя пальцем вокруг центральной точки экрана, и я попробовал несколько неудачных попыток, используя Math.Atan2 (). К вашему сведению, я использую SkiaSharp в приложениях Xamarin, но для простоты мне просто нужна помощь по приведенному ниже сценарию.

Используя приведенный ниже снимок экрана, может кто-нибудь сказать мне, как лучше получить следующие результаты?

A = 0 градусов

B = 90 градусов

C = 180 градусов

D = 270 градусов

enter image description here

1 Ответ

0 голосов
/ 20 января 2019

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

  1. Поскольку вам нужен угол относительноцентр, вы должны вычесть координаты центра из ваших точек.

  2. Math.Atan2 дает радианы.Преобразуйте их в градусы с помощью degrees = radians * 180 / pi.

  3. Ваш нулевой угол не обычный, как на оси X, а на оси Y.Для исправления добавьте 90 градусов.

Использование векторного типа облегчает задачу.Здесь я буду использовать структуру System.Numerics.Vector2.

Как отметил Патрик Макдональд, Atan2 может давать отрицательные результаты в некоторых случаях.Добавляя 450 градусов (360 + наша 90-градусная коррекция) к результату и принимая это значение по модулю 360 градусов, вы всегда получаете значение от 0 до 360.

public static float GetAngle(Vector2 point, Vector2 center)
{
    Vector2 relPoint = point - center;
    return (ToDegrees(MathF.Atan2(relPoint.Y, relPoint.X)) + 450f) % 360f;
}

public static float ToDegrees(float radians) => radians * 180f / MathF.PI;

Тест

var a = new Vector2(7, 3);
var b = new Vector2(20, 7);
var c = new Vector2(7, 10);
var d = new Vector2(3, 7);
var e = new Vector2(6.9f, 3); // Test for more than 270 deg.
var f = new Vector2(7.1f, 3); // Test for small angle.

var center = new Vector2(7, 7);

PrintAngle(a); // ==>   0
PrintAngle(b); // ==>  90
PrintAngle(c); // ==> 180
PrintAngle(d); // ==> 270
PrintAngle(e); // ==> 358.5679
PrintAngle(f); // ==>   1.432098


void PrintAngle(Vector2 point)
{
    Console.WriteLine(GetAngle(point, center));
}
...