2015-06-26 2 views
2

Я хотел бы знать, как получить угол на картинке, когда источник не O (0,0,0), но (a, b, c), где a , b и c являются переменными.Найти угол между двумя векторами от произвольного начала

B - точка, которая составляет 90 градусов с A (d, e, f) и началом.

Изображение здесь:

screenshot

+0

Что это связано с C++? Это вопрос математики. –

ответ

8

Во-первых, вычесть происхождение от A и B:

A = A - origin 
B = B - origin 

Затем нормализовать векторы:

A = A/||A|| 
B = B/||B|| 

Затем найти точечный продукт А и В:

dot = A . B 

Затем найдите обратный косинус. Это ваш угол:

angle = acos(dot) 

(Обратите внимание, что результат в радианах Для преобразования градусов, умножить на 180 и разделить на π.).

Здесь C++ исходный код, который использует GLM для реализации этого метод:

float angleBetween(
glm::vec3 a, 
glm::vec3 b, 
glm::vec3 origin 
){ 
glm::vec3 da=glm::normalize(a-origin); 
glm::vec3 db=glm::normalize(b-origin); 
return glm::acos(glm::dot(da, db)); 
} 
+0

Спасибо за фрагмент кода. Возвращаемый тип должен быть float, но не glm: vec3. –

2

Во-первых, вычесть происхождение из A и B:

A = A - origin 
B = B - origin 

Затем возьмите обратный косинус их отношения их величин:

angle = acos(|B|/|A|) 
Смежные вопросы