java计算雷达扫描范围_雷达扫描 - linyinmobayu - 博客园

1、设计思想

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

a70b1d9ef8d9436082dbcf822c990408.png

代码实现原理:

上图的扫描线和余辉效果,可以使用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();

}

b27d08ab61127f33387c8d41bc961ff2.png

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

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();

}

最终效果如下。

83f5503d9095621a5926b4c0f9a230d5.png

外层怎么 调用?使用信号和槽驱动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、效果演示

652d96eb37096a54f506afd502df5441.png

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

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

相关文章

mysql降序后去重_Mysql 数据记录去重后按字段排序

实现效果&#xff1a;去重—取最新的—排序例子 : 按用户ID获取历史记录中某个人的记录&#xff0c;要求非重复的且每条只获取最新的&#xff0c;同时按添加时间倒序排列的实现 &#xff1a;SELECT *FROM (SELECT *FROM historysWHERE types_id1ORDER BY created DESC) AS BGRO…

linux php 守护进程,PHP程序员玩转Linux系列 使用supervisor实现守护进程

PHP程序员玩转Linux系列文章&#xff1a;首先遇到的问题是,部署nodejs的博客程序时,我把执行nodejs的命令放到后台,使用加&和nohup命令如:nodejs index.js & 或者 nohup nodejs index.js &&这个使用是当退出此次终端会话的时候就会停止, nohup这个命令理论上是…

计算机初级包括php吗,计算机的基本组成包括什么

计算机的基本组成包括控制器、运算器、存储器、输入设备和输出设备。其中&#xff0c;控制器是整个计算机的中枢神经&#xff0c;它的功能是对程序规定的控制信息进行解释&#xff0c;根据其要求进行控制&#xff0c;调度程序、数据&#xff0c;协调计算机各部分工作及内存与外…

ubuntu11.10 源码编译安装php5.3.8,Ubuntu 11.10编译安装Nginx、PHP 5.3.8、MySQL、MongoDB、Memcached、SSL、SMTP...

手动安装php mongo扩展sudo apt-get install autoconfwget http://pecl.php.net/get/mongo-1.2.6.tgztar -zxvf mongo-1.2.6.tgzcd mongo-1.2.6/usr/local/php/bin/phpize./configure --with-php-config/usr/local/php/bin/php-configmakesudo make installecho extension mon…

java实现图像处理高通滤波,图像处理入门——滤波 - leo_de_macondo的个人页面 - OSCHINA - 中文开源技术交流社区...

模糊图像模糊的方法可以将每个像素的rgb值用周围像素的加权平均值来代替。比如用周围的9个像素来计算加权平均值&#xff0c;权值可以用一个3x3的矩阵来表示&#xff1a;| 1 2 1 || 2 4 2 | * (1/16)| 1 2 1 |中间的像素是要处理的像素&#xff0c;越靠近中间权…

matlab数据接口技术,matlab接口技术与应用

matlab接口技术与应用来源&#xff1a;mamingkeda作者&#xff1a;华仔浏览&#xff1a;1070时间&#xff1a;2016-08-10 14:18标签&#xff1a;摘要&#xff1a;matlab接口技术与应用应用程序接口的使用方法。全书分为10章&#xff0c;第1章是matlab环境和编程语言的概述&…

ssrf 过滤.php,SSRF技巧之如何绕过filter_var( )

0x00 前言前几天我读了两篇非常棒的论文&#xff1a;第一篇是发表在blackhat.com上的“A New Era of SSRF ”&#xff0c;讲述的是不同编程语言的SSRF问题&#xff1b;第二篇是由Positive Technology发表的一篇名为“PHP Wrapper” 的论文&#xff0c;它主要讲述的是如何以多种…

如何用notepad写php,notepad新手怎么使用

新手使用notepad的几个小技巧&#xff1a;一、软件始终置于屏幕最前方有时候我们在运行程序时&#xff0c;需要将notepad放置到屏幕最前方&#xff0c;此时只需要在工具栏中点击&#xff1a;view——always on tops&#xff1b;此时notepad就会一直处于屏幕最前方。注&#xff…

双网卡主机配置oracle监听,VirtualBox设置双网卡实现虚机上网及主宿机互访

VirtualBox 虚拟机之间互连、主宿机互连、以及主宿机连接互联网的功能非常实用。下面介绍实现主宿机通过虚拟网卡互连方式。1 全局配置VirtualBox安装完成后&#xff0c;会在系统中装一块虚拟网卡&#xff0c;我们在 管理> 全局设定中可以看到。这块网卡是在 Host-Only 连接…

