逐步简化 (x,y) 坐标列表中的直线运动

Posted

技术标签:

【中文标题】逐步简化 (x,y) 坐标列表中的直线运动【英文标题】:Simplifying straight line movements in a list of step by step (x,y) coordinates 【发布时间】:2021-03-19 01:39:10 【问题描述】:

在我的游戏中,我有一个元组列表 (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)] 这不是我想要的。有人可以指出正确的方法吗?

【问题讨论】:

这个I want to reduce any series of steps where x is fixed (or y is fixed) to only the first and the last step 我不清楚。为什么(36, 36) 被删除而(36, 35) 没有被删除? (36, 35) 没有被移除,因为它是 x 固定为 36 的最后一个元素。同时,(36, 35) 也标志着第二条直线的开始(其中y 固定为 35)。这意味着:第一条直线:(36, 37) 到 (36, 35),第二条直线:(36, 35) 到 (38, 35),第三条直线:(38, 35) 到 (38, 32) @Gabriel OP 想要固定 x 或固定 y 运动的第一步和最后一步 【参考方案1】:

你可以试试这个: 在迭代列表(解决方案)时将上一个和下一个位置与当前位置进行比较,以检查所有点是否在同一行,如果它们在同一行,则通过,否则附加到最终(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)]

希望对您有所帮助,如有任何疑问,请随时与我们联系。

【讨论】:

工作完美,谢谢!最后我不会想到 opti.append(solution[-1]) 。在尝试期间,我还尝试测试 i-1 和 i+1,但我错过了范围,我使用 for i in range(len(solution)),导致索引超出范围错误。 不客气。我完全可以理解,它发生在每个人身上。祝你好运。【参考方案2】:

如果不在一条直线上,则保留分数。

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) 坐标列表中的直线运动的主要内容,如果未能解决你的问题,请参考以下文章

三维坐标系中两点式求直线方程的详细解释

从 2d 图像像素获取 3d 坐标系中的 x,y

物理运动方程

物理运动方程

从坐标列表中提取运动数据

如何在三维坐标中确定一条直线,一个平面