C++ 旋转矩形

C++ 旋转矩形,c++,qt,math,qt-creator,C++,Qt,Math,Qt Creator,我正在尝试使用滑块旋转矩形 滑块的值为-100到+100。我想用这个来旋转矩形 我尝试了一些方法,包括计算矩形的角点,然后用一个矩阵乱搞,结果失败了。 (我更喜欢使用矩阵) 一个更简单的解决方案是从一开始就定义固定点,而不是只处理矩形的边。 在下面的代码中,我可以使用滑块调整矩形的大小 Dialog::Dialog(QWidget *parent) : QDialog(parent), ui(new Ui::Dialog) { ui->setupUi(th

我正在尝试使用滑块旋转矩形

滑块的值为-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空间中的任意点,旋转角度由t弧度给出:

要获得旋转点,必须围绕X-Y平面上的特定点旋转。我假设你想绕着它的中心旋转矩形

c为中心的像素坐标:

c = [cx;
     cy]
旋转后的点是:

P = R*(p-c) + c
其中,p是旋转点,p是要旋转的矩形点,两者都是[2x1]向量,就像c一样。注意,我使用的是矩阵代数,所以乘法是矩阵乘法,而不是标量乘法。 下一个问题是绘制矩形。我不熟悉Qt-rect绘图,但从文档中可以看出,使用fillRect做您想做的事情是行不通的,因为它假定矩形是未旋转的。
当你有旋转坐标时,你可以使用来做你想做的事情。

首先,这里是旋转矩阵,它将围绕Z轴(面向你)旋转X-Y空间中的任意点,旋转角度由t弧度给出:

要获得旋转点,必须围绕X-Y平面上的特定点旋转。我假设你想绕着它的中心旋转矩形

c为中心的像素坐标:

c = [cx;
     cy]
旋转后的点是:

P = R*(p-c) + c
其中,p是旋转点,p是要旋转的矩形点,两者都是[2x1]向量,就像c一样。注意,我使用的是矩阵代数,所以乘法是矩阵乘法,而不是标量乘法。 下一个问题是绘制矩形。我不熟悉Qt-rect绘图,但从文档中可以看出,使用fillRect做您想做的事情是行不通的,因为它假定矩形是未旋转的。
旋转坐标后,您可以使用来执行所需操作。

您可以移动画师并旋转画布来实现此操作:

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

您可以移动画师并旋转画布以实现此目的:

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


希望这能对其他人有所帮助。

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



希望这能对其他人有所帮助。

阅读一些关于旋转矩阵以及它们如何变换坐标的内容,例如,虽然我不知道Qt,但我猜您只需要变换角点,然后重新绘制矩形,这也是我的问题。我在Qt中正确地实现了旋转矩阵,但没有成功。请阅读一些关于旋转矩阵以及它们如何变换坐标的内容,例如,尽管我不知道Qt,但我猜您只需要变换角点,然后重新绘制矩形,这也是我的问题。我在Qt中正确实现旋转矩阵时失败。您可以查看模拟时钟Qt示例应用程序。它使用旋转来绘制时钟面。感谢您使用这种方法,尽管我想使用更数学的方法(如旋转矩阵)来创建相同的效果。您可以查看模拟时钟Qt示例应用程序。它使用旋转来绘制时钟面。感谢您使用这种方法,尽管我想使用更数学的方法(如旋转矩阵)来创建相同的效果。