#include "widget.h"
#define PI 3.14159
#define NoalmalSize 10
#define maxSize 30
#define ShowRange 30
#define MaxPoints 200
#define ShowPointsInterval 100
#define AngleInterval 1
Widget::Widget(QWidget *parent)
: QWidget(parent)
{
resize(600,600);
this->startTimer(25);
initdata();
}
Widget::~Widget()
{
}
void Widget::initdata()
{
m_desPoints.clear();
for (int i = 0; i < qrand()%MaxPoints; ++i)
{
QPointF p;
if (i % 4 == 0)
{
p.setX(qrand()/(width()/5));
p.setY(qrand()/(height()/5));
}
else if (i % 4 == 1)
{
p.setX(-qrand()/(width()/5));
p.setY(qrand()/(height()/5));
}
else if (i % 4 == 2)
{
p.setX(qrand()/(width()/5));
p.setY(-qrand()/(height()/5));
}
else if (i % 4 == 3)
{
p.setX(-qrand()/(width()/5));
p.setY(-qrand()/(height()/5));
}
m_desPoints.append(p);
}
// m_desPoints<<QPoint(100,0)<<QPoint(0,100)<<QPoint(0,-100)<<QPoint(-100,0)<<QPoint(50*qSqrt(3),-50)<<QPoint(50*qSqrt(2),50*qSqrt(2));
}
void Widget::timerEvent(QTimerEvent *event)
{
static int index = 0;
m_pieRotate+=AngleInterval;
if (index++ == ShowPointsInterval)
{
index = 0;
initdata();
}
update();
}
void Widget::paintEvent(QPaintEvent *event)
{
#if 1
QPainter painter(this);
painter.setRenderHint(QPainter::Antialiasing);
QString pixpath = QApplication::applicationDirPath()+"/世界地图.jfif";
painter.drawPixmap(0,0,width(),height(),QPixmap(pixpath));
painter.setPen(Qt::white);
painter.drawLine(QPoint(width()/2,0),QPoint(width()/2,height()));
painter.drawLine(QPoint(0,height()/2),QPoint(width(),height()/2));
painter.translate(width()/2,height()/2);
painter.setPen(Qt::white);
painter.drawEllipse(QPoint(0,0),width()/2,height()/2);
painter.drawEllipse(QPoint(0,0),width()/4,height()/4);
painter.drawEllipse(QPoint(0,0),width()/8,height()/8);
painter.drawEllipse(QPoint(0,0),width()/16,height()/16);
painter.drawEllipse(QPoint(0,0),width()/32,height()/32);
//余晖扫描
// int len = m_drawArea.width();
double x = width()/2 * cos(m_pieRotate*PI/180);
double y = height()/2 * sin(m_pieRotate*PI/180);
painter.setPen(QPen(Qt::green));
painter.drawLine(QPoint( 0, 0 ),QPointF(x,y));
//扇形
QConicalGradient gradient;
gradient.setCenter(QPoint( 0, 0 ));
gradient.setAngle(-m_pieRotate + 180); //渐变与旋转方向恰好相反,以扇形相反的边作为渐变角度。
gradient.setColorAt(0.4,QColor(169,253,51,100)); //从渐变角度开始0.5 - 0.75为扇形区域,由于Int类型计算不精确,将范围扩大到0.4-0.8
gradient.setColorAt(0.8,QColor(169,253,51,0));
painter.setBrush(QBrush(gradient));
painter.setPen(Qt::NoPen);
painter.drawPie(-width()/2,-height()/2,width(),height(),-m_pieRotate*16,90*16);
//目标圆位置
QPointF p1(0,0); //扫描线起点坐标
QPointF p2(x,y); //扫描线终点坐标
for (int i = 0; i < m_desPoints.size(); ++i) {
QPointF Q = m_desPoints[i];
#if 1
scanRegion1(painter,Q,p1,p2,i);
#else
scanRegion2(painter,Q,p1,p2,i);
#endif
}
#endif
}
void Widget::scanRegion1(QPainter &painter,QPointF Q,QPointF p1,QPointF p2,int index)
{
double s1 = atan2(Q.y(),Q.x())*180/PI;
double s2 = atan2(p2.y(),p2.x())*180/PI;
painter.save();
painter.translate(Q);
painter.rotate(2*m_pieRotate);
//按照弧度来计算,此处求弧度的方法atan、atan2、qAtan、qAtan2。
//atan弧度范围[-PI/2,PI/2]、atan2弧度范围[-PI,PI]
if (s1 <= s2 && s1 >= s2 - ShowRange) //判断一个范围内出现的目标。(范围扫描)
// if (s2 >= qFloor(s1) && s2 <= qCeil(s1)) //判断扫描线上出现的目标。(准点扫描)
{
painter.setPen(Qt::green);
painter.setBrush(QBrush(QColor(255,255,255,50)));
QPointF P = QPointF(0,0); //移到坐标原点,配合rotate实现自转。
painter.drawEllipse(P,maxSize,maxSize);
painter.drawRect(P.x()-(maxSize+4)/2,P.y()-(maxSize+4)/2,maxSize+4,maxSize+4);
painter.drawText(P.x()-(maxSize+4)/2,P.y()-(maxSize+4)/2,maxSize+4,maxSize+4,Qt::AlignCenter,QString::number(index));
}
else
{
painter.setPen(Qt::red);
painter.setBrush(QBrush(QColor(255,255,255,50)));
QPointF P = QPointF(0,0); //移到坐标原点,配合rotate实现自转。
painter.drawEllipse(P,NoalmalSize,NoalmalSize);
painter.drawRect(P.x()-(NoalmalSize+4)/2,P.y()-(NoalmalSize+4)/2,NoalmalSize+4,NoalmalSize+4);
}
painter.restore();
}
void Widget::scanRegion2(QPainter &painter,QPointF Q,QPointF p1,QPointF p2,int index)
{
painter.save();
painter.translate(Q);
painter.rotate(2*m_pieRotate);
// 叉积公式:(Q - P1) * (P2 - P1)= 0 判断Q点是否在点P1到P2的线段上
// (Q.x - P1.x) * (P2.y - P1.y) == (P2.x - P1.x) * (Q.y - P1.y)
// int val = (Q.x() - p1.x())*(p2.y() - p1.y()) - (p2.x() - p1.x())*(Q.y() - p1.y());
//等比 三角形A(边abc)和三角形B(边efg)是等比三角形,所以a/e = b/f = c/g.扫描线和出现在扫描线上的坐标点构成等比三角形。
double val = (Q.x() - p1.x())/(p2.x() - p1.x()) - (Q.y() - p1.y())/(p2.y() - p1.y());
// qDebug()<<val;
if ( val<= 0.1 && val >= -0.1
&& qMin(p1.x() , p2.x()) <= Q.x() && Q.x() <= qMax(p1.x() , p2.x())
&& qMin(p1.y() , p2.y()) <= Q.y() && Q.y() <= qMax(p1.y() , p2.y()))
{
painter.setPen(Qt::green);
painter.setBrush(QBrush(QColor(255,255,255,50)));
QPointF P = QPointF(0,0); //移到坐标原点,配合rotate实现自转。
painter.drawEllipse(P,maxSize,maxSize);
painter.drawRect(P.x()-(maxSize+4)/2,P.y()-(maxSize+4)/2,maxSize+4,maxSize+4);
painter.drawText(P.x()-(maxSize+4)/2,P.y()-(maxSize+4)/2,maxSize+4,maxSize+4,Qt::AlignCenter,QString::number(index));
}
else
{
painter.setPen(Qt::red);
painter.setBrush(QBrush(QColor(255,255,255,50)));
QPointF P = QPointF(0,0); //移到坐标原点,配合rotate实现自转。
painter.drawEllipse(P,NoalmalSize,NoalmalSize);
painter.drawRect(P.x()-(NoalmalSize+4)/2,P.y()-(NoalmalSize+4)/2,NoalmalSize+4,NoalmalSize+4);
}
painter.restore();
}
QT雷达扫描仪表,两种扫描方式。
需积分: 32 93 浏览量
2022-07-27
11:23:11
上传
评论
收藏 1.17MB RAR 举报
东方忘忧
- 粉丝: 1w+
- 资源: 34
最新资源
- 最全空间计量实证方法(空间杜宾模型和检验以及结果解释文档).txt
- 5uonly.apk
- 蓝桥杯Python组的历年真题
- 2023-04-06-项目笔记 - 第一百十九阶段 - 4.4.2.117全局变量的作用域-117 -2024.04.30
- 2023-04-06-项目笔记 - 第一百十九阶段 - 4.4.2.117全局变量的作用域-117 -2024.04.30
- 前端开发技术实验报告:内含4四实验&实验报告
- Highlight Plus v20.0.1
- 林周瑜-论文.docx
- 基于MIC+NE555光敏电阻的声光控电路Multisim仿真原理图
- 基于JSP毕业设计-基于WEB操作系统课程教学网站的设计与实现(源代码+论文).zip
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
评论0