在C++中使用2D数组的俄罗斯方块旋转算法[已关闭]

vfhzx4xs  于 2022-12-05  发布在  其他
关注(0)|答案(1)|浏览(137)

昨天关门了。
Improve this question
我正在做一个俄罗斯方块游戏,在整个过程中,我一直在跟踪video。在这个视频中,他们使用了一种算法来旋转方块,但我不知道它是如何工作的,请有人能给我解释一下它是如何工作的,这里使用的算法的名称是什么?

int figures[7][4] =
{
  1,3,5,7, // I
  2,4,5,7, // Z
  3,5,4,6, // S
  3,5,4,7, // T
  2,3,5,7, // L
  3,5,7,6, // J
  2,3,4,5, // O
};

struct Point
 {int x,y;} a[4], b[4];
  
  //////Rotate//////
  if (rotate)
  {
      Point p = a[1]; // center of rotation
      for (int i=0;i<4;i++)
      {
        int x = a[i].y-p.y;
        int y = a[i].x-p.x;

        a[i].x = p.x - x;
        a[i].y = p.y + y;
      }
      if (!check()) for (int i=0;i<4;i++) a[i]=b[i];
  }

full source code

tjvv9vkg

tjvv9vkg1#

你可以交叉比较你的俄罗斯方块与这个C++ Tetris of mine,但看起来你是使用不同的数据结构来举行四角大楼。
旋转基于2D Rodrigues旋转公式:

顺便说一句,这可以用三角学来推导(我们以前在高中的数学课上就这么做过)...
现在如果你意识到你使用的旋转Angular 是90度,那么所有的cos和sin都会变为+/-1 ...
产生2D 90度旋转:

x' =  y
y' = -x

或:

x' = -y
y' =  x

一个是顺时针旋转,另一个是逆时针旋转,这取决于你的坐标系属性。顺便说一下,第一个方程也是2D叉积,如下所示:vec2(y,-x) = cross(vec2(x,y)) .
现在它绕着(0,0)旋转,但我们想绕着某个点(x0,y0)旋转,所以我们简单地平移(因此(x0,y0)变成(0,0),旋转,然后平移回来,导致:

x' =  (y-y0) + x0
y' = -(x-x0) + y0

或:

x' = -(y-y0) + x0
y' =  (x-x0) + y0

相关问题