在逐步 (x,y) 坐标列表中简化直线运动
Simplifying straight line movements in a list of step by step (x,y) coordinates
在我的游戏中,我有一个元组列表 (x,y) :
solution = [(36, 37), (36, 36), (36, 35), (37, 35), (38, 35), (38, 34), (38, 33), (38, 32)]
这个列表描述了玩家从点 (36, 37) 移动到点 (38, 32) 应该做的动作。
我想将此列表简化为以下内容:
opti = [(36, 37), (36, 35), (38, 35), (38, 32)]
这意味着我想将 x 固定(或 y 固定)的任何一系列步骤减少到只有第一步和最后一步。
我正在努力寻找一种算法来执行此操作。我已经尝试了两个多小时,以下是我目前正在尝试的工作:
solution = [(36, 37), (36, 36), (36, 35), (37, 35), (38, 35), (38, 34), (38, 33), (38, 32)]
opti = [solution[0]]
for i in range(len(solution)):
if opti[-1][0] == solution[i][0]:
pass
elif opti[-1][1] == solution[i][1]:
pass
else:
opti.append(solution[i])
最后 opti 等于 [(36, 37), (37, 35), (38, 34)]
,这不是我想要的。有人能告诉我正确的方法吗?
你可以试试这个:
在遍历列表(解决方案)时将上一个和下一个位置与当前位置进行比较,以检查所有点是否在同一行中,如果它们在同一行中则通过,否则附加到最终(opti)列表。
solution = [(36, 37), (36, 36), (36, 35), (37, 35), (38, 35), (38, 34), (38, 33), (38, 32)]
opti = [solution[0]]
for i in range(1, len(solution) -1 ):
if solution[i-1][0] == solution[i][0] and solution[i][0] == solution[i+1][0]:
pass
elif solution[i-1][1] == solution[i][1] and solution[i][1] == solution[i+1][1]:
pass
else:
opti.append(solution[i])
opti.append(solution[-1])
print(opti)
输出:
[(36, 37), (36, 35), (38, 35), (38, 32)]
希望对您有所帮助,如有任何疑问,请随时与我们联系。
如果点不在一条直线上,请保留点。
pad = [(None, None)]
opti = [(x, y)
for (x0, y0), (x, y), (x1, y1)
in zip(pad + solution, solution, solution[1:] + pad)
if not (x0 == x == x1 or y0 == y == y1)]
在我的游戏中,我有一个元组列表 (x,y) :
solution = [(36, 37), (36, 36), (36, 35), (37, 35), (38, 35), (38, 34), (38, 33), (38, 32)]
这个列表描述了玩家从点 (36, 37) 移动到点 (38, 32) 应该做的动作。
我想将此列表简化为以下内容:
opti = [(36, 37), (36, 35), (38, 35), (38, 32)]
这意味着我想将 x 固定(或 y 固定)的任何一系列步骤减少到只有第一步和最后一步。
我正在努力寻找一种算法来执行此操作。我已经尝试了两个多小时,以下是我目前正在尝试的工作:
solution = [(36, 37), (36, 36), (36, 35), (37, 35), (38, 35), (38, 34), (38, 33), (38, 32)]
opti = [solution[0]]
for i in range(len(solution)):
if opti[-1][0] == solution[i][0]:
pass
elif opti[-1][1] == solution[i][1]:
pass
else:
opti.append(solution[i])
最后 opti 等于 [(36, 37), (37, 35), (38, 34)]
,这不是我想要的。有人能告诉我正确的方法吗?
你可以试试这个: 在遍历列表(解决方案)时将上一个和下一个位置与当前位置进行比较,以检查所有点是否在同一行中,如果它们在同一行中则通过,否则附加到最终(opti)列表。
solution = [(36, 37), (36, 36), (36, 35), (37, 35), (38, 35), (38, 34), (38, 33), (38, 32)]
opti = [solution[0]]
for i in range(1, len(solution) -1 ):
if solution[i-1][0] == solution[i][0] and solution[i][0] == solution[i+1][0]:
pass
elif solution[i-1][1] == solution[i][1] and solution[i][1] == solution[i+1][1]:
pass
else:
opti.append(solution[i])
opti.append(solution[-1])
print(opti)
输出:
[(36, 37), (36, 35), (38, 35), (38, 32)]
希望对您有所帮助,如有任何疑问,请随时与我们联系。
如果点不在一条直线上,请保留点。
pad = [(None, None)]
opti = [(x, y)
for (x0, y0), (x, y), (x1, y1)
in zip(pad + solution, solution, solution[1:] + pad)
if not (x0 == x == x1 or y0 == y == y1)]