Python 知道只有正弦和余弦的两个角度之间的差别吗?

Python 知道只有正弦和余弦的两个角度之间的差别吗?,python,python-3.x,math,python-3.6,Python,Python 3.x,Math,Python 3.6,嗨,最近我在写一个程序,里面有一堆点,玩家必须避免。这些点改变了方向,但在给定的时间范围内不能改变太多 我有一个这样做的方法,但效率很低,因为我必须使用反正弦,知道余弦角和正弦角,然后知道正弦和余弦角。我想返回余弦和正弦角度,但有一个问题。一旦我收到余弦和正弦,我也需要知道它是否与我当前的状态有太大的不同 有了这个角度,这将很容易,因为我必须要看到差异,这是一个模型程序(我目前的代码使用了这个角度,并没有太大帮助)。我试着画正弦和余弦,试着观察任何模式,没有明显的结果 import math d

嗨,最近我在写一个程序,里面有一堆点,玩家必须避免。这些点改变了方向,但在给定的时间范围内不能改变太多

我有一个这样做的方法,但效率很低,因为我必须使用反正弦,知道余弦角和正弦角,然后知道正弦和余弦角。我想返回余弦和正弦角度,但有一个问题。一旦我收到余弦和正弦,我也需要知道它是否与我当前的状态有太大的不同

有了这个角度,这将很容易,因为我必须要看到差异,这是一个模型程序(我目前的代码使用了这个角度,并没有太大帮助)。我试着画正弦和余弦,试着观察任何模式,没有明显的结果

import math
def sendTargRot():
    #I actually use a fairly long method to find it's current rotation, but a random.random() is a fair replacement, so in my real thing there would be no angle calculation
    pretendAngle =  math.pi*random.random()-math.pi
    pretendCosedX = math.cos(pretendAngle)
    pretendSinedX = math.sin(pretendAngle)
def changeDotAngle():
    targRot = sendTargRot
    #make sure targRot is not too much from current rotation
    #do stuff with the angle, change dot's rotation
如果你想给我一个没有代码的算法,这也是可以接受的


编辑:我无法真正更改sendTargRot,因此它会提供一个正确的旋转,因为这需要我知道当前角度,实际上这只是移动问题。

要获得两个向量之间的角度,可以使用
atan2
函数

 angle = Math.atan2(a.x * b.y - a.y * b.x, a.x * b.x + a.y * b.y)
如果已经有余弦和正弦(与单位圆上的坐标相同):


这种方法给出了旋转
a
所需的角度,直到它与
b
重合为止,说明方向(范围
-Pi..Pi

我认为这里的问题是,你必须在某个地方加入
ARCIN
arccos
。即使你使用一些聪明的三角恒等式来排列数字,你仍然必须在最后对其进行
arcin
操作,因为
sinx
cosx
是标量,而不是角度,所以对它们进行的任何操作都必然会产生标量。你可以用两个角度的正弦和余弦来计算两个角度差的tan。但是,tan(x)=tan(pi+x),因此仅使用tan就无法分辨彼此接近的两个向量与指向几乎相反方向的两个向量之间的差异。但是你可以用正弦和余弦的符号来消除歧义,为什么不预先计算出使角度在你的极限范围内所需的随机数呢。然后使用该范围内的随机数。你能更清楚地指定-完成了什么数据,以及你想要得到什么值吗?@mamun随机数就是一个例子,在我的游戏中,它不是随机数,而是一个相当长的过程,不需要发布。所以,atan2是一个三角函数吗?因为如果是这样的话,那就扼杀了整件事。我知道如何使用反正弦/反正弦求角没有三角,就无法从坐标空间进入角度空间。功能。但也许你真的需要cos和sin(结果角度的),而不是角度本身——在这个例子中,atan2的第一个和第二个参数是sin和cos。在基于反射的游戏和类似的东西中,这是一种常见的方法-你总是有单位方向向量的分量,并且从不使用角度。谢谢你的答案,但不幸的是,我不能接受它,因为它仍然使用三角学。再一次,没有三角学(或一些近似值),不可能得到角度。仅差角正弦和余弦:
DiffAngleSin=a.x*b.y-a.y*b.x
 angle = Math.atan2(cos(a) * sin(b) - sin(a) * cos(b), cos(a) * cos(b) + sin(a) * sin(b))