gpt4 book ai didi

c++ - 相对于另一个顶级对象定位

转载 作者:行者123 更新时间:2023-11-30 03:52:14 26 4
gpt4 key购买 nike

我需要定位一个顶级对象,以便它始终保持在相对于另一个顶级对象的位置。例如,下图中的矩形应该贴在椭圆的“前面”:

correct positioning example

旋转 180 度后,它应该是这样的:

correct positioning example rotated 180 degrees

相反,矩形的位置不正确:

incorrect positioning

请运行下面的示例(QGraphicsScene 的使用仅用于演示目的,因为实际用例是在物理学中)。

#include <QtWidgets>

class Scene : public QGraphicsScene
{
Q_OBJECT
public:
Scene()
{
mEllipse = addEllipse(0, 0, 25, 25);
mEllipse->setTransformOriginPoint(QPointF(12.5, 12.5));

QGraphicsLineItem *line = new QGraphicsLineItem(QLineF(0, 0, 0, -12.5), mEllipse);
line->setPos(12.5, 12.5);

mRect = addRect(0, 0, 10, 10);
mRect->setTransformOriginPoint(QPointF(5, 5));

line = new QGraphicsLineItem(QLineF(0, 0, 0, -5), mRect);
line->setPos(5, 5);

connect(&mTimer, SIGNAL(timeout()), this, SLOT(timeout()));
mTimer.start(5);
}

public slots:
void timeout()
{
mEllipse->setRotation(mEllipse->rotation() + 0.5);

QTransform t;
t.rotate(mEllipse->rotation());

qreal relativeX = mEllipse->boundingRect().width() / 2 - mRect->boundingRect().width() / 2;
qreal relativeY = -mRect->boundingRect().height();

mRect->setPos(mEllipse->pos() + t.map(QPointF(relativeX, relativeY)));
mRect->setRotation(mEllipse->rotation());
}

public:
QTimer mTimer;
QGraphicsEllipseItem *mEllipse;
QGraphicsRectItem *mRect;
};

int main(int argc, char** argv)
{
QApplication app(argc, argv);

QGraphicsView view;
view.setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
view.setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
view.setRenderHints(QPainter::Antialiasing | QPainter::SmoothPixmapTransform);
view.setScene(new Scene);
view.resize(200, 200);
view.show();

return app.exec();
}

#include "main.moc"

请注意,矩形的位置并不总是相同的,但它相对于椭圆的位置应始终保持相同。例如,它可能从这个位置开始:

alternative positioning example

但旋转时它应该保持在那个相对位置:

alternative positioning example rotated 180 degrees

最佳答案

如果想让两个物体保持相同的相对位置,就需要绕同一个原点旋转。

此处您的圆围绕其中心(点 12.5, 12.5)旋转,但您的矩形围绕另一个原点 (5,5) 而不是圆的中心 (12.5, 12.5) 旋转。

如果您修复原点,它将按您预期的那样工作:

mRect->setTransformOriginPoint(QPointF(12.5, 12.5));

即使矩形以偏移量开始:

mRect = addRect(-10, 0, 10, 10); // Start 10 units to the left

Screenshot of the result

关于c++ - 相对于另一个顶级对象定位,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30826981/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com