0


Qt编写雷达模拟仿真工具1-背景布局

一、前言

雷达模拟仿真工具,整体结构采用的QGraphicsView框架,背景布局采用的分层绘制,这样可以控制该需要重新绘制的重新绘制,不需要重新的绘制的就没必要再多余的浪费,这里定义了一个GraphicsBackGroundItem类继承自QGraphicsItem用于背景图的绘制。

二、雷达模拟仿真工具介绍

雷达模拟仿真工具,主要通过模拟点模拟相关物体,方位、航向角、距离、速度,并且显示相关详情信息可建立跟踪线建立与模拟点联系。可自定义更换模拟点背景达到更加逼真效果,如歼击机,航母发射导弹效果,指挥所被打击爆炸效果。在距离上可自由控制距离缩放,也可建立危险等级制度的区域范围显示,也可激光雷达航向距离控制发射。这过程中会运用到很多数学计算,也有对模拟点组合效果。

三、功能特点

  1. 设计点由背景,功能按钮,雷达区域,频谱区域,缩放模块,信息点采集模块组成;
  2. 背景采用分层绘制达到绘制性能的最优化;
  3. 功能按钮增设了相关雷达功能点;
  4. 雷达区域为核心模块,包含模拟点各种功能效果,危险等级区域绘制,激光雷达等功能;
  5. 频谱区域主要显示音频频谱效果;
  6. 缩放模块控制雷达区域缩放效果;
  7. 信息采集区域采集雷达区域相关数据信息点数据展示;
  8. 可支持换肤;
  9. 可支持音频频谱显示;
  10. 可支持任意随机添加模拟点;
  11. 可支持自定义背景添加模拟点;
  12. 可支持方位,航向角,距离,速度,目标体真实图自定制;
  13. 可支持危险区域并且可等级划分,方位,角度,距离,危险提示信息等显示;
  14. 可支持激光发射模拟;
  15. 支持雷达图放大缩小显示;
  16. 可支持模拟点编辑设置;
  17. 可支持模拟点跟踪线设置;
  18. 可支持模拟点详细数据查看;
  19. 可支持增加添加目标体预览功能;
  20. 可支持增加航母目标体;
  21. 可支持增加歼击机目标体;
  22. 可支持增加指挥所目标体;
  23. 可支持增加航母炮弹攻击指挥使效果;
  24. 可支持增加航母导弹攻击指挥使效果;
  25. 可支持增加歼击机炮弹攻击指挥使效果;
  26. 可支持增加歼击机导弹攻击指挥使效果;
  27. 可支持增加指挥使被炸前,中, 后三种状态效果;

四、核心代码

  1. 背景表格
  1. int rowgridCount =6;int columngridCount =6;
  2. painter.save();
  3. QPen pen;
  4. QColor tmpColor =AppInstance::getInstance()->foreGroundColor;
  5. tmpColor.setAlpha(150);
  6. pen.setColor(tmpColor);
  7. pen.setCapStyle(Qt::RoundCap);
  8. pen.setWidthF(0.5);
  9. painter.setPen(pen);
  10. QRectF girdRect = rect.adjusted(6,6,-6,-6);
  11. qreal girdHeight = girdRect.height()*1.0/ columngridCount;
  12. qreal girdWidth = girdRect.width()*1.0/ rowgridCount;for(int row =0; row <= rowgridCount; row++){
  13. painter.drawLine(girdRect.x(), girdRect.y()+ girdHeight * row, girdRect.x()+ girdRect.width(), girdRect.y()+ girdHeight * row);}for(int column =0; column <= columngridCount; column++){
  14. painter.drawLine(girdRect.x()+ girdWidth * column, girdRect.y(), girdRect.x()+ girdWidth * column, girdRect.y()+ girdRect.height());}
  15. painter.restore();
  1. 绘制圆弧
  1. painter.save();
  2. painter.setBrush(AppInstance::getInstance()->foreGroundColor);
  3. QPainterPath ellipsePath;
  4. painter.translate(-radius,-radius);
  5. ellipsePath.addEllipse(0,0,2* radius,2* radius);
  6. QPainterPath subPath;int arcWidth =6;
  7. subPath.addEllipse(arcWidth, arcWidth,2*(radius - arcWidth),2*(radius - arcWidth));
  8. ellipsePath -= subPath;
  9. painter.drawPath(ellipsePath);
  10. painter.restore();
  1. 绘制刻度盘
  1. painter.save();
  2. painter.setPen(AppInstance::getInstance()->foreGroundColor);
  3. QFont font = painter.font();
  4. font.setPointSize(12);
  5. font.setWeight(60);
  6. painter.setFont(font);int scaleMajor =36;
  7. radius -=26;
  8. qreal q =0;for(int i =0; i < scaleMajor; i++){int value =1.0* i *(360/ scaleMajor);
  9. QString strValue =QString("%1").arg(value,3,10,QLatin1Char('0'));
  10. painter.save();
  11. painter.rotate(q);
  12. qreal l = painter.fontMetrics().width(strValue)/2.0;
  13. painter.drawText(QPointF(-l,-radius), strValue);
  14. painter.restore();
  15. q = q +10;}
  16. painter.restore();
  1. 绘制圆弧背景蒙层
  1. int aphpaRadius = radius -6;
  2. QColor tmpcolor =AppInstance::getInstance()->foreGroundColor;
  3. tmpcolor.setAlpha(10);
  4. painter.save();
  5. painter.setPen(Qt::NoPen);
  6. painter.setBrush(tmpcolor);
  7. painter.translate(-aphpaRadius,-aphpaRadius);
  8. painter.drawEllipse(0,0,2* aphpaRadius,2* aphpaRadius);
  9. painter.restore();
  1. 绘制刻度
  1. int scaleMajor =36;
  2. radius -=6;
  3. painter.save();
  4. painter.rotate(0);int subScaleMajor =10;int midScaleMajor = subScaleMajor /2;int steps =(scaleMajor * subScaleMajor);double angleStep =360.0/ steps;
  5. QPen pen;
  6. pen.setColor(AppInstance::getInstance()->foreGroundColor);
  7. pen.setCapStyle(Qt::RoundCap);for(int i =0; i <= steps; i++){if(i % subScaleMajor ==0){
  8. pen.setWidthF(1.5);
  9. painter.setPen(pen);
  10. painter.drawLine(0, radius -15,0, radius);if(i %(subScaleMajor *9)==0){
  11. pen.setWidthF(2.0);
  12. QColor linecolor =AppInstance::getInstance()->foreGroundColor;
  13. linecolor.setAlpha(100);
  14. pen.setColor(linecolor);
  15. painter.setPen(pen);
  16. painter.drawLine(0, radius - lineWidth,0, radius);}}elseif(i % midScaleMajor ==0){
  17. pen.setWidthF(1.0);
  18. painter.setPen(pen);
  19. painter.drawLine(0, radius -10,0, radius);}else{
  20. pen.setWidthF(0.5);
  21. painter.setPen(pen);
  22. painter.drawLine(0, radius -5,0, radius);}
  23. painter.rotate(angleStep);}
  24. painter.restore();

五、效果图

在这里插入图片描述


本文转载自: https://blog.csdn.net/ly305750665/article/details/128485190
版权归原作者 雨田哥 所有, 如有侵权,请联系我们删除。

“Qt编写雷达模拟仿真工具1-背景布局”的评论:

还没有评论