gis*_*s20 3 python range circular-list
我有一个列表列表,其中包含角度集的下限和上限
就像是
[[1,22],[2,24]...[359,15],[360,21]]
总共360个元素
现在我想检查从 1 到 360 的每个角度,列表中包含该角度的元素
我正在考虑使用下限和上限来使用rangeor创建列表的所有元素np.arange(lower,upper)并检查是否包含角度,但当np.arangelower 高于 upper 时会生成空列表
for i in range(1,361):
    sel=[]
    for coe in coef:
        if i in range(coe[0],coe[1]):
            sel.append(coe)
我也尝试过itertoolsandcycle但我不知道如何在这种情况下应用它
执行此操作的标准方法是使用模数。这个答案展示了如何在 C/C++ 中执行此操作。
\n\n这是 Python 实现和测试。Python 中的代码更简单,因为 Python 中a % b始终具有相同的符号b。
测试代码以 60 为步长循环遍历从 0 到 360 度的所有角度对,对于a和b,以 30 为步长测试x从 0 到 360 度的所有角度。扇区从 开始a并扫描到b。因此,扇区 (60, 120) 包含 60\xc2\xb0,但 (120, 60) 包含 300\xc2\xb0。
如果x在扇区内(包括端点),它将被添加到result。
def in_angle_interval(x, a, b):\n    return (x - a) % 360 <= (b - a) % 360\n\n# test \n\nfor a in range(0, 420, 60):\n    for b in range(0, 420, 60):\n        result = [x for x in range(0, 390, 30) if in_angle_interval(x, a, b)]\n        print(\'{:3}-{:3} {}\'.format(a, b, result))\n输出
\n\n  0-  0 [0, 360]\n  0- 60 [0, 30, 60, 360]\n  0-120 [0, 30, 60, 90, 120, 360]\n  0-180 [0, 30, 60, 90, 120, 150, 180, 360]\n  0-240 [0, 30, 60, 90, 120, 150, 180, 210, 240, 360]\n  0-300 [0, 30, 60, 90, 120, 150, 180, 210, 240, 270, 300, 360]\n  0-360 [0, 360]\n 60-  0 [0, 60, 90, 120, 150, 180, 210, 240, 270, 300, 330, 360]\n 60- 60 [60]\n 60-120 [60, 90, 120]\n 60-180 [60, 90, 120, 150, 180]\n 60-240 [60, 90, 120, 150, 180, 210, 240]\n 60-300 [60, 90, 120, 150, 180, 210, 240, 270, 300]\n 60-360 [0, 60, 90, 120, 150, 180, 210, 240, 270, 300, 330, 360]\n120-  0 [0, 120, 150, 180, 210, 240, 270, 300, 330, 360]\n120- 60 [0, 30, 60, 120, 150, 180, 210, 240, 270, 300, 330, 360]\n120-120 [120]\n120-180 [120, 150, 180]\n120-240 [120, 150, 180, 210, 240]\n120-300 [120, 150, 180, 210, 240, 270, 300]\n120-360 [0, 120, 150, 180, 210, 240, 270, 300, 330, 360]\n180-  0 [0, 180, 210, 240, 270, 300, 330, 360]\n180- 60 [0, 30, 60, 180, 210, 240, 270, 300, 330, 360]\n180-120 [0, 30, 60, 90, 120, 180, 210, 240, 270, 300, 330, 360]\n180-180 [180]\n180-240 [180, 210, 240]\n180-300 [180, 210, 240, 270, 300]\n180-360 [0, 180, 210, 240, 270, 300, 330, 360]\n240-  0 [0, 240, 270, 300, 330, 360]\n240- 60 [0, 30, 60, 240, 270, 300, 330, 360]\n240-120 [0, 30, 60, 90, 120, 240, 270, 300, 330, 360]\n240-180 [0, 30, 60, 90, 120, 150, 180, 240, 270, 300, 330, 360]\n240-240 [240]\n240-300 [240, 270, 300]\n240-360 [0, 240, 270, 300, 330, 360]\n300-  0 [0, 300, 330, 360]\n300- 60 [0, 30, 60, 300, 330, 360]\n300-120 [0, 30, 60, 90, 120, 300, 330, 360]\n300-180 [0, 30, 60, 90, 120, 150, 180, 300, 330, 360]\n300-240 [0, 30, 60, 90, 120, 150, 180, 210, 240, 300, 330, 360]\n300-300 [300]\n300-360 [0, 300, 330, 360]\n360-  0 [0, 360]\n360- 60 [0, 30, 60, 360]\n360-120 [0, 30, 60, 90, 120, 360]\n360-180 [0, 30, 60, 90, 120, 150, 180, 360]\n360-240 [0, 30, 60, 90, 120, 150, 180, 210, 240, 360]\n360-300 [0, 30, 60, 90, 120, 150, 180, 210, 240, 270, 300, 360]\n360-360 [0, 360]\n这是使用问题中的数据进行的测试。
\n\ncoef = [[1,22], [2,24], [359,15], [360,21]]\nprint(coef)\nfor x in range(0, 361):\n    sel = [coe for coe in coef if in_angle_interval(x, coe[0], coe[1])]\n    if sel:\n        print(\'{:3} {}\'.format(x, sel))\n输出
\n\n[[1, 22], [2, 24], [359, 15], [360, 21]]\n  0 [[359, 15], [360, 21]]\n  1 [[1, 22], [359, 15], [360, 21]]\n  2 [[1, 22], [2, 24], [359, 15], [360, 21]]\n  3 [[1, 22], [2, 24], [359, 15], [360, 21]]\n  4 [[1, 22], [2, 24], [359, 15], [360, 21]]\n  5 [[1, 22], [2, 24], [359, 15], [360, 21]]\n  6 [[1, 22], [2, 24], [359, 15], [360, 21]]\n  7 [[1, 22], [2, 24], [359, 15], [360, 21]]\n  8 [[1, 22], [2, 24], [359, 15], [360, 21]]\n  9 [[1, 22], [2, 24], [359, 15], [360, 21]]\n 10 [[1, 22], [2, 24], [359, 15], [360, 21]]\n 11 [[1, 22], [2, 24], [359, 15], [360, 21]]\n 12 [[1, 22], [2, 24], [359, 15], [360, 21]]\n 13 [[1, 22], [2, 24], [359, 15], [360, 21]]\n 14 [[1, 22], [2, 24], [359, 15], [360, 21]]\n 15 [[1, 22], [2, 24], [359, 15], [360, 21]]\n 16 [[1, 22], [2, 24], [360, 21]]\n 17 [[1, 22], [2, 24], [360, 21]]\n 18 [[1, 22], [2, 24], [360, 21]]\n 19 [[1, 22], [2, 24], [360, 21]]\n 20 [[1, 22], [2, 24], [360, 21]]\n 21 [[1, 22], [2, 24], [360, 21]]\n 22 [[1, 22], [2, 24]]\n 23 [[2, 24]]\n 24 [[2, 24]]\n359 [[359, 15]]\n360 [[359, 15], [360, 21]]\n