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)