如何根据 mouseMoveEvent 围绕一个点旋转 QGraphicsPixmap?
How to rotate a QGraphicsPixmap around a point according to mouseMoveEvent?
我想根据鼠标位置围绕一个点旋转 QGraphicsPixmapItem。
所以我尝试了这个:
void Game::mouseMoveEvent(QMouseEvent* e){
setMouseTracking(true);
QPoint midPos((sceneRect().width() / 2), 0), currPos;
currPos = QPoint(mapToScene(e->pos()).x(), mapToScene(e->pos()).y());
QPoint itemPos((midPos.x() - cannon->scenePos().x()), (midPos.y() - cannon->scenePos().y()));
double angle = atan2(currPos.y(), midPos.x()) - atan2(midPos.y(), currPos.x());
cannon->setTransformOriginPoint(itemPos);
cannon->setRotation(angle); }
但是像素图移动了几个像素。
我想要这样的结果:
除了@rafix07 指出的角度和弧度的混淆之外,角度计算中还有一个错误。您基本上需要从 midPos
到 currPos
的线的角度,您通过
计算
double angle = atan2(currPos.y() - midPos.y(), currPos.x() - midPos.x());
此外,变换原点的计算采用了错误的坐标系。原点必须在相关项目的坐标系中给出(参见 QGraphicsItem::setTransformOriginPoint),而不是在场景坐标中。由于您想围绕该项目的中心旋转,因此它只是:
QPointF itemPos(cannon->boundingRect().center());
那么问题来了,midPos
是否真的是你图片中正则中间突出显示的点。 y 坐标设置为 0,通常是屏幕的边缘,但您的坐标系可能不同。
我假设上面计算的 itemPos
是正确的点,你只需要将它映射到场景坐标 (cannon->mapToScene(itemPos)
).
最后,我强烈建议不要将场景坐标(double
s)四舍五入到 int
s,因为它在代码中通过强制它到 QPoint
s 而不是QPointF
秒。只要在处理场景坐标时使用 QPointF
。
我想根据鼠标位置围绕一个点旋转 QGraphicsPixmapItem。
所以我尝试了这个:
void Game::mouseMoveEvent(QMouseEvent* e){
setMouseTracking(true);
QPoint midPos((sceneRect().width() / 2), 0), currPos;
currPos = QPoint(mapToScene(e->pos()).x(), mapToScene(e->pos()).y());
QPoint itemPos((midPos.x() - cannon->scenePos().x()), (midPos.y() - cannon->scenePos().y()));
double angle = atan2(currPos.y(), midPos.x()) - atan2(midPos.y(), currPos.x());
cannon->setTransformOriginPoint(itemPos);
cannon->setRotation(angle); }
但是像素图移动了几个像素。
我想要这样的结果:
除了@rafix07 指出的角度和弧度的混淆之外,角度计算中还有一个错误。您基本上需要从 midPos
到 currPos
的线的角度,您通过
double angle = atan2(currPos.y() - midPos.y(), currPos.x() - midPos.x());
此外,变换原点的计算采用了错误的坐标系。原点必须在相关项目的坐标系中给出(参见 QGraphicsItem::setTransformOriginPoint),而不是在场景坐标中。由于您想围绕该项目的中心旋转,因此它只是:
QPointF itemPos(cannon->boundingRect().center());
那么问题来了,midPos
是否真的是你图片中正则中间突出显示的点。 y 坐标设置为 0,通常是屏幕的边缘,但您的坐标系可能不同。
我假设上面计算的 itemPos
是正确的点,你只需要将它映射到场景坐标 (cannon->mapToScene(itemPos)
).
最后,我强烈建议不要将场景坐标(double
s)四舍五入到 int
s,因为它在代码中通过强制它到 QPoint
s 而不是QPointF
秒。只要在处理场景坐标时使用 QPointF
。