使用Qt进行防碰撞算法仿真验证平台开发日志

本文记录了一位开发者使用Qt开发防碰撞算法仿真验证平台的过程,包括直角坐标与极坐标的转换,弯道部分的代码实现,以及UI界面和参数可更改功能的开发。在开发过程中,解决了鼠标识别区的bug,并逐步完善了平台的功能。
摘要由CSDN通过智能技术生成

QT防碰撞算法仿真验证平台的开发

记录2021.8.26

注意事项

如果想要代码移植发到其他人的电脑上运行,需要文件存放路径中不含有中文,同时删掉.user文件。
请添加图片描述
删掉此文件可以运行

8.27 标记出了边框的八个点

气死,昨天写的东西关了网页没保存,重写日志

拟解决问题:弯道的拖拽区域鼠标识别区的确定,通过点与点进行连接,连接点的尽可能是直线,所以需要尽可能在弯道部分取距离很短的多个点进行连接,如图所示
问题转化为怎么在已知顶点坐标下细分这么多的点
问题转化为怎么在已知各顶点坐标下细分这么多的点,采用学长的建议使用极坐标,在极坐标转化下再变回到直角坐标同时由于圆心处不一定是原点,再进行坐标变换。请添加图片描述

在这里插入图片描述

请添加图片描述
现在已知点的坐标如图所示,尝试用代码进行实现

 QVector<QPointF> ClickAreaPoints;   //更新点击识别区
        ClickAreaPoints.append(QPointF(Origin+QPoint(X+R,Y-VerticalLen_lane)*matrix));
        ClickAreaPoints.append(QPointF(Origin+QPoint(X+R+d,Y-VerticalLen_lane)*matrix));
        ClickAreaPoints.append(QPointF(Origin+QPoint(X+R+d,Y)*matrix));
        ClickAreaPoints.append(QPointF(Origin+QPoint(X+(R+d)*cos(seti/180*M_PI),Y+(R+d)*sin(seti/180*M_PI))*matrix));
        ClickAreaPoints.append(QPointF(Origin+QPoint(X+(R+d)*cos(seti/180*M_PI)-LeanLen_lane*sin(seti/180*M_PI),Y+(R+d)*sin(seti/180*M_PI)-LeanLen_lane*cos(seti/180*M_PI))*matrix));
        ClickAreaPoints.append(QPointF(Origin+QPoint(X+R*cos(seti/180*M_PI)-LeanLen_lane*sin(seti/180*M_PI),Y+R*sin(seti/180*M_PI)+LeanLen_lane*cos(seti/180*M_PI))*matrix));
        ClickAreaPoints.append(QPointF(Origin+QPoint(X+R*cos(seti/180*M_PI),Y+R*sin(seti/180*M_PI))*matrix));
        ClickAreaPoints.append(QPointF(Origin+QPoint(X+R,Y)*matrix));
        ClickArea = QPolygonF(ClickAreaPoints); //更新点击识别区

9.4 实现直角坐标与极坐标的转换

