在Qt中设置椭圆的方向

时间:2014-10-04 14:58:17

标签: qt ellipse qpainter

我使用QPainterPath使用三次鼠标点击绘制一个椭圆。椭圆的长轴和短轴保持平行于主坐标轴。

第一次单击确定椭圆的中心。第二次点击的位置用于计算长轴的长度,第三次点击的位置用于确定短轴的长度。

无论咔嗒声的位置如何,椭圆的轴都与主轴平行。如何根据鼠标点击的位置设置椭圆的方向?

我计算了连接第一点和第二点的线的角度为:

theta = atan2((p2.y()-p1.y()),(p2.x()-p1.x())) * (180/M_PI);

我的边界矩形如下:

QRectF MyEllipse::boundingRect() const
{
  return QRectF(p1.x()-majRadius, p1.y()-minRadius, 2 * majRadius, 2 *  minRadius).normalized();

}

然后我用它绘画:

QPainterPath ellipse;
ellipse.moveTo(p2.x()*cos(theta),p2.y()*sin(theta));
ellipse.arcTo(boundingRect(), theta, theta+360);

QPen paintpen(Qt::black);
paintpen.setWidth(1);
painter->setRenderHint(QPainter::Antialiasing);
painter->setPen(paintpen);
painter->drawPath(ellipse);

如何根据三点正确定位椭圆?

1 个答案:

答案 0 :(得分:3)

我已在paint函数中使用翻译和循环操作解决了此问题:

painter->save();
painter->translate(p1.x(), p1.y());
painter->rotate(theta);
painter->translate(-p1.x(), -p1.y());
painter->drawPath(ellipse);
painter->restore();

根据点击次数设置椭圆的形状。

关于角度θ的旋转完成,计算如下:

theta = atan2((p2.y()-p1.y()),(p2.x()-p1.x())) * (180/M_PI);

如果p2和p1之间的距离> p3和p1之间的距离,否则计算如下:

theta = atan2((p3.y()-p1.y()),(p3.x()-p1.x())) * (180/M_PI);