Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/134.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 这是使用点积求两个向量之间的角度的正确方法吗?C++;SFML_C++_Vector_Sfml_Angle - Fatal编程技术网

C++ 这是使用点积求两个向量之间的角度的正确方法吗?C++;SFML

C++ 这是使用点积求两个向量之间的角度的正确方法吗?C++;SFML,c++,vector,sfml,angle,C++,Vector,Sfml,Angle,在另一个问题中,我被告知你可以使用点积的简化公式来计算两个向量之间的角度: angle = atan2(mouseY, mouseX) - atan2(yPos, xPos); //xPos, yPos is position of player 除此之外,据我所知,它只是把点作为向量。这就是为什么在参数中插入鼠标和播放器的位置。但是,当我在360度半径内围绕玩家移动鼠标时,玩家的角度和旋转角度是-0.3左右的值。。。到-1.4。。。 这不是正确的方法吗?我应该不是把向量表示成X,Y的位置,而

在另一个问题中,我被告知你可以使用点积的简化公式来计算两个向量之间的角度:

angle = atan2(mouseY, mouseX) - atan2(yPos, xPos); //xPos, yPos is position of player
除此之外,据我所知,它只是把点作为向量。这就是为什么在参数中插入鼠标和播放器的位置。但是,当我在360度半径内围绕玩家移动鼠标时,玩家的角度和旋转角度是-0.3左右的值。。。到-1.4。。。 这不是正确的方法吗?我应该不是把向量表示成X,Y的位置,而是别的什么吗

我还发现了另一个似乎对我不起作用的公式:

angle = atan2(mouseY - yPos, mouseX - xPos);

第一种方法是正确的,第二种方法是错误的。函数
atan2(x,y)
计算从
(0,0)
指向
(x,y)
的向量相对于x轴的角度(弧度)。因此,正确的做法是计算矢量相对于x轴的两个角度(以弧度为单位),然后将它们相互减去,以获得两个矢量之间的角度

函数
atan2
的结果是半开区间
(-pi,pi]
中的值。以度表示,这对应于
(-180°,180°)
。因此,0°表示向右(沿x轴)的向量,90°表示向上的向量,180°表示向左的向量,以及-90°表示向下的向量

可以通过公式将结果(以弧度为单位)转换为角度

atan(x,y)*180/pi

因此,如果你想将结果值转换成角度,只需将它们乘以
180/pi

谢谢你的帮助,但是旋转似乎有点不顺。如果我绕着旋转360度,它只会从东北转向东南,精灵的X,Y是居中的。我不确定我哪里出错了,但在这里代码是:双角度=atan2(鼠标键+yPos,鼠标键-xPos);角度=角度*(180/3.14159);ship.setRotation(角度);如答案中所述,您应该使用第一个选项,即
atan2(鼠标键,鼠标键)-atan2(yPos,xPos)
此外,你必须问问自己坐标系的原点在哪里,并适当地移动输入。因此,在你的显示器上,点(0,0)在哪里?0,0是窗口的左上角。我使用的是第一种选择,所以说实话,我真的不确定出了什么问题。