我使用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);
如何根据三点正确定位椭圆?
答案 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);