Показывает нам код для кода, возвращающего неверный результат, показывает нам, в чем заключается проблема, и позволяет дать вам более конкретный совет.
Поскольку вам нужен угол относительноцентр, вы должны вычесть координаты центра из ваших точек.
Math.Atan2
дает радианы.Преобразуйте их в градусы с помощью degrees = radians * 180 / pi
.
Ваш нулевой угол не обычный, как на оси 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));
}