python - 求方向角θ值

标签 python math angle

我有两个角度(以度为单位,限制在0-359),我想找到两个角度在所需数字最小的方向上的方向差。

例如:

  1. 0, 359 将是 -1(左侧 1),而不是 +359
  2. 180, 2 将是 -178(左 178),而不是 +182

我找到了一些代码,可以让我在没有方向的情况下找到差异。我应该如何修改它才能定向工作?

180 - abs(abs(old - new) - 180)

最佳答案

我首先开始步行道并比较了两种可能的旋转:

def nearest_signed(old, new):
    angles = ((new - old)%360, (new - old)%360 - 360)
    return min(angles, key=abs)

我们检查模 360 角及其在另一个方向上的补角。

它似乎有效:

>>> nearest_signed(0, 359)
-1
>>> nearest_signed(359, 0)
1
>>> nearest_signed(180, 2)
-178
>>> nearest_signed(2, 180)
178

现在,我想看看它的行为如何,所以我绘制了每个角度组合的图:

import numpy as np
matplotlib.pyplot as plt                   

news,olds = np.ogrid[:360, :360]
rights = (news - olds) % 360
lefts = rights - 360
take_rights = abs(rights) < abs(lefts)
nearest_signed = np.where(take_rights, rights, lefts)

fig,ax = plt.subplots()
cf = ax.contourf(news.ravel(), olds.ravel(), nearest_signed, cmap='viridis', levels=np.linspace(-180, 180, 100), vmin=-180, vmax=180)
ax.set_xlabel('new angle')
ax.set_ylabel('old angle')
cb = plt.colorbar(cf, boundaries=(-180, 180))
plt.show()

pretty plotted result

现在很明显,角度差的简单模应该起作用。果然:

>>> np.array_equal((news - olds + 180) % 360 - 180, nearest_signed)
True

这意味着您要查找的公式是

(new - old + 180) % 360 - 180

在您的约定中给予或采取符号差异。如果以相反的方式计算旋转符号,只需交换两个角度即可:

(old - new + 180) % 360 - 180

关于python - 求方向角θ值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53062764/

相关文章:

python - 以编程方式为 pd.melt 选择列

python - 套接字可以同时监听和连接吗

python,向量之间的角度: need for computational efficiency

c++ - 将角度转换为 vector 并返回改变角度?

java - 寻找 vector 之间的符号角

python - 使用 COM 连接到正在运行的 Visual Studio 2003 实例,构建并读取输出

python - 有没有更简单的方法来使用 pandas read_clipboard 来阅读系列?

java - 检查我是否理解基本的 Java 位运算

Matlab fft 函数交换索引

java - LinkedHashSet 和 subList,获取集合的 n