linux无filelength函数,Linux Shell 自定义函数(定义、返回值、变量作用域)介绍

定义Shell函数(define function) 语法&#xff1a;[ function ] funname [()]{action;[return int;]}说明&#xff1a;可以带function fun() 定义&#xff0c;也可以直接fun() 定义,不带任何参数。参数返回&#xff0c;可以显示加&#xff1a;return 返回&#xff0c;如果不加&…

linux ssh登录历史,Linux中的SSH登录

在Linux系统中需要使用SSH远程登录到另一个Linux系统&#xff0c;可以使用SSH命令加用户和IP地址的方法。ssh命令用于远程登录上的Linux主机。常用格式&#xff1a;ssh [-l login_name] [ –p port] [userhostname]例如不指定用户&#xff1a;ssh 192.168.0.100指定用户&#x…

linux监控电脑配置,Zabbix基本配置及监控主机

监控主机一版需要在被监控的主机上安装Zabbix Agent监控主机安装zabbix-agent首先需要在被监控的主机上安装agent&#xff0c;可以下载预编译好的RPM进行安装&#xff0c;下载地址&#xff1a;http://www.zabbix.com/download也可以源码安装&#xff0c;类似server的安装&#…

linux内网安装git,一键安装GitLab7在RHEL6.4上

&#xff11; 关于gitlab7无论如何gitlab是个好东西&#xff0c;但是极难安装和配置。bitnami(https://bitnami.com/)的一键安装包虽然可以解决大问题&#xff0c;但是仍有很多人无法配置gitlabnginx和email发送等等问题。今天特意完整地再梳理一次。对各位读者的问题不再逐一…

linux显示点阵字体,Fedora 17中文字体显示点阵状的解决方法

在Fedora 17中文字体的显示变成点阵状了&#xff0c;为什么在Fedora 16下中文字体是文泉驿正黑。到Fedora 17之后&#xff0c;中文字体由文泉驿正黑(WenQuanYi Zen Hei)变为WenQuanYi Zen Hei Sharp。这个新字体的特殊之处就是在12磅及以下的中文字体&#xff0c;将显示成点阵字…

c语言打印空心矩形图案的程序,C语言之输出空心棱形图案

#include#includevoid main(){int n,j,i; /*i为行数,j为每行中的项数*/printf("输入图案上三角的高度n:");scanf("%d",&n);;i < n;i) /*打印上三角&#xff0c;(包括中间行)*/{;j < n - i;j){-i || j n - - i * i )printf(" *");el…

c语言优化冒泡法,C语言:冒泡法排序一组数,如何优化?

#define _CRT_SECURE_NO_WARNINGS 1#include#includeint main(){int arr[] { 5, 6, 7, 8, 9 ,1, 2, 3, 4};int i 0;int j 0;int flag;int size sizeof(arr) / sizeof(arr[0]);for (i 0; i < size- 1 ; i){flag 1;//设置标志位&#xff0c;优化冒泡for (j 0; j < s…

android 分享到豆瓣,Android项目总结之社会化分享

随着现在社交网络的日益繁多&#xff0c;众多的社交客户端已占据了人们的大量时间&#xff0c;所以在我们的应用中具有一键分享的功能对提高我们产品的知名度有很大的帮助。新浪微博、腾讯微博、腾讯QQ、微信、QQ空间、豆瓣等众多知名社交站点&#xff0c;都是我们可以分享的去…

android实现自动横竖屏切换,android 中实现横竖屏切换【原创】

我们在使用android手机的时候&#xff0c;发现一些应用有横竖屏切换的功能&#xff0c;一般实现有以下几种方法&#xff1a;一、设置1.通过XML设置横竖屏切换在项目的 AndroidManifest.xml中找到你所指定的activity中加上android:screenOrientation属性&#xff0c;它有以下几个…

超级管理器Android,超级文件管理器app

详情超级文件管理器app&#xff0c;一款帮助你管理手机内存的软件&#xff0c;还可以重命名&#xff0c;移动&#xff0c;删除文件&#xff0c;在Android平台上完美运行&#xff0c;并能够与其他OI系列软件结合使用! 能快速地查找到目标文件&#xff0c;十分方便用户管理自己手…

android miui ios,从iOS到Android——小米11及小米生态实际使用体验

从iOS到Android——小米11及小米生态实际使用体验2021-02-22 15:29:5693点赞155收藏131评论创作立场声明&#xff1a;文中的设备均为自购&#xff0c;无任何特定立场。2021年2月10日&#xff0c;我的iPhoneX手机突然黑屏&#xff0c;拿到Apple Store检测&#xff0c;经诊断是屏…