带军训,项目搁置到今天请添加图片描述
代码实现:

 //录入点击识别区端点
        ClickAreaPoints.append(QPointF(Origin+QPoint(X+R,Y-VerticalLen_lane)*matrix));    //点1,垂直道路左下角带你
        ClickAreaPoints.append(QPointF(Origin+QPoint(X+R+d,Y-VerticalLen_lane)*matrix));  //点2
        ClickAreaPoints.append(QPointF(Origin+QPoint(X+R+d,Y)*matrix));                   //点3

        //极坐标与直角坐标的转换
        double dAngle;
        double X1,Y1,X2,Y2;
        for(dAngle=0;dAngle<seti;dAngle++)
        {
            X1 = (R+d)*cos(dAngle/180*M_PI);
            Y1 = (R+d)*sin(dAngle/180*M_PI);   //极坐标与直角坐标转换
            X2 = X1 + X;
            Y2 = Y1 + Y;                   //坐标变换,移动原点
            ClickAreaPoints.append(QPointF(Origin+QPoint(X2,Y2)*matrix));
        }          //圆弧上的点,点3到点4
        ClickAreaPoints.append(QPointF(Origin+QPoint(X+(R+d)*cos(seti/180*M_PI),Y+(R+d)*sin(seti/180*M_PI))*matrix));//点4
        ClickAreaPoints.append(QPointF(Origin+QPoint(X+(R+d)*cos(seti/180*M_PI)-LeanLen_lane*sin(seti/180*M_PI),Y+(R+d)*sin(seti/180*M_PI)-LeanLen_lane*cos(seti/180*M_PI))*matrix));//点5
        ClickAreaPoints.append(QPointF(Origin+QPoint(X+R*cos(seti/180*M_PI)-LeanLen_lane*sin(seti/180*M_PI),Y+R*sin(seti/180*M_PI)+LeanLen_lane*cos(seti/180*M_PI))*matrix));//点6
        ClickAreaPoints.append(QPointF(Origin+QPoint(X+R*cos(seti/180*M_PI),Y+R*sin(seti/180*M_PI))*matrix));//点7


        //极坐标与直角坐标的转换
        for(dAngle=seti;dAngle>0;dAngle--)
        {
            X1 = R*cos(dAngle/180*M_PI);
            Y1 = R*sin(dAngle/180*M_PI);   //极坐标与直角坐标转换
            X2 = X1 + X;
            Y2 = Y1 + Y;                   //坐标变换,移动原点
             ClickAreaPoints.append(QPointF(Origin+QPoint(X2,Y2)*matrix));
        }

        ClickAreaPoints.append(QPointF(Origin+QPoint(X+R,Y)*matrix));//点8
        ClickArea = QPolygonF(ClickAreaPoints); //更新点击识别区

9.6 将弯道部分代码移植到整个框架中

通过海绵姥姥的努力,把弯道部分的代码移植到整体框架中去,但是之前标记鼠标选中区域的模块并没有成功,所以还需要进行bug调试。

9.7 进行鼠标识别区bug的调试

慢慢调试后的代码

    ClickAreaPoints.append(QPointF(Origin+QPoint(X+r,Y+leanLen_lane)*matrix));    //点1,垂直道路左下角 //Y坐标居然是反着的,上面是-,下面是+
    ClickAreaPoints.append(QPointF(Origin+QPoint(X+r+d,Y+leanLen_lane)*matrix));  //点2
    ClickAreaPoints.append(QPointF(Origin+QPoint(X+r+d,Y)*matrix));    //点3
//    ClickAreaPoints.append(QPointF(Origin+QPoint(X,Y)*matrix));                     //圆心,用来做试验的

    //极坐标与直角坐标的转换
    double dAngle;
    double X1,Y1,X2,Y2;
    for(dAngle=0;dAngle<Seti;dAngle++)
    {
        X1 = (r+d)*cos(dAngle/180*M_PI);
        Y1 = (r+d)*sin(dAngle/180*M_PI);   //极坐标与直角坐标转换
        X2 = X1 + X;
        Y2 = -Y1 - Y;                   //坐标变换,移动原点
        ClickAreaPoints.append(QPointF(Origin+QPoint(X2,Y2)*matrix));
    }          //圆弧上的点,点3到点4
    ClickAreaPoints.append(QPointF(Origin+QPoint(X+(r+d)*cos(Seti/180*M_PI),Y-(r+d)*sin(Seti/180*M_PI))*matrix));//点4
    ClickAreaPoints.append(QPointF(Origin+QPoint(X+(r+d)*cos(Seti/180*M_PI)-leanLen_lane*sin(Seti/180*M_PI),
                                                 Y-(r+d)*sin(Seti/180*M_PI)-leanLen_lane*cos(Seti/180*M_PI))*matrix));//点5
    ClickAreaPoints.append(QPointF(Origin+QPoint(X+r*cos(Seti/180*M_PI)-leanLen_lane*sin(Seti/180*M_PI),
                                                 Y-r*sin(Seti/180*M_PI)-leanLen_lane*cos(Seti/180*M_PI))*matrix));//点6
    ClickAreaPoints.append(QPointF(Origin+QPoint(X+r*cos(Seti/180*M_PI),Y-r*sin(Seti/180*M_PI))*matrix));//点7

    //极坐标与直角坐标的转换
    for(dAngle=Seti;dAngle>0;dAngle--)
    {
        X1 = r*cos(dAngle/180*M_PI);
        Y1 = r*sin(dAngle/180*M_PI);   //极坐标与直角坐标转换
        X2 = X1 + X;
        Y2 = -Y1 - Y;                   //坐标变换,移动原点
        ClickAreaPoints.append(QPointF(Origin+QPoint(X2,Y2)*matrix));
    }

    ClickAreaPoints.append(QPointF(Origin+QPoint(X+r,Y)*matrix));//点8
    ClickArea = QPolygonF(ClickAreaPoints); //更新点击识别区

