QT 三点绘制圆弧的实现

在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);三点绘圆弧主要是逻辑要正确,逻辑顺序对了绘制圆弧也就简单了。这就是我实现的过程。希望对需要的人有所帮助;
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值