0

主题:使用指南针传感器输入的 Python:卡在计算中

我正在以名为“开始”的度数读取指南针,旋转大约 360 度并读取“结束”。我想知道开始和结束之间的增量。不是转了多少度,而是结束与开始有多么不同。

degrees_start = 0
degrees_end = 359
#degrees_diff = degrees_end - degrees_start
degrees_diff = (degrees_start-degrees_end) % 360
print(degrees_diff)
'''
test set
degrees_start, degrees_end, deg_diff(expected), deg_diff(observed)
10, 20, +10, +10
20, 10, -10, -10
350, 10, +20, -340
10, 350, -20, +340
0, 359, -1, +359
359, 0, +1, -359
'''

算法很简单:end – start = delta

但我被困在 359 和 1 的边界。示例开始 10,结束 350。或开始 350 结束 10。我尝试了许多算术组合,但没有想出一个始终正确的公式。

有什么建议么?谢谢。

测试以下一些答案:

# test 10,350 -> correct answer -> -20   i.e. 20 deg short of full circle
#degrees_diff = degrees_end - degrees_start   # test 10,350 -> 340
#degrees_diff = (degrees_start-degrees_end) % 360  # test 10,350 -> 20
#degrees_diff = (degrees_end - degrees_start) % 360 # test 10,350 -> 340
4

3 回答 3

0

您必须使用模运算符(%在 Python 中)。算法变为delta = (end - start) % 360.

在 Python 中,结果保证在半开区间 [0,360) 内。如果你更喜欢 [-180, 180),你可以使用:

delta = ((180 + end - start) / 360) - 180
于 2020-12-11T22:13:19.733 回答
0

答案取决于旋转方向。如果您总是想要结束和开始之间的最短角度,那么您必须计算两个方向并进行比较。

此外,有两种考虑方向的方法:(1) 时钟或指南针角度上秒针的方向,其中零落在 +y 轴上,90 度落在 +x 轴上。增加角度逆时针 (2) 0 角落在 +x 轴上的传统数学定义,增加到 +90 度是 +y 轴,依此类推。增加角度顺时针方向。

我将使用第一个定义/约定。

degrees_start = 10
degrees_end = 350

# conventions: clockwise (cw) rotation angles are always increasing 
# until you cross from 359 to 0. also, delta angles for cw are always positive
if degrees_end > degrees_start:
    # simple calculation for cw, we didn't cross 0
    delta_cw = degrees_end - degrees_start
    
    # fancier calculation for ccw. we crossed zero
    delta_ccw = -(degrees_start + (360 - degrees_end))
    
else:
    # fancy calculation for cw
    delta_cw = degrees_end + (360 - degrees_start)
    
    # easy calculation for ccw
    delta_cw = degrees_end - degrees_start
    
print('delta_cw:  +', delta_cw)
print('delta_ccw: ', delta_ccw)

if delta_cw < abs(delta_ccw):
    print('shortest move: +', delta_cw)
else:
    print('shortest move: ', delta_ccw)

这给出了输出:

delta_cw:  + 340
delta_ccw:  -20
shortest move:  -20
于 2020-12-11T23:55:56.223 回答
0

我想这可能是你正在寻找的。

def degrees_diff(start, end):
    if (start + end) >= 360:
        ccw = -((start-end) % 360)
        return print('CCW is', ccw, 'CW is', (ccw + 360))
    else:
        cw = -(start - end) % 360
        return print('CW is', cw, 'CCW is', (cw - 360))    
degrees_diff(350,10)

这会给你:

CCW is -20 CW is 340
于 2020-12-18T21:49:58.467 回答