Как рассчитать угол между одним объектом и другим? - PullRequest
0 голосов
/ 10 марта 2012

Как вы рассчитываете угол между одним объектом и другим, предполагая, что ваш первый объект - ваш источник, а вектор вверх - хорошо? Я боролся с этой проблемой в Android и Java около шести часов, и не было действительно хороших вопросов или ответов, которые бы дали правильный способ ее вычислить.

Если вопрос не супер ясен: У меня есть объект на экране, и я хочу знать, каков угол от этого объекта до оси Y (или 90 градусов) к другому объекту на экране. Так, если первый объект находится в 1,1, а второй объект в 2,2, то угол должен быть 315. Это потому, что 0 градусов вправо, 90 градусов вверх (ось y), 180 градусов осталось и 270 градусов вниз.

Ответы [ 3 ]

1 голос
/ 10 марта 2012

Могут быть более элегантные решения, но я нашел, что это хорошо работает:

float angle = (float)Math.toDegrees(Math.atan2((double)(y1 - y2),(double)(x1 - x2)));
angle = (angle + 180.0f) % 360.0f;
angle = 360.0f - angle;

Это дает угол, начинающийся с 0 вправо, 90 вверх, 180 влево и 270 вниз. Я ответил на свой собственный вопрос, потому что мне потребовался целый день, чтобы найти это, и это не было в Интернете. Надеюсь, это кому-нибудь поможет. Я оставлю вопрос без ответа в течение дня или двух, чтобы посмотреть, сможет ли кто-нибудь найти более элегантное решение или лучший способ выразить ответ. Этот ответ на Java и был протестирован на Android.

0 голосов
/ 10 марта 2012

В Java есть функция с именем Math.atan2 (). Это принимает в "вектор". Обычно у вас есть 2 точки, и вам нужно рассчитать угол между ними. Это можно сделать так:

Point p1 = new Point(2,6);
Point p2 = new Point(3,1);
double angle = Math.atan2(p2.y-p1.y,p2.x-p1.x);

Math.atan2 возвращает результаты в указанном здесь формате: Math.atan2

0 голосов
/ 10 марта 2012

Ответом является использование точечного произведения , таким образом:

theta = arccos( a.b / (||a|| ||b||) )

где . обозначает скалярное произведение, а || || обозначает векторную величину.

Итак, в вашем случае вы выбираете a для обозначения «вверх» (так, вероятно, (0,0,1)), а b для разницы между вашими двумя точками.

...