Algorithm 将正方形捕捉到网格算法

Algorithm 将正方形捕捉到网格算法,algorithm,Algorithm,我正在写一个游戏,其中包括一个二维的棋盘,可以移动。物理引擎正在处理运动,但在运动结束时,我试图将瓷砖捕捉到网格上 现在坚持住!在大多数情况下,我已经正确地捕捉到网格。我只是使用一种模的形式(实际上是通过比较重复相加)从正方形的位置计算行和列,并确定每个瓷砖的中心在网格中的位置 这是最难的部分。有“边缘情况”(字面意思)可以有两个瓷砖在同一个广场结束。这是因为平铺比正方形稍小,因此如果将其中一个移动到刚好经过边缘线,则下一个将被推动,但不足以通过边缘线,因此最终将得到属于同一网格的两个正方形 在

我正在写一个游戏,其中包括一个二维的棋盘,可以移动。物理引擎正在处理运动,但在运动结束时,我试图将瓷砖捕捉到网格上

现在坚持住!在大多数情况下,我已经正确地捕捉到网格。我只是使用一种模的形式(实际上是通过比较重复相加)从正方形的位置计算行和列,并确定每个瓷砖的中心在网格中的位置

这是最难的部分。有“边缘情况”(字面意思)可以有两个瓷砖在同一个广场结束。这是因为平铺比正方形稍小,因此如果将其中一个移动到刚好经过边缘线,则下一个将被推动,但不足以通过边缘线,因此最终将得到属于同一网格的两个正方形

在极端情况下,还有一个更难的问题

以这个网格为例,其中X是瓷砖的中心

 _______
| |X| | |
| |X| | |
| |X|X| |
|_|X|_|_|
现在想象一下,在一次移动结束时,它是这样的(其中X是“在线上”)

您可以看到,不仅两个正方形属于第三行和第二列,而且您不能在不计数、检查等的情况下向一个或另一个方向“推”瓷砖

如果你想象一个这样的网格(所有的瓷砖都在一条线上),你会发现这可能会失控

 _______
| X X X |
| X X X |
| X X X |
|_X_X_X_|
想法

编辑

这是一个现实而常见的情况:

 _______
| |X| | |
| |X| | |
| X X | |
|_|X|_|_|

现在,两者都捕捉到同一列,留下一个“挤压”的情况,即我们尝试将5个磁贴捕捉到一个4行列中…

根据磁贴与中心的距离将其放入优先级队列中,然后将最好的磁贴放在第一位。这解决了大多数情况。您仍然需要一些复杂的“我需要推你过去”当一块瓷砖在边缘上,并且在任何一边都有一块瓷砖滑过并被放在第一位时,这种情况的逻辑。想想
|X X | X |
。在你的另一个问题之后阅读了这篇文章,我不确定如果瓷砖在每次移动后都被捕捉到网格上,怎么会出现第二张图这样的情况。一次移动是如何导致5块瓷砖移动的rlap每个2个网格空间?好吧,移动方式没有限制。你可以将每个瓷砖推到一半,然后将“触摸瓷砖”保留在重叠的位置。这实际上不是真实的模拟。我将进行编辑。为了清晰起见,你可以消除除一个方向以外的任何方向(北、东、南、西)按“触摸”或“移动”。我现在明白了,谢谢。虽然这可能不是你想要的答案,如果唯一的“有意义”瓷砖的位置是捕捉到的网格位置,那么,通过允许中间非捕捉到的网格位置,您似乎增加了很多复杂性…对这些位置的修复也可能导致违反直觉的用户体验。在不完全放弃“平滑度”的情况下简化一切,让所有的瓷砖都“粘”上,这样如果你推一块瓷砖,但推不到一半,它就会滑回原来的位置。根据瓷砖与中心的距离,将瓷砖放入优先级队列,然后将最好的放在第一位。这解决了大多数情况。你仍然需要一些复杂的“我需要推你”当一块瓷砖在边缘上,并且在任何一边都有一块瓷砖滑过并被放在第一位时,这种情况的逻辑。想想
|X X | X |
。在你的另一个问题之后阅读了这篇文章,我不确定如果瓷砖在每次移动后都被捕捉到网格上,怎么会出现第二张图这样的情况。一次移动是如何导致5块瓷砖移动的rlap每个2个网格空间?好吧,移动方式没有限制。你可以将每个瓷砖推到一半,然后将“触摸瓷砖”保留在重叠的位置。这实际上不是真实的模拟。我将进行编辑。为了清晰起见,你可以消除除一个方向以外的任何方向(北、东、南、西)按“触摸”或“移动”。我现在明白了,谢谢。虽然这可能不是你想要的答案,如果唯一的“有意义”瓷砖的位置是捕捉到的网格位置,那么,通过允许中间非捕捉到的网格位置,您似乎增加了很多复杂性…对这些位置的修复也可能导致违反直觉的用户体验。在不完全放弃“平滑度”的情况下简化一切,让所有的瓷砖都“粘”上,这样,如果你推一块瓷砖,但推不到一半,它就会滑回原来的位置?
 _______
| |X| | |
| |X| | |
| X X | |
|_|X|_|_|