旋转矩形

时间:2015-01-22 02:37:38

标签: c++ qt math qt-creator

我尝试使用滑块旋转矩形。

滑块的值为-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);

}



enter image description here

非常感谢任何形式的帮助。

3 个答案:

答案 0 :(得分:2)

您可以移动画家并旋转画布来实现它:

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();
}

答案 1 :(得分:1)

首先,这里是旋转矩阵,它将围绕Z轴(面向你)的X-Y空间中的任何点旋转 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 rect绘图,但是从文档中,用fillRect做你想要的东西是行不通的,因为它假定矩形是未旋转的。 当你有旋转坐标时,可以使用drawPolygon做你想做的事。

答案 2 :(得分:0)

我通过使用“ 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);



希望这会对某人有所帮助。

相关问题