Qt中辅助actTo()来绘制圆弧的辅助函数

编程入门 行业动态 更新时间:2024-10-11 15:23:58

Qt中辅助actTo()来绘制<a href=https://www.elefans.com/category/jswz/34/1717370.html style=圆弧的辅助函数"/>

Qt中辅助actTo()来绘制圆弧的辅助函数

一 问题描述:

由于Qt所支持的绘制圆弧的函数如下所示:



所需要的输入值是:圆弧所在的矩形(左上角点,宽度,高度)、入射点的初始角度、入射点与出射点之间的发散角度。且其中角度逆时针为正,顺时针为负。

而我们绘制圆弧时候所调用的值只有坐标点的五个属性值,故需要根据两点的属性值,设计一个算法以实现圆弧线段的绘制。

二 算法说明

下图是相关参数点和计算公式的说明:


入射点(x1,y1);出射点(x2,y2);圆心(x,y)

初始夹角startAngle;发散角spanAngle;

顺时针弧为z=1,逆时针狐为z=2;

入射点与出射点连线的中点(a,b)。

//用于生成绘制圆弧所需的参数,输入为(点1,点2,圆心,插补类型)
void Widget::arcDrawing(double x1, double y1, double x2, double y2, double x, double y, double z)

2.1 矩形推导

//确定圆弧所在矩形
    double r=sqrt((x-x2)*(x-x2)+(y-y2)*(y-y2));
    rect.setRect(x-r,y-r,2*r,2*r);//因为坐标系是相反的,所以是y-r。!!矩形高和宽是2*r


2.2 转换为真实坐标进行计算

由于我容器中的数据是根据界面坐标设定的,故需转化为真实坐标进行计算

//转换为真实坐标进行角度计算
    double y1_real=ui->graphicsView->height()-y1;
    double y2_real=ui->graphicsView->height()-y2;
    double y_real=ui->graphicsView->height()-y;


2.3 初始夹角的推导

//确定startAngle
    //点1在上方
    if(y1_real>=y_real){
        if(x1<x)      startAngle=180-180*qAtan((y_real-y1_real)/(x1-x))/PI;
        else if(x1==x) startAngle=90;
        else if(x1>x) startAngle=180*qAtan((y1_real-y_real)/(x1-x))/PI;
    }
    //点1在下方
    else{
        if(x1<x)      startAngle=180*qAtan((y1_real-y_real)/(x1-x))/PI-180;
        else if(x1==x) startAngle=-90;
        else if(x1>x) startAngle=180*qAtan((y1_real-y_real)/(x1-x))/PI;
    }


2.4 发散角的推导

//确定spanAngle
    //中心计算
    double a=(x1+x2)/2;
    double b=(y1_real+y2_real)/2;
    //入射点x1与圆心位于同一垂线,斜率不存在
    if(x1==x){
        //点1在圆心下面
        if(y1_real<y_real){
            //若为逆时针插补
            if(z==2){
                if(x2>x1)spanAngle=2*180*qAtan(sqrt((a-x2)*(a-x2)+(b-y2_real)*(b-y2_real))/sqrt((a-x)*(a-x)+(b-y_real)*(b-y_real)))/PI;
                if(x2==x1)spanAngle=180;
                if(x2<x1)spanAngle=360-2*180*qAtan(sqrt((a-x2)*(a-x2)+(b-y2_real)*(b-y2_real))/sqrt((a-x)*(a-x)+(b-y_real)*(b-y_real)))/PI;
            }
            //若为顺时针插补
            if(z==1){
                if(x2>x1)spanAngle=360-2*180*qAtan(sqrt((a-x2)*(a-x2)+(b-y2_real)*(b-y2_real))/sqrt((a-x)*(a-x)+(b-y_real)*(b-y_real)))/PI;
                if(x2==x1)spanAngle=-180;
                if(x2<x1)spanAngle=-2*180*qAtan(sqrt((a-x2)*(a-x2)+(b-y2_real)*(b-y2_real))/sqrt((a-x)*(a-x)+(b-y_real)*(b-y_real)))/PI;
            }
        }
        //点1在圆心上面
        else{
            //若为逆时针插补
            if(z==2){
                if(x2<x1)spanAngle=360-2*180*qAtan(sqrt((a-x2)*(a-x2)+(b-y2_real)*(b-y2_real))/sqrt((a-x)*(a-x)+(b-y_real)*(b-y_real)))/PI;
                if(x2==x1)spanAngle=180;
                if(x2>x1)spanAngle=2*180*qAtan(sqrt((a-x2)*(a-x2)+(b-y2_real)*(b-y2_real))/sqrt((a-x)*(a-x)+(b-y_real)*(b-y_real)))/PI;
            }
            //若为顺时针插补
            if(z==1){
                if(x2<x1)spanAngle=-2*180*qAtan(sqrt((a-x2)*(a-x2)+(b-y2_real)*(b-y2_real))/sqrt((a-x)*(a-x)+(b-y_real)*(b-y_real)))/PI;
                if(x2==x1)spanAngle=-180;
                if(x2>x1)spanAngle=360-2*180*qAtan(sqrt((a-x2)*(a-x2)+(b-y2_real)*(b-y2_real))/sqrt((a-x)*(a-x)+(b-y_real)*(b-y_real)))/PI;
 
            }
        }
else{
        double D=y2-(y1_real-y_real)*(x2-x)/(x1-x)-y_real;
        qDebug()<<D;
        //若为逆时针插补
        if(z==2){
            if(D>0)spanAngle=2*180*qAtan(sqrt((a-x2)*(a-x2)+(b-y2_real)*(b-y2_real))/sqrt((a-x)*(a-x)+(b-y_real)*(b-y_real)))/PI;
            if(D==0)spanAngle=180;
            if(D<0)spanAngle=360-2*180*qAtan(sqrt((a-x2)*(a-x2)+(b-y2_real)*(b-y2_real))/sqrt((a-x)*(a-x)+(b-y_real)*(b-y_real)))/PI;
        }
        //若为顺时针插补
        else if(z==1){
            if(D>0)spanAngle=-2*180*qAtan(sqrt((a-x2)*(a-x2)+(b-y2_real)*(b-y2_real))/sqrt((a-x)*(a-x)+(b-y_real)*(b-y_real)))/PI;
            if(D==0)spanAngle=-180;
            if(D<0)spanAngle=2*180*qAtan(sqrt((a-x2)*(a-x2)+(b-y2_real)*(b-y2_real))/sqrt((a-x)*(a-x)+(b-y_real)*(b-y_real)))/PI-360;
        }
     }



更多推荐

Qt中辅助actTo()来绘制圆弧的辅助函数

本文发布于:2024-03-09 20:18:38,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1726021.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:圆弧   函数   Qt   actTo

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!