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

news2024/12/23 20:28:13

一、前言

雷达模拟仿真工具,整体结构采用的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. 背景表格
    int rowgridCount = 6;
    int columngridCount = 6;

    painter.save();
    QPen pen;
    QColor tmpColor = AppInstance::getInstance()->foreGroundColor;
    tmpColor.setAlpha(150);
    pen.setColor(tmpColor);
    pen.setCapStyle(Qt::RoundCap);
    pen.setWidthF(0.5);
    painter.setPen(pen);
    
    QRectF girdRect = rect.adjusted(6, 6, -6, -6);
    qreal girdHeight = girdRect.height() * 1.0 / columngridCount;
    qreal girdWidth = girdRect.width() * 1.0 / rowgridCount;
    
    for (int row = 0; row <= rowgridCount; row++) {
        painter.drawLine(girdRect.x(), girdRect.y() + girdHeight * row, girdRect.x() + girdRect.width(), girdRect.y() + girdHeight * row);
    }

    for (int column = 0; column <= columngridCount; column++) {
        painter.drawLine(girdRect.x() + girdWidth * column, girdRect.y(), girdRect.x() + girdWidth * column, girdRect.y() + girdRect.height());
    }
    painter.restore();
  1. 绘制圆弧
	painter.save();
	painter.setBrush(AppInstance::getInstance()->foreGroundColor);
	QPainterPath ellipsePath;
	painter.translate(-radius, -radius);
	ellipsePath.addEllipse(0, 0, 2 * radius, 2 * radius);

	QPainterPath subPath;
	int arcWidth = 6;
	subPath.addEllipse(arcWidth, arcWidth, 2 * (radius - arcWidth), 2 * (radius - arcWidth));
	ellipsePath -= subPath;

	painter.drawPath(ellipsePath);
	painter.restore();
  1. 绘制刻度盘
		painter.save();
		painter.setPen(AppInstance::getInstance()->foreGroundColor);
		QFont font = painter.font();
		font.setPointSize(12);
		font.setWeight(60);
		painter.setFont(font);
		int scaleMajor = 36;
		radius -= 26;
		qreal q = 0;
		for (int i = 0; i < scaleMajor; i++) {
			int value = 1.0 * i * (360 / scaleMajor);
			QString strValue = QString("%1").arg(value, 3, 10, QLatin1Char('0'));
			painter.save();
			painter.rotate(q);
			qreal l = painter.fontMetrics().width(strValue) / 2.0;
			painter.drawText(QPointF(-l, -radius), strValue);
			painter.restore();
			q = q + 10;
		}
		painter.restore();
  1. 绘制圆弧背景蒙层
		int aphpaRadius = radius - 6;
		QColor tmpcolor = AppInstance::getInstance()->foreGroundColor;
		tmpcolor.setAlpha(10);
		painter.save();
		painter.setPen(Qt::NoPen);
		painter.setBrush(tmpcolor);
		painter.translate(-aphpaRadius, -aphpaRadius);
		painter.drawEllipse(0, 0, 2 * aphpaRadius, 2 * aphpaRadius);
		painter.restore();
  1. 绘制刻度
		int scaleMajor = 36;
		radius -= 6;
		painter.save();
		painter.rotate(0);
		int subScaleMajor = 10;
		int midScaleMajor = subScaleMajor / 2;
		int steps = (scaleMajor * subScaleMajor);
		double angleStep = 360.0 / steps;
		QPen pen;
		pen.setColor(AppInstance::getInstance()->foreGroundColor);
		pen.setCapStyle(Qt::RoundCap);
		for (int i = 0; i <= steps; i++) {
			if (i % subScaleMajor == 0) {
				pen.setWidthF(1.5);
				painter.setPen(pen);
				painter.drawLine(0, radius - 15, 0, radius);

				if (i % (subScaleMajor * 9) == 0) {
					pen.setWidthF(2.0);
					QColor linecolor = AppInstance::getInstance()->foreGroundColor;
					linecolor.setAlpha(100);
					pen.setColor(linecolor);
					painter.setPen(pen);
					painter.drawLine(0, radius - lineWidth, 0, radius);
				}
			}
			else if (i % midScaleMajor == 0) {
				pen.setWidthF(1.0);
				painter.setPen(pen);
				painter.drawLine(0, radius - 10, 0, radius);
			}
			else {
				pen.setWidthF(0.5);
				painter.setPen(pen);
				painter.drawLine(0, radius - 5, 0, radius);
			}
			painter.rotate(angleStep);
		}
		painter.restore();

