转换后恢复角度

时间:2018-02-07 17:03:49

标签: python numpy math trigonometry

这似乎是一项足够简单的任务,但我找不到解决方案,而且我已经没有想法了。

我有两个角度来定义一些变换系数。现在,我在实际数据中实际上没有这些角度的值,我有系数,我需要恢复角度。

我认为arctan2函数会处理这个问题,但有些情况下它无法恢复正确的a1角度,而是返回其180补码,后来会影响恢复a2角度。

我做错了什么,如何正确恢复a1, a2角度?

import numpy as np

# Repeat 100 times
for _ in range(100):
    # Define two random angles in the range [-pi, pi]. I do not have these
    # angles in my actual data, I have the A,B,C coefficients shown below.
    a1, a2 = np.random.uniform(-180., 180., (2,))

    # Transformation coefficients using the above angles.
    # This is the data I actually have.
    a1_rad, a2_rad = np.deg2rad(a1), np.deg2rad(a2)  # to radians
    A = - np.sin(a1_rad) * np.sin(a2_rad)
    B = np.cos(a1_rad) * np.sin(a2_rad)
    C = np.cos(a2_rad)

    # Recover a1 using 'arctan2' (returns angle in the range [-pi, pi])
    a1_recover = np.arctan2(-A / B, 1.)

    # Now obtain sin(a2), used below to obtain 'a2'
    sin_a2 = -A / np.sin(a1_recover)

    # Recover a2 using 'arctan2', where: C = cos(a2)
    a2_recover = np.arctan2(sin_a2, C)

    # Print differences.
    a1_recover = np.rad2deg(a1_recover)
    print("a1: {:.2f} = {} - {}".format(a1 - a1_recover, a1, a1_recover))
    a2_recover = np.rad2deg(a2_recover)
    print("a2: {:.2f} = {} - {}\n".format(a2 - a2_recover, a2, a2_recover))

3 个答案:

答案 0 :(得分:1)

您无法恢复角度标记信息,因为它在A,B计算(形成)中被释放。

sin/cos个符号的8种可能组合仅提供A/B个符号的4个结果(cos(a2)的符号在这里无法帮助。)

请注意,对于球面坐标,倾角范围仅为0..Pi

答案 1 :(得分:1)

a2_rad等于0时,(A, B, C)等于(0, 0, 1),无论a1_rad等于什么。所以转型不是一对一的。因此,没有明确定义的逆。

def ABC(a1, a2):
    a1_rad, a2_rad = np.deg2rad(a1), np.deg2rad(a2)  # to radians
    A = - np.sin(a1_rad) * np.sin(a2_rad)
    B = np.cos(a1_rad) * np.sin(a2_rad)
    C = np.cos(a2_rad)
    return A, B, C

print(ABC(0, 0))
# (-0.0, 0.0, 1.0)
print(90, 0)
# (-0.0, 0.0, 1.0)
print(-90, 0)
# (-0.0, 0.0, 1.0)

类似的问题发生在对面(南)极点。在浮点精度的限制范围内,所有这些值(ABC(a1, 180)形式)也基本相同:

ABC(1, 180)
# (-2.1373033680837913e-18, 1.2244602795081332e-16, -1.0)

ABC(0, 180)
# (-0.0, 1.2246467991473532e-16, -1.0)

ABC(90, 180)
# (-1.2246467991473532e-16, 7.498798913309288e-33, -1.0)

您可以将a1a2视为a1单位范围内的坐标 表示远离x轴的角度(通常称为theta)和a2 表示远离z轴的角度(通常称为phi)。

ABC表示笛卡尔坐标系中单位球体上的相同点。

通常spherical coordinatesa1限制在范围[0, 2*pi)a2范围[0, pi]。 即使有这种限制,北极和南极也有不止一个(实际上是无限数量)的有效表示。

答案 2 :(得分:0)

您应该使用np.arctan2(-A,B)而不是np.arctan2(-A / B,1。)。对于后者,您正在丢失信息:A = -1且B = 1将得到与A - 1和B = -1相同的结果,因此有时会出现180度不匹配。 如果将a2限制为(0,180),则可以恢复角度。注意,通过该限制,a2可以作为acos(C)恢复。 (我试过这个但是因为我的程序是在C中它可能没有帮助)