Qt绘制圆弧实现

根据操作习惯,绘制圆弧只需要三点即可,
需求背景:
点击生成两点后,分别为起点和终点(圆弧的边缘点),第三次点击的时候为圆弧上的点
话不多说,直接代码:
(Pi = 3.1415926,m_center圆心坐标,m_r半径)

//三点确定一个圆,硬解,可得到表达式(三点一线的时候,则无法形成圆)  -- 直接网上搜索有对应的代码,https://blog.csdn.net/liyuanbhu/article/details/52891868
    double x1 = sP.x(), x2 = mP.x(), x3 = fP.x();
    double y1 = sP.y(), y2 = mP.y(), y3 = fP.y();
    double a = x1 - x2;
    double b = y1 - y2;
    double c = x1 - x3;
    double d = y1 - y3;
    double e = ((x1 * x1 - x2 * x2) + (y1 * y1 - y2 * y2)) / 2.0;
    double f = ((x1 * x1 - x3 * x3) + (y1 * y1 - y3 * y3)) / 2.0;
    double det = b * c - a * d;
    if((x1 == x2 && x1 == x3) || (y1 == y2 && y1 == y3))
    {
        //三点一线,
        return false;
    }
    double x0 = -(d * e - b * f) / det;
    double y0 = -(a * f - c * e) / det;
    m_center.setX(x0);
    m_center.setY(y0);
    m_r = hypot(x1 - x0, y1 - y0);

    //计算三点的对应的角度
    double angle1 = acos((x1-x0)/(hypot((x1-x0),(y1-y0))));
    double angle2 = acos((x2-x0)/(hypot((x2-x0),(y2-y0))));
    double angle3 = acos((x3-x0)/(hypot((x3-x0),(y3-y0))));
    if(y1-y0 < 0){
        angle1 = 2*Pi - angle1;  //点1在第三、四象限
    }else{
        angle1 = angle1;
    }
    if(y3-y0 < 0){
        angle3 = 2*Pi - angle3; //点2在第三、四象限
    }else{
        angle3 = angle3;
    }

    if(y2-y0 < 0){
        angle2 = 2*Pi - angle2; //点3在第三、四象限
    }else{
        angle2 = angle2;
    }

    //上面计算的角度是基于QGraphicsView中的坐标,需要进行转换为数学坐标中的角度
    angle1 = 360-angle1*180/Pi;
    angle2 = 360-angle2*180/Pi;
    angle3 = 360-angle3*180/Pi;

    qDebug()<<angle1<<angle2<<angle3;
    if(angle1 < angle3){
        //1是起点,3是终点
        if(angle2 < angle3 && angle2 > angle1){
            //2在中间,1-2-3
            m_angle = angle1;
            m_spanAngle = angle3 - angle1;
        }else{
            // 2在1-3外面   3-2-1
            m_angle = angle3;
            m_spanAngle = 360-(angle3 - angle1);
        }
    }else{
        //3是起点,1是终点  正方向--  3-2-1
        if(angle2 < angle1 && angle2 > angle3){
            //3-2-1
            m_angle = angle3;
            m_spanAngle = angle1 - angle3;
        }else{
            //1-2-3
            m_angle = angle1;
            m_spanAngle = 360-(angle1 - angle3);
        }
    }
    //m_angle圆弧在圆上的起点角度,m_spanAngle圆弧的角度
    qDebug()<<m_angle<<m_spanAngle;

QGraphiceView的坐标系和数学坐标系区别:
在这里插入图片描述
上述求圆心的代码参考:https://blog.csdn.net/liyuanbhu/article/details/52891868

如觉得侵权,请联系我删除