1、设计思想

雷达扫描图,在影视作品中见到较多,比如飞机雷达、舰艇雷达,有一个扫描线转圈代表雷达一周旋转或一个批次的收发,发现目标就在表盘上标记位置。和汽车仪表盘类似,汽车仪表盘有底盘背景图、同圆、刻度、刻度值、旋转的指针。能在汽车仪表盘的基础上略作修改,比如指针换成带有余辉的扫描扇面,就能完成一个雷达扫描图。

代码实现原理:

上图的扫描线和余辉效果,可以使用QConicalGradient 函数来实现,qconicalgradient()提供的是一种扇形渐变效果,圆锥式渐变或称角度渐变。用这个渐变色来填充drawPie函数就可以实现扇形选择的余辉。

QConicalGradient::QConicalGradient(qreal cx, qreal cy, qreal angle)

void QPainter::drawPie(const QRectF &rectangle, int startAngle, int spanAngle)

Qt大神刘典武文章中有典型的讲解,《Qt编写自定义控件62-探探雷达》中实现的扫描效果就是雷达的效果。详情移步https://zhuanlan.zhihu.com/p/85512788。

2、代码实现

绘制同心圆,x和y轴实线,45度对角线虚线。

void Radar::drawCircle(QPainter *painter)

{

painter->save();

QColor color = QColor(0, 100, 0);

QPen pen = QPen(color, 2);

painter->setPen(pen);

for(int i=0; i<4; i++)

{

int r = this->radius / 4 * (i+1);

painter->drawEllipse(-r, -r, r * 2, r * 2);

}

for(int i=0; i<=4; i++) // x,y 轴线是实线

{

int r = this->radius;

if((i%2) == 0) {

pen.setStyle(Qt::SolidLine);

}

else{

pen.setStyle(Qt::DashDotLine);

//pen.setDashPattern(QVector() << 10 << 2 ); //实线:空线的比例

}

painter->setPen(pen);

painter->drawLine(-r, 0, r, 0);

painter->rotate(90/2);

}

painter->restore();

}

绘制扫描图,依靠锥形渐变颜色,通过透明度控制形成扫描效果,然后绘制饼图。

void Radar::drawScan(QPainter *painter)

{

painter->save();

//锥形渐变颜色,通过透明度控制形成扫描效果

QConicalGradient conicalGradient(0, 0, this->angle);

QColor color = QColor(0,150,0);

color.setAlpha(100);

conicalGradient.setColorAt(0, color);

color.setAlpha(20);

conicalGradient.setColorAt(0.1, color);

color.setAlpha(0);

conicalGradient.setColorAt(1, color);

//绘制饼圆

QPen pen;

pen.setWidth(5);

pen.setBrush(conicalGradient);

painter->setPen(pen);

painter->setBrush(conicalGradient);

int r = this->radius;

QRect rect(-r, -r, r * 2, r * 2);

painter->drawPie(rect, this->angle * 16, 360 * 16); // 1/16th of a degree

painter->restore();

}

给雷达加上模拟的扫描目标,实现起来很简单,就是打点。

void Radar::drawPoints(QPainter *painter)

{

painter->save();

QColor color = QColor(200, 10, 0);

QPen pen = QPen(color, 1);

painter->setPen(pen);

painter->setBrush(color);

for(int i=0; ipoints.count(); i++)

{

int r = 6;

QRect rect(points[i].x() - r/2, points[i].y() - r/2, r * 2, r * 2);

painter->drawEllipse(rect);// 画实心小点

}

painter->restore();

}

最终效果如下。

外层怎么 调用?使用信号和槽驱动Radar类对象。

RadarScan::RadarScan(QWidget *parent)

: QMainWindow(parent)

, ui(new Ui::RadarScan)

{

ui->setupUi(this);

// start and stop

connect(this, &RadarScan::radar_state_changed,

ui->radar, &Radar::radar_start_control);

connect(ui->startButton, &QPushButton::clicked, [=](){

emit radar_state_changed(true);

});

connect(ui->stopButton, &QPushButton::clicked, [=](){

emit radar_state_changed(false);

});

// speed control

connect(this, &RadarScan::radar_speed_changed,

ui->radar, &Radar::radar_speed_control);

connect(ui->fastButton, &QPushButton::clicked, [=](){

emit radar_speed_changed(true);

});

connect(ui->slowButton, &QPushButton::clicked, [=](){

emit radar_speed_changed(false);

});

connect(ui->randomButton, &QPushButton::clicked, ui->radar, &Radar::radar_random_point);

}

3、效果演示

