2016-09-01 16 views
0

Я создал функцию get_angle внутри своего класса Vector3, но у меня есть проблема с ним.получить угол между двумя 3D-точками

Угол Y идеально подходит.

Угол тангажа (X), который он возвращает, немного превышает мое место назначения, когда базовый вектор находится над ним (и когда происходит противоположное).

Сумма этого неправильного зависит от разницы в высоте.

Angle get_angle(const Vector3f& v) const { 
    return Angle(
     math::rad_to_deg(atan2(get_distance(v), v.z - z)) - 90.0f, 
     math::rad_to_deg(atan2(v.y - y, v.x - x)), 
     0.0f); 
} 

Это, наверное, мои математики, которые здесь плохие.

ответ

0

Что именно вы пытаетесь вычислить? Что представляет ваш класс «Угол»? Я думаю, вы либо хотите:

  1. Вычислить угол между двумя векторами, то есть одно значение скалярной. Формулу можно найти здесь как cos(theta) == dot(*this, v)/(norm() * v.norm()). https://math.stackexchange.com/questions/974178/how-to-calculate-the-angle-between-2-vectors-in-3d-space-given-a-preset-function

  2. Или преобразовать оба вектора в сферических координатах (PHI, тэта), и вычислить дельту для каждого фи и тета, т.е. рассчитать два угла. Формула преобразования от декартовых к сферическим координатам можно найти здесь: https://en.wikipedia.org/wiki/Spherical_coordinate_system#Cartesian_coordinates

+0

Мой класс Угол представляет 3 углов от 3D пространстве: тангаж, рыскание и рулон. Я исправил свою проблему. Отправленный вопрос, который он имел в другом посте. –

0

Я нашел решение моей проблемы:

Angle get_angle(const Vector3f& v) const { 
    return Angle(
    math::rad_to_deg(
     atan2(
     sqrt(pow(X - v.X, 2) + pow(Y - v.Y, 2)), // the problem was here, 
               // the distance between the vectors should not include the Z position distance in it 
     v.Z - Z)) - 90.0f, 

    math::rad_to_deg(atan2(v.Y - Y, v.X - X)), // this worked correctly 

    0.0f // roll angle should always be 0.0f 
    ); 
}