五、效果图

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/126865.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Spring框架(容器)--简介(实现原理、核心模块、组成部分)

spring框架&#xff08;容器&#xff09; spring简介 1、Spring的用途不仅限于服务器端的开发。从简单性、可测试性和松耦合的角度而言&#xff0c;任何Java应用都可以从Spring中受益。 2、Spring是一个轻量级的控制反转(IoC)和面向切面(AOP)的容器框架。 3、轻量——从大小…

Creo9.0 Windows 3D建模工具

前言 creo9.0正式版是一款非常优秀的3D建模设计软件。该软件界面美观&#xff0c;提供了CAD 技术、模制造绘图、多实体建模、多体设计、实时仿真、框架和焊缝设计等一系列强大的辅助设计功能&#xff0c;通过这些功能&#xff0c;让用户轻松解决设计中带来的各种问题。 下载 …

律所管理系统的功能以及作用分别有哪些?

在全球进入信息化的时代&#xff0c;随着网络的普及与发展&#xff0c;网络所带来的信息交流与利用的优势愈发明显。尤其是随着法律制度的不断健全和人民法律意识的提高&#xff0c;涉及法律诉讼的案件也在不断地增加&#xff0c;律师事务所作为中介的法律机构&#xff0c;要处…

字符设备驱动(一)

1.Linux设备分类 linux的文件种类&#xff1a; -&#xff1a;普通文件 文件内容文件名元信息&#xff08;文件的相关属性—组织在inode的一个结构体内&#xff09; d&#xff1a;目录文件 p&#xff1a;管道文件 s&#xff1a;本地socket文件 l&#xff1a;链接文件 软链接&am…

4 内部类实例

内部类 内部类的分类&#xff1a; 成员内部类方法内部类局部内部类匿名类静态内部类 1 成员内部类 是在一个类中声明的类&#xff0c;包含内部类的是外围类 成员内部类的访问权限&#xff1a; public可以在外围类的外部使用内部类创建对象private只能在外围类的内部使用内…

提升Mac使用性能的5大方法,都非常的好用哦~

是不是发现你的 Mac 越用运行速度会越慢&#xff1f;没错&#xff0c;任何电子设备&#xff0c;随着使用时间的增加&#xff0c;都会出现不如刚买时那么流畅的问题。Mac当然也不能例外&#xff0c;它的运行速度会随着使用时长的递增而有所下降&#xff0c;所以为 Mac 提速也是十…

CSS总结(网页布局:标准流 浮动 定位)

CSS 主要的功能是布局页面&#xff0c;增加标签的样式和部分交互效果。 资料来源&#xff1a;黑马 目录 元素显示 块级元素 行内元素 行内块元素 显示模式的转换 CSS三个特点 盒子模型 传统三种布局 标准流 浮动 结合浮动和标准流可以搭建出常见的网页布局: 清除…

Java Integer.toBinaryString() 方法源码及原理解析(进制转换、位运算)

title: Java Integer.toBinaryString() 方法源码及原理解析&#xff08;进制转换、位运算&#xff09; date: 2022-12-27 17:31:38 tags: Java categories:Java cover: https://cover.png feature: false 1. 使用及源码概览 Integer.toBinaryString() 方法用于将十进制整数转…

【1 - 决策树 - 案例部分:泰坦尼克号幸存者预测】菜菜sklearn机器学习

课程地址&#xff1a;《菜菜的机器学习sklearn课堂》_哔哩哔哩_bilibili 第一期&#xff1a;sklearn入门 & 决策树在sklearn中的实现第二期&#xff1a;随机森林在sklearn中的实现第三期&#xff1a;sklearn中的数据预处理和特征工程第四期&#xff1a;sklearn中的降维算法…

Spring RCE漏洞CVE-2022-22965复现与JavaFx GUI图形化漏洞利用工具开发

文章目录前言一、漏洞描述二、影响范围三、漏洞复现3.1 漏洞poc四、修复建议五、图形化工具开发-Rexbb简介与使用5.1 工具使用总结前言 换了新工作&#xff0c;年底了比较多自学的时间&#xff0c;所以把今年比较经典的漏洞给复现一下&#xff0c;之前因为没空&#xff0c;只复…

