使用Qt进行防碰撞算法仿真验证平台开发日志
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界面,完成参数的可更改工作