当前位置:   article > 正文

【Unity】二维坐标映射成ID_游戏开发中坐标的映射

游戏开发中坐标的映射

        在平面上,格子坐标通常是个二维坐标(X,Y),但是二维坐标有很多不方便的地方,且如果作为键值,其取值效率不高。因此大部分情况下,需要将二维坐标转换成ID来使用(且能从ID转换回坐标)。

        常用的方式就是X*N+Y,N为一个足够大的数。但是这种方式有问题,其只能支持全正数或者全负数,一旦有正有负,就会坐标转换失败。因此需要一种较为便捷的算法,能将二维坐标映射成ID,且能互相转换。

1、简述

        基本原理如下图所示:

         这就是ID的生成顺序,以一个螺旋形状进行生成。

        这种生成方式的优点之一,便是可以仅仅通过转换出来的ID就能判定其里坐标原点的距离,存数组的时候可以视作有序。缺点便是其性能并不是最优。

2、代码

        原理没什么好说的,就是纯计算。直接上代码:

        2.1 : 坐标转成ID

  1. public int ToInt(Vector2Int grid)
  2. {
  3. if (grid.x == 0 && grid.y == 0) return 0;
  4. int k = math.max(math.abs(grid.x), math.abs(grid.y));
  5. if (grid.x > grid.y)
  6. return 4 * k * k + 1 + 2 * k + grid.x + grid.y;
  7. else
  8. return 4 * k * k + 1 - 2 * k - grid.x - grid.y;
  9. }

        2.2: ID转换回坐标

        ID转换回坐标略复杂一些,代码如下:

  1. public Vector2Int GetMapGrid(int index)
  2. {
  3. if (index == 0) return Vector2Int.zero;
  4. float sqrtX = math.sqrt(index);
  5. int k = (int)((sqrtX + 1) / 2);
  6. if (sqrtX > 2 * k)
  7. {
  8. int xAy = index - (4 * k * k + 1) - 2 * k;
  9. if (xAy < 0)
  10. {
  11. int y = -1 * k;
  12. int x = xAy - y;
  13. return new Vector2Int(x, y);
  14. }
  15. else
  16. {
  17. int x = k;
  18. int y = xAy - x;
  19. return new Vector2Int(x, y);
  20. }
  21. }
  22. else
  23. {
  24. int xAy = (4 * k * k + 1) - index - 2 * k;
  25. if (xAy < 0)
  26. {
  27. int x = -k;
  28. int y = xAy - x;
  29. return new Vector2Int(x, y);
  30. }
  31. else
  32. {
  33. int y = k;
  34. int x = xAy - y;
  35. return new Vector2Int(x, y);
  36. }
  37. }
  38. }

3、使用Long实现

        当然,还有一种其他的方法可以实现二维坐标转ID。原理简单,就是用一个long(int64)来储存,前32存x,后32位存y。这种处理方式很重要的一点,就是要避免进行加减法计算,只能使用位运算进行拼接。

        代码如下:

  1. public long GetID(int q, int r)
  2. {
  3. long rt = (long)q << 32;
  4. rt = rt | (r & 0xffffffff);
  5. return rt;
  6. }
  7. public Vector2Int GetCoordinate(long id)
  8. {
  9. int x = (int)(id >> 32);
  10. int y = (int)id;
  11. return new Vector2Int(x, y);
  12. }

        这个方法的缺点,就是转换后的值会变得特别大,而且不能仅通过观察数值大小就能确定其距离坐标原点的远近。

        优点是理解容易,且性能更佳。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Cpp五条/article/detail/91648
推荐阅读
相关标签
  

闽ICP备14008679号