C++ 如何检查向量是否朝向同一方向

C++ 如何检查向量是否朝向同一方向,c++,vector,direction,C++,Vector,Direction,我在研究一个问题,在右手坐标系中,y轴是垂直的。我得到了一个表示三维向量的结构,如下所示: struct vec{float x; float y; float z; }; 我需要写一个函数,它接受一个代表北方的单位向量和一个代表球员前进向量的单位向量,如果他们面向北方多于南方,则返回。不幸的是,我不知道从这里走到哪里,我相信我必须做一些事情,比如: PlayerDirection = sqrt((PlayerVector.x *= PlayerVector.x)

我在研究一个问题,在右手坐标系中,y轴是垂直的。我得到了一个表示三维向量的结构,如下所示:

struct vec{float x; float y; float z; };
我需要写一个函数,它接受一个代表北方的单位向量和一个代表球员前进向量的单位向量,如果他们面向北方多于南方,则返回。不幸的是,我不知道从这里走到哪里,我相信我必须做一些事情,比如:

PlayerDirection = sqrt((PlayerVector.x *= PlayerVector.x)
                     + (PlayerVector.y *= PlayerVector.y)
                     + (PlayerVector.z *= PlayerVector.z));
但我不知道该从这里走到哪里。任何帮助/解释都会有所帮助,谢谢。

您包含的公式(其中包含一个错误-乘积是“*”,而不是“*=”)为您提供了运动的实体-矢量的长度。你们已经知道了,因为它是一个单位向量,所以它的长度是1

相反,您需要在两个向量之间执行。如果两个单位向量完全对齐(平行),则为1,如果它们是反平行的,则为-1,如果它们彼此垂直,则为0

“北多南少”表示标量积为正,因此:

如果他们面向北方多于南方,则返回

问题 如果我想知道它是否面向东/西呢

点积告诉您两个向量对齐的程度。这与Kevin Glasson给出的公式相同,没有单位向量范数,因为它们是1,除以1不会改变任何东西

所以,你不能用它来判断一个向量面对的方向,除非是另一个向量。这就是为什么你得到了北向量;仅使用播放器向量无法运行点积。要判断玩家是否朝东,您需要东向量(或西向量,然后取相反的符号)

所以,如果这个数字回到35,这意味着它面对的是更多的北方而不是南方,但为什么呢

为什么会这样:你可以在维基百科页面上找到解释,点积等于两个长度的乘积乘以其角度的余弦。因为长度都是1,它只是余弦。余弦在1到-1之间变化(所以你永远不会得到35)。余弦为1时,表示角度为零,向量对齐;当它是-1时,它们是相反的。余弦为零表示向量彼此垂直,即形成90°的角度,在这种情况下,表示播放器面向东、西、上或下-但它不会告诉您是哪个方向。

您包含的公式(其中包含一个错误-乘积为“*”,而不是“*=”)为您提供运动的实体-向量的长度。你们已经知道了,因为它是一个单位向量,所以它的长度是1

相反,您需要在两个向量之间执行。如果两个单位向量完全对齐(平行),则为1,如果它们是反平行的,则为-1,如果它们彼此垂直,则为0

“北多南少”表示标量积为正,因此:

如果他们面向北方多于南方,则返回

问题 如果我想知道它是否面向东/西呢

点积告诉您两个向量对齐的程度。这与Kevin Glasson给出的公式相同,没有单位向量范数,因为它们是1,除以1不会改变任何东西

所以,你不能用它来判断一个向量面对的方向,除非是另一个向量。这就是为什么你得到了北向量;仅使用播放器向量无法运行点积。要判断玩家是否朝东,您需要东向量(或西向量,然后取相反的符号)

所以,如果这个数字回到35,这意味着它面对的是更多的北方而不是南方,但为什么呢


为什么会这样:你可以在维基百科页面上找到解释,点积等于两个长度的乘积乘以其角度的余弦。因为长度都是1,它只是余弦。余弦在1到-1之间变化(所以你永远不会得到35)。余弦为1时,表示角度为零,向量对齐;当它是-1时,它们是相反的。余弦为零表示向量彼此垂直,即形成90度角,在这种情况下,表示播放器面向东、西、上或下,但它不会告诉您是哪个方向。

对两个向量应用点积。如果两个矢量之间的角度小于90度,则点积为正,否则为负

对两个向量应用点积。如果两个矢量之间的角度小于90度,则点积为正,否则为负

我认为有效的方法是取向量的值。使用以下表格:

在那里你会重新安排θ。这将给出两个向量之间的角度

在我看来,至少如果角度是0,那么你正指向北方,如果角度大于90,那么你正朝向南方


我不知道你打算如何使用它,但这应该能够在3D空间中区分南北方向。

我认为可行的方法是取向量的值。使用以下表格:

在那里你会重新安排θ。这将给出两个向量之间的角度

在我看来,至少如果角度是0,那么你正指向北方,如果角度大于90,那么你正朝向南方


我不知道你打算如何使用它,但这应该能够在3D空间中区分南北。

你可以使用点积来获得两个向量之间的角度。公式如下:

cos(phi) = (a * b) / (|a|*|b|)
e_a = (ax / sqrt(ax^2+ay^2+az^2),ay / sqrt(ax^2+ay^2+az^2),az / sqrt(ax^2+ay^2+az^2))
其中转换为:

phi = acos((ax*bx + ay*by + az * bz) / (sqrt(ax^2 + ay^2 + az^2)+sqrt(bx^2 + by^2 + bz^2)))
现在点积是对称的,意思是:(1,1,1)(2,2,2)给出与(2,2,2)(1,1,1)相同的结果。因此,您必须添加一个
axis = a x b
axis = (aybz-azby, azbx-axbz, axby-aybx)
double R[3][3] = {};
            Vector axis = Axis.getUnitVector();
            double deg = degrees / 180 * M_PI;
            R[0][0] = axis.X * axis.X * (1 - cos(deg)) + cos(deg); R[0][1] = axis.X * axis.Y * (1 - cos(deg)) - axis.Z * sin(deg); R[0][2] = axis.X * axis.Z * (1 - cos(deg)) + axis.Y * sin(deg);
            R[1][0] = axis.Y * axis.X * (1 - cos(deg)) + axis.Z * sin(deg); R[1][1] = axis.Y * axis.Y * (1 - cos(deg)) + cos(deg); R[1][2] = axis.Y * axis.Z * (1 - cos(deg)) - axis.X * sin(deg);
            R[2][0] = axis.Z * axis.X * (1 - cos(deg)) - axis.Y * sin(deg); R[2][1] = axis.Z * axis.Y * (1 - cos(deg)) + axis.X * sin(deg); R[2][2] = axis.Z * axis.Z * (1 - cos(deg)) + cos(deg);
            double x = this->X * R[0][0] + this->Y * R[0][1] + this->Z * R[0][2];
            double y = this->X * R[1][0] + this->Y * R[1][1] + this->Z * R[1][2];
            double z = this->X * R[2][0] + this->Y * R[2][1] + this->Z * R[2][2];
e_a = (ax / sqrt(ax^2+ay^2+az^2),ay / sqrt(ax^2+ay^2+az^2),az / sqrt(ax^2+ay^2+az^2))