在QT的painter中,有专门的圆弧的绘制涵数,直接调用就可以了。但是对于三点绘制圆弧来说,就稍微的复杂一些了,主要的困难就是控制画圆弧的方向,起始角度,终止角度。只要解决了这几个问题,三点绘制圆弧也就成功一半了。
以下是我用代码实现的过程
void GraphicsArcItem::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget)
{
Q_UNUSED(option);
Q_UNUSED(widget);
HDC hdc; //DC的句柄
QPainterPath path;
if(m_points.size() == 2) //m_points 是移动的点
{
path.lineTo(m_points.at(0));
path.lineTo(m_points.at(1));
}
else if(m_points.size() == 3)
{
double x1 = m_points.at(0).x();
double y1 = m_points.at(0).y();
double x2 = m_points.at(1).x();
double y2 = m_points.at(1).y();
double x3 = m_points.at(2).x();
double y3 = m_points.at(2).y();
double a, b, e, r;
double x, y;
a = (x1 + x2) * (x1 - x2) + (y1 + y2) * (y1 - y2);
b = (x3 + x2) * (x3 - x2) + (y3 + y2) * (y3 - y2);
e = (x1 - x2) * (y3 - y2) - (x2 - x3) * (y2 - y1);
x = (a * (y3 - y2) + b * (y2 - y1)) / (2 * e);
y = (a * (x2 - x3) + b * (x1 - x2)) / (2 * e);
r = sqrt((x2 - x) * (x2 - x) + (y2 - y) * (y2 - y));
double fResulet = (x2 - x1) * (y3 - y2) - (y2 - y1) * (x3 - x2);
double startangle;
double OA = atan2(-y1 + y,x1 - x)*(180/atan2(0,-1));
double OC = atan2(-y3 + y,x3 - x)*(180/atan2(0,-1));
double OB = atan2(-y2 + y,x2 - x)*(180/atan2(0,-1));
double delta113;
if(OA < OC)
{
delta113 = OC - OA;
}else
{
delta113 = OC - OA + 360;
}
double deltal12;
if( OA < OB)
{
deltal12 = OB - OA;
}else
{
deltal12 = OB - OA + 360;
}
double endangle;
if(delta113 > deltal12)
{
if(OC > OA)
{
startangle = OA;
endangle = OC - OA;
}else
{
startangle = OA;
endangle = OC - OA + 360;
}
}else
{
if(OA > OC)
{
startangle = OC;
endangle = OA - OC;
}else
{
startangle = OC;
endangle = OA - OC + 360;
}
}
QRect rect = QRect(QPoint(x - r, y - r), QPoint(x + r,y + r));
path.arcMoveTo(rect,startangle);
path.arcTo(rect,startangle,endangle);
}
painter->drawPath(path);
三点绘圆弧主要是逻辑要正确,逻辑顺序对了绘制圆弧也就简单了。这就是我实现的过程。希望对需要的人有所帮助;