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示例应用程序。它使用旋转来绘制时钟面。感谢您使用这种方法,尽管我想使用更数学的方法(如旋转矩阵)来创建相同的效果。