2013-07-08 11 views
5

Возможно, на этот вопрос ответили, извините, если он есть. Мне в основном нужно получить угол от начала координат до точки. Итак, давайте скажем Происхождение (0, 0) и мой целевой точкой является (3, 0).Получить угол между точкой и началом координат

3 часа = 90 градусов

6 часов = 180 градусов

9 часов = 270 градусов

12:00 = 0 градусов


Каким-то образом я должен сделать математическую магию и узнать, что угол 90 градусов (верхний - 0). Происхождение может меняться, поэтому мне нужен метод с двумя параметрами: Origin и TargetPoint, который возвращает двойной угол в градусах.

Да, я понимаю, что это выглядит коротким и неконструктивно, но я сделал вопрос простым и понятным, насколько это возможно. Все остальные вопросы были закрыты -.-

Благодаря

+3

Угол между двумя линиями ... не две точки, если только вы не говорите об угле линии, например, о самом мире? Также ... это для домашней работы? – LightStriker

+0

Нет, мне нужен угол между началом и точкой. Подумайте об этом как о часах, 3 часа - 90 градусов о происхождении (в центре). Нет, я работаю над игрой. – Dave

+1

@LightStriker Почему люди так много разбираются в этом вопросе? ** COURSE ** вы не можете _технически иметь угол между двумя точками, но почему так трудно понять, что этому не научили много программистов? Все, что они знают, это 0 градусов, и они должны найти угол, который сделает одну точку спрайта на другом спрайте. Большинство программистов, которые задают этот вопрос, просто не имеют математического фона для понимания концепции необходимости трех точек (или двух строк, если хотите) для угла. [/ rant] – Clonkex

ответ

11

вектор между двумя точками А и В представляет собой В-А = (B.x-A.x, B.y-A.y). Угол между двумя векторами может быть рассчитан с помощью dot product или atan2.

var vector2 = Target - Origin; 
var vector1 = new Point(0, 1) // 12 o'clock == 0°, assuming that y goes from bottom to top 

double angleInRadians = Math.Atan2(vector2.Y, vector2.X) - Math.Atan2(vector1.Y, vector1.X); 

Смотрите также Finding Signed Angle Between Vectors

+1

Итак: 'Math.Atan2 (Origin.Y - Target.Y, Origin.X - Target.X);'? И это радианцы, верно? – Dave

+0

@ user2544245: Вам нужно ** два ** вектора. Второй вектор указывает на направление, которое вы хотите представить 0 °. По часовой стрелке, да. Однако ваша формула неправильная. –

+0

В вашей формуле, имеет ли значение, какой из них является Origin и является ли Target? – Dave

1

Предполагая x положителен, что-то вроде этого:

angle = Math.Atan(y/x) * 180/Math.PI + 90 

Edited, чтобы для отрицательных x значений:

Если это может быть отрицательным, просто сделать в любом случае. Что-то вроде этого:

if (x < 0) { 
    angle = 270 - (Math.Atan(y/-x) * 180/Math.PI); 
} else { 
    angle = 90 + (Math.Atan(y/x) * 180/Math.PI); 
} 
+0

Ну X и Y могут быть положительными или отрицательными. – Dave

+2

Не голосуйте, он просто пытается помочь. – Dave

0
public static double GetAngleDegree(Point origin, Point target) { 
    var n = 270 - (Math.Atan2(origin.Y - target.Y, origin.X - target.X)) * 180/Math.PI; 
    return n % 360; 
} 

static void Main(string[] args) 
{ 
    Console.WriteLine(GetAngleDegree(new Point(0, 0), new Point(0, 3)));//0 
    Console.WriteLine(GetAngleDegree(new Point(0, 0), new Point(3, 0)));//90 
    Console.WriteLine(GetAngleDegree(new Point(0, 0), new Point(0, -3)));//180 
    Console.WriteLine(GetAngleDegree(new Point(0, 0), new Point(-3, 0)));//270 
} 
+1

Похоже, что он идет CounterClockwise, при этом ** (0, 3) ** составляет 0 градусов. – Dave

+0

Это идеальное решение для сортировки точек по углу. –

0

На самом деле нет никакого способа узнать угол между точкой и происхождения из-за того, что происхождение (0,0). Мы можем рассчитать угол между двумя точками, которые они обрабатывают как векторы, и поэтому они имеют направление, но начало координат не имеет направления. По этой причине, если вы хотите найти угол, используя пример часов, вы можете рассчитать угол между точкой и (1,0), например, находящуюся в точке 0 градусов.

Мне очень жаль, что я не разбираюсь в C#, но вы можете посмотреть на этот Java код, который похож:

double getAngle2PointsRad(double p1_x, double p1_y, double p2_x, double p2_y) { 
    return Math.acos((((p1_x * p2_x) + (p1_y * p2_y))/(Math.sqrt(Math.pow(p1_x, 2) + Math.pow(p1_y, 2)) * Math.sqrt(Math.pow(p2_x, 2) + Math.pow(p2_y, 2))))); 
} 

double getAngle2PointsDeg(double p1_x, double p1_y, double p2_x, double p2_y) { 
    return Math.acos((((p1_x * p2_x) + (p1_y * p2_y))/(Math.sqrt(Math.pow(p1_x, 2) + Math.pow(p1_y, 2)) * Math.sqrt(Math.pow(p2_x, 2) + Math.pow(p2_y, 2))))) * 180/Math.PI; 
} 

Если попытаться вычислить с помощью (0,0), вы получите NaN избавляет его от деления на ноль.

Смежные вопросы