java计算雷达扫描范围_雷达扫描 - linyinmobayu - 博客园相关推荐

  1. 限制会话id服务端不共享_会话控制 - able-woman - 博客园

    会话控制是什么? cookie和session都是跟踪整个会话过程的技术手段.而会话,就是用户通过浏览器和服务器的一次通话. 为什么要有会话控制? 因为HTTP协议是无状态的,服务器不知道用户上一次做 ...

  2. Java集合和泛型练习及面试题——博客园:师妹开讲啦

    给定一段JAVA代码如下:要打印出list中存储的内容,以下语句正确的是( B  ) ArrayList list = new ArrayList( ) list.add("a") ...

  3. java 粒子滤波_粒子滤波 - gary_123 - 博客园

    跟着博主http://blog.csdn.net/heyijia0327/article/details/40899819一起学习 尽管利用高斯逼近能有效解决许多滤波问题,但当滤波分布为多模型或某些状 ...

  4. java数字常量_数字常量 - javawebsoa - 博客园

    数字常量 shell脚本在默认情况下都是把数字作为10进制数来处理, 除非这个数字采用了特殊的标记或者前缀. 如果数字以0开头的话那么就是8进制数. 如果数字以0x开头的话那么就是16进制数. 如果数 ...

  5. java原子变量的作用_原子变量 - jock_javaEE - 博客园

    一.原子变量的作用:解决并发下多个线程操作共享数据存在,线程安全问题 原子变量 = volatile + CAS算法[又叫无锁机制] 二. 例子 package com.atguigu.juc; im ...

  6. java 熔断_熔断理解 - THISISPAN - 博客园

    服务熔断的理解 服务熔断也称服务隔离,来自于Michael Nygard 的<Release It>中的CircuitBreaker应用模式,Martin Fowler在博文Circuit ...

  7. java元类_元类 - 一心不乱 - 博客园

    我们使用class机制产生的类,然后在通过类产生的对象 而类实际上都是通过type来实现的 首先确定type里需要添加哪些元素 class_name = 'A'   类名 class_base = ( ...

  8. 斯特林数 java实现_斯特林数 - BILL666 - 博客园

    第一类斯特林数 定义 \(\left[\begin{matrix}n\\m\end{matrix}\right]\) 表示将\(n\)个带标号的元素放入\(m\)个不带标号的环的方案数 递推式 \[\ ...

  9. java 透传_透明传输 - javaadu - 博客园

    发送方和接收方数据的长度和内容完全一致,相当于一条无形的传输线. 关于透明传输的问题 透明传输就是在传输过程中,对外界透明,就是说你看不见他是传送网络不管传输的业务如何,我只负责将需要传送的业务传送到 ...

最新文章

  1. 马斯克公开支持“上班摸鱼”:让工作更愉快!
  2. Java值类型与引用类型的不同
  3. 福禄克网络TIA识别MPTL连接的操作方法
  4. java访问本地文件_java 读取本地文件 更改
  5. 多线程编程学习笔记——使用并发集合(三)
  6. 区块链入门与去中心化应用实战 之一 第3章 区块链技术核心原理实现
  7. emlog微语支持html,emlog取消微语字数限制
  8. 毕业设计——第三章 开发方法及系统实现(6)(完结)
  9. 20180513 实参 形参 数组
  10. android 修改 选择壁纸来源,修改android选择壁纸来源列表
  11. linux如何修改telnet密码,如何修改用户SSH\telnet登陆linux时候显示的欢迎信息
  12. python代码写龙卷风_python-打开网站时龙卷风403获取警告
  13. Report Builder简单的使用操作
  14. preappend php,laravel 模型追加append 属性使用
  15. 部署企业级项目管理系统(禅道)
  16. 社保的计算及缴纳地及个人部分和公司缴纳部分的一些疑问
  17. Linux账号与身份管理
  18. django 缓存cache配置注意事项
  19. require.js库
  20. 接口测试要点及用例设计

热门文章

  1. python计算precision,recall,f1-score
  2. 使用Matplotlib创建散点图
  3. QT学习笔记(九):遍历容器-迭代器(iterators)
  4. 数字图像处理 第二章 图像处理基础
  5. 转载:使用 Frida 来 hook 加固的 Android 应用的 java 层
  6. android主要文件的作用是什么,androidmanifest.xml文件的作用是什么
  7. 前端React结构工程-改写render
  8. onclick进不去ajax,在ajax调用之后处理onclick函数
  9. 基于java的rsa加密程序_RSA rsa加密程序,rsa java源码和 rsa的jsp Crypt_De algrithms 解密 238万源代码下载- www.pudn.com...
  10. GPU环境配置指南(Ubuntu16.04+CUDA+CUDNN)