Python 和指南针数据 - 算法?

Posted

技术标签:

【中文标题】Python 和指南针数据 - 算法?【英文标题】:Python and compass data - algorithim? 【发布时间】:2021-03-23 08:02:17 【问题描述】:

主题: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

【问题讨论】:

350 -> 10 的预期输出是多少?最好是显示您的代码、示例输入和预期输出,即minimal reproducible example 开始 340,结束 10 将是 + 30。换句话说,转弯继续超过开始 20 度到 0,然后再 10 度 = +30。 (开始 - 结束)% 360 这能回答你的问题吗? Calculate difference between two angles buran:感谢您对 mre 的注意 - 将来会一直这样做 链接:现在尝试理解和测试它。 【参考方案1】:

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

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

delta = ((180 + end - start) / 360) - 180

【讨论】:

【参考方案2】:

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

此外,有两种方法可以考虑方向:(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

【讨论】:

【参考方案3】:

我想这可能就是你要找的。​​p>

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

【讨论】:

以上是关于Python 和指南针数据 - 算法?的主要内容,如果未能解决你的问题,请参考以下文章

机器学习实践:《Python机器学习实践指南》中文PDF+英文PDF+代码

python学习指南—Python 进阶(Python Cookbook)

半路出山想迅速上手Python做机器学习?这篇文章就是你需要的实用指南

1. 编程规范和编程安全指南--python

1. 编程规范和编程安全指南--python

超级详细的 Python 数据分析指南