Эффективный способ получить угол между двумя векторами в одной плоскости? - PullRequest
4 голосов
/ 09 февраля 2012

Если я точно знаю, что значения x и z векторов будут идентичны, поэтому я занимаюсь только измерением «вертикального» угла относительно разностей в плоскости y, есть ли более эффективный метод для этого?это по сравнению с вычислением точечного произведения?

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

float a_mag = a.magnitude(); 
float b_mag = b.magnitude();
float ab_dot = a.dot(b);
float c = ab_dot / (a_mag * b_mag);

// clamp d to from going beyond +/- 1 as acos(+1/-1) results in infinity
if (c > 1.0f) {
    c = 1.0;
} else if (c < -1.0) {
    c = -1.0;
}

return acos(c);

Я бы хотел избавиться от этих квадратных корней

Ответы [ 2 ]

3 голосов
/ 09 февраля 2012

Предположим, что ваши два вектора живут в u = (x, y1, z) и v = (x, y2, z), и вы заинтересованы в плоском угле между двумя вдоль плоскости, охватываемой двумя векторами.Вам нужно будет вычислить скалярное произведение и величину, но вы можете сохранить несколько операций:

u.v = x.x + y1.y2 + z.z
u^2 = x.x + y1.y1 + z.z
v^2 = x.x + y2.y2 + z.z

Поэтому мы должны предварительно вычислить:

float xz = x*x + z*z, y11 = y1*y1, y12 = y1*y2, y22 = y2*y2;

float cosangle = (xz + y12) / sqrt((xz + y11) * (xz + y22));
float angle = acos(cosangle);
1 голос
/ 09 февраля 2012

Если значения x и z не изменились, тогда расчет очень прост: просто используйте базовую тригонометрию.

Пусть точки будут (x, y1, z) и (x, y2, z).Вы можете узнать угол, который вектор делает с плоскостью ZX.Пусть углы будут t1 и t2 соответственно.Тогда:

w = sqrt(x^2 + z^2)
tan(t1) = y1 / w
So t1 = atan(y1 / w)
Similarly t2 = atan(y2 / w)
The angle is (t2 - t1)

Есть одна ловушка: когда x и z равны нулю, tan s не определены ... но такой тривиальный случай легко обрабатывается отдельно.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...