最终框出来的结果:
在这里插入图片描述
有那么一点完美嘿嘿
接下来还需要把草坪框出来,结果如图,代码更新为:在这里插入图片描述


    //录入点击识别区端点
    ClickAreaPoints.append(QPointF(Origin+QPoint(X+r-1/scale,Y+leanLen_lane)*matrix));    //点1,垂直道路左下角 //Y坐标居然是反着的,上面是-,下面是+
    ClickAreaPoints.append(QPointF(Origin+QPoint(X+r+d+1/scale,Y+leanLen_lane)*matrix));  //点2
    ClickAreaPoints.append(QPointF(Origin+QPoint(X+r+d+1/scale,Y)*matrix));    //点3
//    ClickAreaPoints.append(QPointF(Origin+QPoint(X,Y)*matrix));                     //圆心,用来做试验的

    //极坐标与直角坐标的转换
    double dAngle;
    double X1,Y1,X2,Y2;
    for(dAngle=0;dAngle<Seti;dAngle++)
    {
        X1 = (r+d+1/scale)*cos(dAngle/180*M_PI);
        Y1 = (r+d+1/scale)*sin(dAngle/180*M_PI);   //极坐标与直角坐标转换
        X2 = X1 + X;
        Y2 = -Y1 - Y;                   //坐标变换,移动原点
        ClickAreaPoints.append(QPointF(Origin+QPoint(X2,Y2)*matrix));
    }          //圆弧上的点,点3到点4
    ClickAreaPoints.append(QPointF(Origin+QPoint(X+(r+d+1/scale)*cos(Seti/180*M_PI),Y-(r+d+1/scale)*sin(Seti/180*M_PI))*matrix));//点4
    ClickAreaPoints.append(QPointF(Origin+QPoint(X+(r+d+1/scale)*cos(Seti/180*M_PI)-leanLen_lane*sin(Seti/180*M_PI),
                                                 Y-(r+d+1/scale)*sin(Seti/180*M_PI)-leanLen_lane*cos(Seti/180*M_PI))*matrix));//点5
    ClickAreaPoints.append(QPointF(Origin+QPoint(X+(r-1/scale)*cos(Seti/180*M_PI)-leanLen_lane*sin(Seti/180*M_PI),
                                                 Y-(r-1/scale)*sin(Seti/180*M_PI)-leanLen_lane*cos(Seti/180*M_PI))*matrix));//点6
    ClickAreaPoints.append(QPointF(Origin+QPoint(X+(r-1/scale)*cos(Seti/180*M_PI),Y-(r-1/scale)*sin(Seti/180*M_PI))*matrix));//点7

    //极坐标与直角坐标的转换
    for(dAngle=Seti;dAngle>0;dAngle--)
    {
        X1 = (r-1/scale)*cos(dAngle/180*M_PI);
        Y1 = (r-1/scale)*sin(dAngle/180*M_PI);   //极坐标与直角坐标转换
        X2 = X1 + X;
        Y2 = -Y1 - Y;                   //坐标变换,移动原点
        ClickAreaPoints.append(QPointF(Origin+QPoint(X2,Y2)*matrix));
    }

    ClickAreaPoints.append(QPointF(Origin+QPoint(X+r-1/scale,Y)*matrix));//点8
    ClickArea = QPolygonF(ClickAreaPoints); //更新点击识别区

现在还剩一个问题,和其他的不一样,不能够拖动,现在进行简单调试,看是否能找到解决方法。

上述问题已经解决。

2021.10.8

开始画UI界面,完成参数的可更改工作

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值