python--PyCHarm里代码整体向左/右缩进

1、PyCharm 里代码整体向左缩进 鼠标选中多行代码&#xff0c;同时按住 Shift Tab 键&#xff0c;实现一次向左缩进4个字符。 2、PyCharm 里代码整体向右缩进 鼠标选中多行代码&#xff0c;按下 Tab 键&#xff0c;实现一次向右缩进4个字符。 3、PyCharm 里光标变粗 光标…

信创大提速,企业如何在高速行驶中更换“发动机”?

导读&#xff1a;信创替代如何平滑迁移不“翻车”&#xff1f; 经过多年发展&#xff0c;中国信创产业迎来全面提速。 2022年国家下发的79号文中&#xff0c;全面给出了国资信创产业发展与进度的指导&#xff0c;要求到2027年央企国企100%完成信创替代&#xff0c;替换范围涵盖…

SprintBoot实战(十一)集成 xxl-job

目录1.简介2.Maven依赖3.初始化数据库4.调度中心配置5.执行器配置6.项目结构7.访问页面8.新建定时任务9.BEAN运行模式10.GLUE(Java)运行模式1.简介 xxl-job&#xff1a; 是一个分布式任务调度平台。平台架构分为 “调度中心” 和 “执行器”。调度中心类似定时任务的注册中心&a…

SuperMap iDesktop 之 BIM优化流程——建筑篇

kele 一、背景介绍 BIM数据是三维系统中的常客&#xff0c;它具有信息完备性、信息关联性、信息一致性、 可视化、协调性、模拟性、优化性和可出图性八大特点&#xff0c;广受人们喜爱&#xff0c;但这也使得它自身数据量庞大&#xff0c;在项目中展示效果不尽人意&#xff0c…

SegeX MemDialog:封装好的内存对话框(非资源对话框)说明

----哆啦刘小洋 原创&#xff0c;转载需说明出处 2022-12-27 SegeX MemDialog1 简介2 源文件清单3 快速测试4 实现基本原理5 主要功能6 使用方法6 .1 简单界面6.2 复杂界面1 简介 SegeX组件之一&#xff1a;SegeX MemDialog&#xff0c;应用级内存对话框封装类。源码首次公开。…

IEC 60598-2-22-2021 灯具 第2-22部分- 特殊要求-应急照明灯具.

2021年12月6日&#xff0c;国际电工委员会发布标准IEC 60598-2-22:2021《灯具-第2-22部分&#xff1a;特殊要求-应急照明灯具》。IEC 60598-2-22:2021标准以IEC 60598-2-22:2021 RLV标准的形式提供&#xff0c;包含国际标准及其红线版本&#xff0c;内容显示了与前一版本相比对…

tensorflow06——正则化缓解过拟合

正则化主要是在损失函数中引入了第二个部分&#xff0c;模型复杂度&#xff0c;具体就是对w参数赋予了权值&#xff0c;并求和&#xff0c;再乘上一个超参数。 &#xff08;利用给w加上权值&#xff0c;弱化训练数据的噪声&#xff09; 大概可以理解为这个意思假设模型有两个参…

从0-1搭建流媒体系统之ZLMediaKit 安装、运行、推流、拉流

音视频开发系列 文章目录音视频开发系列前言一、ZLMediaKit是什么&#xff1f;二、使用过程1.编译、安装、运行2.推流、拉流总结前言 目前、比较有名的流媒体服务器有ZLMediaKit、srs、live555、eadydarwin等。因为srs是单线程服务、对于多核服务器的支持需要通过部署多个服务…

蓝牙学习七(MAC地址)

1.简介 一个BLE设备&#xff0c;可以使用两种类型的地址&#xff08;一个BLE设备可以同时具备两种地址&#xff09;&#xff1a;Public Device Address&#xff08;公共设备地址&#xff09;和Random Device Address&#xff08;随机设备地址&#xff09;。而Random Device Add…

如何用 java 实现【二叉搜索树】

文章目录搜索树概念1. 查找操作2. 插入操作3. 删除操作4. 以上三种操作的测试5. 性能分析搜索树概念 二叉搜索树 又称 二叉排序树&#xff0c;它或者是一棵空树&#xff0c;或者是具有以下性质的二叉树&#xff1a; 若它的 左 子树 不为空&#xff0c;则 左 子树上所有节点的值…