Cars Data
Cars Data

Reputation: 37

C++ Angles between a vector and a point

I got 2 points own=(x, y, z) and en=(x, y, z) which represents my own position in the world and some other player position. the other player also got pitch (from 90 degrees to -90) and yaw (0 to 360). I want to calculate the angles between the other player look and my own position.

In 2D, alpha is what I'm trying to calculate:

enter image description here

int main()
{
    float own_x = 1, own_y = 1, own_z = 1;
    float en_x = 10, en_y = 1, en_z = 10;
    float pi = 3.14159265;
    float pitch = 0.f * (pi / 180), yaw = 45.f * (pi / 180);
    float x = sin(yaw) * cos(pitch);
    float y = sin(pitch);
    float z = cos(pitch) * cos(yaw);
    float vec_length = sqrt(pow(en_x - own_x, 2) + pow(en_y - own_y, 2) + pow(en_y - own_y, 2));
    x /= vec_length;
    y /= vec_length;
    z /= vec_length;
    float cos_t = ((en_x - own_x)*x + (en_y - own_y)*y + (en_z - own_z)*z) / sqrt(pow(en_x - own_x, 2) + pow(en_y - own_y, 2) + pow(en_y - own_y, 2));
    float arc = acos(cos_t) * (180 / pi);
    return 0;
}

Upvotes: 0

Views: 300

Answers (1)

geza
geza

Reputation: 29952

  1. you divide twice with the length of en-own: You should remove vec_length, and xyz /= vec_length.
  2. your division at cos_t is buggy, you use _y twice in the expression instead of _y and _z

Note: instead of pow(x, 2), use x*x, it is faster usually (compilers may not optimize pow(x, 2) to x*x).

Upvotes: 1

Related Questions