在旋转的俄罗斯方块运行块

我有一个类tetronimo (俄罗斯方块块)具有四个QRect类型(命名为firstsecondthirdfourth分别)。 我画使用每个tetronimo build_tetronimo_L类型的功能。

这些建立在特定方向的tetronimo,但如在俄罗斯方块你应该能够旋转tetronimo的,我试图通过旋转tetronimo的每个单独平方旋转的tetronimo。

我已经发现了下面的公式适用于每个(X,Y)特定正方形的坐标。

下一页末= COS(角度)* oldx - 罪(角)* oldy

newy指定=罪(角)* oldx + COS(角度)* oldy

现在, QRect类型的Qt,不只是似乎有一个setCoords函数,它的(X,Y)的各广场左上角 右下角点坐标。

我这里有一个例子(这似乎并没有产生正确的结果)在我tetronimo旋转的前两个广场。

谁能告诉我,我应该如何正确地旋转这些方块,通过运行时旋转计算?

void tetromino::rotate(double angle) // angle in degrees { std::map<std::string, rect_coords> coords = get_coordinates(); // FIRST SQUARE rect_coords first_coords = coords["first"]; //top left x and y int newx_first_tl = (cos(to_radians(angle)) * first_coords.top_left_x) - (sin(to_radians(angle)) * first_coords.top_left_y); int newy_first_tl = (sin(to_radians(angle)) * first_coords.top_left_x) + (cos(to_radians(angle)) * first_coords.top_left_y); //bottom right x and y int newx_first_bl = (cos(to_radians(angle)) * first_coords.bottom_right_x) - (sin(to_radians(angle)) * first_coords.bottom_right_y); int newy_first_bl = (cos(to_radians(angle)) * first_coords.bottom_right_x) + (sin(to_radians(angle)) * first_coords.bottom_right_y); //CHANGE COORDINATES first->setCoords( newx_first_tl, newy_first_tl, newx_first_tl + tetro_size,newy_first_tl - tetro_size); //SECOND SQUARE rect_coords second_coords = coords["second"]; int newx_second_tl = (cos(to_radians(angle)) * second_coords.top_left_x) - (sin(to_radians(angle)) * second_coords.top_left_y); int newy_second_tl = (sin(to_radians(angle)) * second_coords.top_left_x) + (cos(to_radians(angle)) * second_coords.top_left_y); //CHANGE COORDINATES second->setCoords(newx_second_tl, newy_second_tl, newx_second_tl - tetro_size, newy_second_tl + tetro_size);

firstsecondQRect类型。 rect_coords只是一个struct具有四个int在它的时候,那些存储的平方的坐标。

第一方和第二方计算是不同的,因为我是玩弄试图弄明白。

我希望有人能帮助我想出解决办法?

(是的,我能做到这一点简单得多,但我想从这个学)

--------------解决方案-------------

这似乎更像是一个比一个编程问题一个数学问题。 只要插上像角90度值摸不着头脑。 为90度,一个点(x,y)被映射到(-y,x)的 你可能不希望围绕原点而是围绕某一支点旋转CX,CY对于您需要先翻译,然后旋转,再转换回:

(x,y) := (xc.x, yc.y) // translate into coo system w/ origin at c
(x,y) := (-y, x) // rotate
(x,y) := (x+cx, y+cy) // translate into original coo system

转动之前,你有翻译,这样一块在原点为中心。

1)您的翻译遮挡住定心0,0

2)旋转块

3)再次翻译块x的中心,Y

如果旋转而无需翻译你总是会绕0,0但由于块不居中它将绕中心旋转。

要居中你的格挡很简单:

1)每一个点,计算X和Y的中位数,我们命名为m

2)减去MX和我的所有点的坐标

3)旋转

4)再添加MX和我来分。

当然,你可以用线性代数和矢量*矩阵乘法,但也许实在是太多了:)

翻译...让我们说我们有坐标的段(3,5)B(10,15)

如果你想围绕其中心旋转,我们首先把它翻译给我们的原点。

让我们来计算MX和我。

的mx =(10 - 3)/ 2我=(15 - 5)/ 2

现在我们计算点A1和B1平移段因此被居中原点。

A1(AX - MX,AY - 我的)B1(BX - MX,BY - 我)

现在,我们可以执行我们的A1和B1的旋转(你知道如何)。

那么我们必须再次转换到原来的位置。

A =(rotatedA1.X + MX,rotatedA1.y +我的)B =(rotatedB1.X + MX,rotatedB1.y +我)

如果不是有两点你有N个点,你当然有n个点做的一切。

你可以使用Qt的图形视图该做所有的几何计算为您服务。

或者,你只是想学习基本的线性几何变换? 然后阅读数学课本很可能比编码更合适。

分类:C# 时间:2015-03-15 人气:0
本文关键词: 图形,旋转,坐标
分享到:

相关文章

Copyright (C) 55228885.com, All Rights Reserved.

55228885 版权所有 京ICP备15002868号

processed in 0.591 (s). 10 q(s)