4

1. 目标

我和我的同事一直在尝试在 Qt 中渲染旋转的椭球体。据我们了解,典型的解决方法包括将椭球的中心移动到坐标系的原点,在那里进行旋转,然后向后移动:http: //qt-project.org/doc/qt-4.8 /qml-rotation.html

2. 示例代码

基于上面链接中概述的解决方案,我们提出了以下示例代码:

// Constructs and destructors
RIEllipse(QRect rect, RIShape* parent, bool isFilled = false)
: RIShape(parent, isFilled), _rect(rect), _angle(30)
{}

// Main functionality
virtual Status draw(QPainter& painter)
{
   const QPen& prevPen = painter.pen();  
   painter.setPen(getContColor());
   const QBrush& prevBrush = painter.brush();
   painter.setBrush(getFillBrush(Qt::SolidPattern));

   // Get rectangle center
   QPoint center = _rect.center();

   // Center the ellipse at the origin (0,0)
   painter.translate(-center.x(), -center.y());
   // Rotate the ellipse around its center
   painter.rotate(_angle);
   // Move the rotated ellipse back to its initial location
   painter.translate(center.x(), center.y());

   // Draw the ellipse rotated around its center
   painter.drawEllipse(_rect);

   painter.setBrush(prevBrush);
   painter.setPen(prevPen);
   return IL_SUCCESS;
}

如您所见,我们在此测试样本中将旋转角度硬编码为 30 度。

3. 观察

椭圆出现在错误的位置,通常在画布区域之外。

4. 问题

上面的示例代码有什么问题?

此致,

巴尔德

PS提前感谢任何建设性的回应?

PPS 在发布此消息之前,我们在 stackoverflow.com 上进行了相当多的搜索。 Qt 图像移动/旋转似乎反映了类似于上面链接的解决方案方法。

4

2 回答 2

0

将物体移回原点,旋转然后替换物体位置的理论是正确的。但是,您提供的代码根本不是平移和旋转对象,而是平移和旋转画家。在您提到的示例问题中,他们想要围绕一个对象旋转整个图像,这就是为什么他们在旋转之前将画家移动到对象的中心。

围绕 GraphicsItem 进行旋转的最简单方法是最初定义项目,使其中心位于对象的中心,而不是位于其左上角。这样,任何旋转都将自动围绕对象中心,而无需平移对象。

为此,您需要使用 (-width/2, -height/2, width, height) 为 x,y,width,height 定义一个边界矩形。

或者,假设您的项目是从 QGraphicsItem 或 QGraphicsObject 继承的,您可以在任何旋转之前使用函数 setTransformOriginPoint。

于 2013-06-24T08:09:39.577 回答
0

painter.translate(center.x(), center.y());你移动你的对象时,(2*center.x(), 2*center.y())结果是当前坐标的数量。你可能需要:

painter.translate(- center.x(), - center.y()); 
于 2013-06-24T04:57:23.833 回答