旋转一个矩形
Rotating a rectangle
我正在尝试使用滑块旋转矩形。
滑块具有 -100 到 +100 的值。我想用它来旋转矩形。
我尝试了一些方法,包括计算矩形的角,然后弄乱矩阵,但没有成功。
(我更喜欢使用矩阵)
一个更简单的解决方案是从一开始就定义固定点,而不是只使用矩形的边。
在下面的代码中,我可以使用滑块调整矩形的大小。
Dialog::Dialog(QWidget *parent) :
QDialog(parent),
ui(new Ui::Dialog)
{
ui->setupUi(this);
a = 230; //positioning
b = 150; //positioning
c = 200; //size of drawing
d = 150; //size of drawing
connect(ui->horizontalSlider,SIGNAL(valueChanged(int)),this,SLOT(update()));
}
Dialog::~Dialog()
{
delete ui;
}
void Dialog::paintEvent(QPaintEvent *e)
{
QPainter painter(this);
painter.fillRect(a - ui->horizontalSlider->value(),
b - ui->horizontalSlider->value(),
c + ui->horizontalSlider->value() * 2,
d + ui->horizontalSlider->value() * 2, Qt::green);
}
非常感谢任何形式的帮助。
首先是旋转矩阵,它将围绕 Z 轴(面向您)旋转 X-Y space 中的任意点 t 弧度:
R = [ cos(t), -sin(t);
sin(t), cos(t)]
要获得旋转点,您必须围绕 X-Y 平面上的特定点旋转。我假设您想围绕其中心旋转矩形。
设c为中心的像素坐标:
c = [cx;
cy]
那么旋转的点是:
P = R*(p-c) + c
其中P是旋转点,p是要旋转的矩形点,都是[2x1]向量,c。请注意,我使用的是矩阵代数,因此乘法是矩阵乘法,而不是标量乘法。
下一个问题是绘制矩形。我不熟悉 Qt 矩形绘图,但从文档中可以看出,用 fillRect 做你想做的事情是行不通的,因为它假定矩形是未旋转的。
当你有旋转坐标时,你可以使用 drawPolygon 做你想做的事。
你可以移动你的画家并旋转canvas来实现它:
void Dialog::paintEvent(QPaintEvent *e)
{
QPainter painter(this);
painter.save();
painter.translate(a, b);//Move pen.
painter.rotate(30);//rotate canvas.
painter.fillRect(-ui->horizontalSlider->value(),
-ui->horizontalSlider->value(),
c + ui->horizontalSlider->value() * 2,
d + ui->horizontalSlider->value() * 2, Qt::green);
painter.restore();
}
我通过使用“painter.drawLine( ax, ay, bx, by );” 绘制矩形解决了这个问题。之后我对每一行使用了以下公式:
double ax = MidPointWidth + (-(Size + minWidth)) * cos(Angle) - (Size + minHeight) * sin(Angle);
double ay = MidPointHeight + (-(Size + minWidth)) * sin(Angle) + (Size + minHeight) * cos(Angle);
希望这会对某人有所帮助。
我正在尝试使用滑块旋转矩形。
滑块具有 -100 到 +100 的值。我想用它来旋转矩形。
我尝试了一些方法,包括计算矩形的角,然后弄乱矩阵,但没有成功。
(我更喜欢使用矩阵)
一个更简单的解决方案是从一开始就定义固定点,而不是只使用矩形的边。
在下面的代码中,我可以使用滑块调整矩形的大小。
Dialog::Dialog(QWidget *parent) :
QDialog(parent),
ui(new Ui::Dialog)
{
ui->setupUi(this);
a = 230; //positioning
b = 150; //positioning
c = 200; //size of drawing
d = 150; //size of drawing
connect(ui->horizontalSlider,SIGNAL(valueChanged(int)),this,SLOT(update()));
}
Dialog::~Dialog()
{
delete ui;
}
void Dialog::paintEvent(QPaintEvent *e)
{
QPainter painter(this);
painter.fillRect(a - ui->horizontalSlider->value(),
b - ui->horizontalSlider->value(),
c + ui->horizontalSlider->value() * 2,
d + ui->horizontalSlider->value() * 2, Qt::green);
}
非常感谢任何形式的帮助。
首先是旋转矩阵,它将围绕 Z 轴(面向您)旋转 X-Y space 中的任意点 t 弧度:
R = [ cos(t), -sin(t);
sin(t), cos(t)]
要获得旋转点,您必须围绕 X-Y 平面上的特定点旋转。我假设您想围绕其中心旋转矩形。
设c为中心的像素坐标:
c = [cx;
cy]
那么旋转的点是:
P = R*(p-c) + c
其中P是旋转点,p是要旋转的矩形点,都是[2x1]向量,c。请注意,我使用的是矩阵代数,因此乘法是矩阵乘法,而不是标量乘法。 下一个问题是绘制矩形。我不熟悉 Qt 矩形绘图,但从文档中可以看出,用 fillRect 做你想做的事情是行不通的,因为它假定矩形是未旋转的。 当你有旋转坐标时,你可以使用 drawPolygon 做你想做的事。
你可以移动你的画家并旋转canvas来实现它:
void Dialog::paintEvent(QPaintEvent *e)
{
QPainter painter(this);
painter.save();
painter.translate(a, b);//Move pen.
painter.rotate(30);//rotate canvas.
painter.fillRect(-ui->horizontalSlider->value(),
-ui->horizontalSlider->value(),
c + ui->horizontalSlider->value() * 2,
d + ui->horizontalSlider->value() * 2, Qt::green);
painter.restore();
}
我通过使用“painter.drawLine( ax, ay, bx, by );” 绘制矩形解决了这个问题。之后我对每一行使用了以下公式:
double ax = MidPointWidth + (-(Size + minWidth)) * cos(Angle) - (Size + minHeight) * sin(Angle);
double ay = MidPointHeight + (-(Size + minWidth)) * sin(Angle) + (Size + minHeight) * cos(Angle);
希望这会对某人有所帮助。