- 已关闭**。此问题需要details or clarity。当前不接受答案。
- 想要改进此问题吗?**通过editing this post添加详细信息并阐明问题。
昨天关门了。
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];
}
1条答案
按热度按时间tjvv9vkg1#
你可以交叉比较你的俄罗斯方块与这个C++ Tetris of mine,但看起来你是使用不同的数据结构来举行四角大楼。
旋转基于2D Rodrigues旋转公式:
顺便说一句,这可以用三角学来推导(我们以前在高中的数学课上就这么做过)...
现在如果你意识到你使用的旋转Angular 是90度,那么所有的cos和sin都会变为
+/-1
...产生2D 90度旋转:
或:
一个是顺时针旋转,另一个是逆时针旋转,这取决于你的坐标系属性。顺便说一下,第一个方程也是2D叉积,如下所示:
vec2(y,-x) = cross(vec2(x,y))
.现在它绕着
(0,0)
旋转,但我们想绕着某个点(x0,y0)
旋转,所以我们简单地平移(因此(x0,y0)
变成(0,0)
,旋转,然后平移回来,导致:或: