Углы трехмерного вектора — получение обоих

У меня есть объект А, со скоростью. Скорость указана как 3D вектор a = (x, y, z), Положение является 3D-точкой A [X, Y, Z], Мне нужно выяснить, приводит ли текущая скорость этого объекта к другому объекту B на позиции B [X, Y, Z],
Я успешно реализовал это в двух измерениях, игнорируя третье:

   /*A is projectile, B is static object*/
//entity is object A
//  - .v[3] is the speed vector
//position[3] is array of coordinates of object Bdouble vector[3];                               //This is the vector c = A-B
this->entityVector(-1, entity.id, vector);      //Fills the correct data
double distance = vector_size(vector);          //This is distance |AB|
double speed = vector_size(entity.v);      //This is size of speed vector a

float dist_angle = (float)atan2(vector[2],vector[0])*(180.0/M_PI);           //Get angle of vector c as seen from Y axis - using X, Z
float speed_angle = (float)atan2((double)entity.v[2],entity.v[0])*(180.0/M_PI); //Get angle of vector a seen from Y axis - using X, Z
dist_angle = deg180to360(dist_angle);             //Converts value to 0-360
speed_angle = deg180to360(speed_angle);           //Converts value to 0-360
int diff = abs((int)compare_degrees(dist_angle, speed_angle));   //Returns the difference of vectors direction

Мне нужно создать такое же сравнение, чтобы оно работало в 3D — сейчас позиции Y и координаты вектора Y игнорируются.
Какой расчет я должен сделать, чтобы получить второй угол?

редактировать на основании ответа:
Я использую сферические координаты и сравниваю их углы, чтобы проверить, указывают ли два вектора в одном направлении. Так как один вектор является A-B, а другой — скоростью A, я проверяю, что id A направляется в B.

3

Решение

Я предполагаю, что «второй угол», который вы ищете, это φ. То есть вы используете сферические координаты:

(x,y,z) => (r,θ,φ)
r = sqrt(x^2 + y^2 + z^2)
θ = cos^-1(z/r)
φ = tan^-1(y/x)

Однако, если все, что вы хотите сделать, это найти, движется ли А со скоростью а в направлении В, вы можете использовать точечное произведение для базового ответа.

1st vector: B - A (vector pointing from A to B)
2nd vector: a (velocity)
dot product: a * (B-A)

Если точечное произведение равно 0, это означает, что вы не приближаетесь — вы движетесь вокруг сферы постоянного радиуса || B-A || с буквой В в центре. Если скалярное произведение> 0, вы движетесь к точке, а если скалярное произведение < 0, ты уходишь от этого.

5

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]