若该文为原创文章,转载请注明原文出处
本文章博客地址:https://blog.csdn.net/qq21497936/article/details/110994486
长期持续带来更多项目与技术分享,咨询请加QQ:21497936、微信:yangsir198808
红胖子(红模仿)的博文大全:开发技术集合(包含Qt实用技术、树莓派、三维、OpenCV、OpenGL、ffmpeg、OSG、单片机、软硬结合等等)持续更新中…(点击传送门)
开发专栏:商业项目实战
需求
生命探测仪
1. 扫描雷达状态显示:正在扫描 or 扫描停止;
2. 显示扫描雷达的灵敏度;
3. 探测过程中的数据文件保存(用于跟踪和后期回放)
4. 探测仪连接app的终端的状态显示;
5. 电池电量显示;
6. 多语言切换,中文/英文;
7. 探测目标二维成图显示界面,包括生命体、静止目标、动态目标;
8. 显示or隐藏动态目标的移动轨迹;
9. 雷达探测过程中实时现实探测的前方障碍物物体等,同时转换为一维火山图显示;
10. 前方探测距离的、方位范围‘、灵敏度设置;
11. 探测文件实时保存;
12. 探测文件的探测过程回放;
Demo
硬件
关键代码
RadarScanWidget.h
#ifndef RADARSCANWIDGET_H
#define RADARSCANWIDGET_H
#include <QWidget>
#include <QElapsedTimer>
#include <QPixmap>
#include <QTimer>
namespace Ui {
class RadarScanWidget;
}
class RadarScanWidget : public QWidget
{
Q_OBJECT
public:
enum COORDINATE_HORIZAL{
COORDINATE_HORIZAL_4 = 0x00,
COORDINATE_HORIZAL_6 = 0x01,
COORDINATE_HORIZAL_8 = 0x02,
};
enum COORDINATE_VERTICAL{
COORDINATE_VERTICAL_10 = 0x00,
COORDINATE_VERTICAL_20 = 0x01,
COORDINATE_VERTICAL_30 = 0x02,
};
public:
explicit RadarScanWidget(QWidget *parent = 0);
~RadarScanWidget();
public:
inline bool hasMoveTarget() { return _listListPointFForMove.size() > 15; }
void setShowMoveLineMoreThanLimitPoints(int showMoveLineMoreThanLimitPoints);
signals:
void signalStaticTargetNumber(int number);
public slots:
void startScanning();
void stopScanning();
void setHorizalCoordinate(COORDINATE_HORIZAL c);
void setVerticalCoordinate(COORDINATE_VERTICAL c);
void setShowPath(bool showPath);
void recvTargetPointF(QList<QPointF> listPointF, bool isStatic);
void recvMatrixUChar(int frameIndex, QList<uchar> listUChar);
void clearAllData();
protected slots:
void timeout();
protected:
void paintEvent(QPaintEvent *event);
void timerEvent(QTimerEvent *event);
protected:
void drawBackground(QPainter &painter);
void drawChartBackground(QPainter &painter);
void drawChart(QPainter &painter);
void drawArc(QPainter &painter);
void drawPointData(QPainter &painter);
void drawWallData(QPainter &painter);
protected:
QPointF judgetStaticDistanceLessThanDistance(QPointF p1, QPointF p2, qreal distance, bool *ok = 0);
bool judgetMoveDistanceLessThanDistance(QPointF p1, QPointF p2, qreal distance);
private:
Ui::RadarScanWidget *ui;
int _offsetX;
int _offsetY;
int _stepsX;
int _stepsY;
int _rangleXMin;
int _rangleXMax;
int _rangleYMin;
int _rangleYMax;
int _width;
int _height;
QColor _backgroundColor;
QColor _backgroundChartColor;
QColor _lineColor;
QColor _color;
QColor _pointColor;
QStringList _strListVericalLocaltion;
QStringList _strListHorizalLocaltion;
int _offsetHorizalTextX;
int _offsetHorizalTextY;
int _offsetVerticalTextX;
int _offsetVerticalTextY;
int _originX;
int _originY;
bool _isScanning;
COORDINATE_HORIZAL _cooradinateHorizal;
COORDINATE_VERTICAL _cooradinateVertical;
int _indexOfArc;
int _timerId;
int _interval;
QList<QList<QPointF> > _listListPointFForMove;
QList<QList<QPointF> > _listListPointFForMoveLine;
QList<QList<QPointF> > _listListPointFForStatic;
QList<QList<uchar> > _listListUCharForMaxtric;
QList<QPointF> _listPointFForStatic;
bool _showPath;
QElapsedTimer _elapsedTimerForMove;
QElapsedTimer _elapsedTimerForStatic;
int _intervalTime;
QPixmap _pixmap;
QList<QPixmap> _listPixmapForMove;
QList<QPixmap> _listPixmapForStatic;
QList<int> _listCount;
QTimer *_pTimer;
int _staticCircleR;
QList<int> _listStaticTime;
int _staticsStaticTargetTime;
int _showMoveLineMoreThanLimitPoints;
};
#endif // RADARSCANWIDGET_H
RadarScanWidget.cpp
#include "RadarScanWidget.h"
#include "ui_RadarScanWidget.h"
#include <QPainter>
#include <QDebug>
#include <QtMath>
RadarScanWidget::RadarScanWidget(QWidget *parent) :
QWidget(parent),
ui(new Ui::RadarScanWidget),
_offsetX(7),
_offsetY(18),
_width(565),
_height(400),
_stepsX(6),
_stepsY(5),
_rangleXMin(-6),
_rangleXMax(6),
_rangleYMin(0),
_rangleYMax(10),
_backgroundColor(QColor(0x10, 0x0f, 0x14)),
_backgroundChartColor(QColor(0x21, 0x24, 0x29)),
_lineColor(QColor(83, 83, 85)),
_color(QColor(0x66, 0x66, 0x66)),
_offsetHorizalTextX(-10),
_offsetHorizalTextY(14),
_offsetVerticalTextX(0),
_offsetVerticalTextY(5),
_isScanning(false),
_cooradinateHorizal(COORDINATE_HORIZAL_6),
_cooradinateVertical(COORDINATE_VERTICAL_10),
_indexOfArc(0),
_interval(1000),
_showPath(true),
_pointColor(Qt::red),
_intervalTime(500),
_staticCircleR(12),
_showMoveLineMoreThanLimitPoints(10)
{
ui->setupUi(this);
setHorizalCoordinate(_cooradinateHorizal);
setVerticalCoordinate(_cooradinateVertical);
_pixmap.load(":/images/wall.png");
_listPixmapForMove.append(QPixmap(":/images/move1.png"));
_listPixmapForMove.append(QPixmap(":/images/move2.png"));
_listPixmapForMove.append(QPixmap(":/images/move3.png"));
_listPixmapForMove.append(QPixmap(":/images/move4.png"));
_listPixmapForMove.append(QPixmap(":/images/move5.png"));
_listPixmapForMove.append(QPixmap(":/images/move6.png"));
_listPixmapForMove.append(QPixmap(":/images/move7.png"));
_listPixmapForStatic.append(QPixmap(":/images/static1.png"));
_listPixmapForStatic.append(QPixmap(":/images/static2.png"));
_listPixmapForStatic.append(QPixmap(":/images/static3.png"));
_listPixmapForStatic.append(QPixmap(":/images/static4.png"));
_listPixmapForStatic.append(QPixmap(":/images/static5.png"));
_listPixmapForStatic.append(QPixmap(":/images/static6.png"));
_listPixmapForStatic.append(QPixmap(":/images/static7.png"));
for(int index = 0; index < 10; index++)
{
_listCount.append(0);
_listStaticTime.append(0);
}
_pTimer = new QTimer();
connect(_pTimer, SIGNAL(timeout()), this, SLOT(timeout()));
}
RadarScanWidget::~RadarScanWidget()
{
delete ui;
}
void RadarScanWidget::setShowMoveLineMoreThanLimitPoints(int showMoveLineMoreThanLimitPoints)
{
if(showMoveLineMoreThanLimitPoints <= 1)
{
return;
}
_showMoveLineMoreThanLimitPoints = showMoveLineMoreThanLimitPoints;
}
void RadarScanWidget::startScanning()
{
if(_isScanning)
return;
_staticsStaticTargetTime = 0;
_pTimer->start(300);
_isScanning = true;
_indexOfArc = 0;
_timerId = startTimer(_interval);
// _elapsedTimerForMove.start();
// _elapsedTimerForStatic.start();
this->update();
}
void RadarScanWidget::stopScanning()
{
if(!_isScanning)
return;
_pTimer->stop();
_isScanning = false;
killTimer(_timerId);
int number = 0;
for(int index = 0; index < _listCount.size(); index++)
{
if(_listCount[index] > 15)
{
number++;
}
// qDebug() << __FILE__ << __LINE__ << _listCount;
}
emit signalStaticTargetNumber(number);
this->update();
}
void RadarScanWidget::setHorizalCoordinate(RadarScanWidget::COORDINATE_HORIZAL c)
{
if(_isScanning)
{
return;
}
switch (c)
{
case COORDINATE_HORIZAL_4:
_cooradinateHorizal = c;
// 水平坐标
_strListHorizalLocaltion.clear();
_strListHorizalLocaltion << "-4" << "-3" << "-2" << " 1" << " 0" << " 1" << " 2" << " 3"<< " 4";
_stepsX = 8;
break;
case COORDINATE_HORIZAL_6:
_cooradinateHorizal = c;
// 水平坐标
_strListHorizalLocaltion.clear();
_strListHorizalLocaltion << "-6" << "-4" << "-2" << " 0" << " 2" << " 4" << " 6";
_stepsX = 6;
break;
case COORDINATE_HORIZAL_8:
_cooradinateHorizal = c;
// 水平坐标
_strListHorizalLocaltion.clear();
_strListHorizalLocaltion << "-8" << "-6" << "-4" << "-2" << " 0" << " 2" << " 4" << " 6" << " 8";
_stepsX = 8;
break;
default:
break;
}
this->update();
}
void RadarScanWidget::setVerticalCoordinate(RadarScanWidget::COORDINATE_VERTICAL c)
{
if(_isScanning)
{
return;
}
switch (c)
{
case COORDINATE_VERTICAL_10:
_cooradinateVertical = c;
// 垂直坐标
_strListVericalLocaltion.clear();
_strListVericalLocaltion << "10.0" << "8.0" << "6.0" << "4.0" << "2.0";
break;
case COORDINATE_VERTICAL_20:
_cooradinateVertical = c;
// 垂直坐标
_strListVericalLocaltion.clear();
_strListVericalLocaltion << "20.0" << "16.0" << "12.0" << "8.0" << "4.0";
break;
case COORDINATE_VERTICAL_30:
_cooradinateVertical = c;
// 垂直坐标
_strListVericalLocaltion.clear();
_strListVericalLocaltion << "30.0" << "24.0" << "18.0" << "12.0" << "6.0";
break;
default:
break;
}
this->update();
}
void RadarScanWidget::setShowPath(bool showPath)
{
_showPath = showPath;
}
void RadarScanWidget::recvTargetPointF(QList<QPointF> listPointF, bool isStatic)
{
if(isStatic)
{
_listListPointFForStatic.append(listPointF);
_elapsedTimerForStatic.start();
if(_listPointFForStatic.size() == 0)
{
_listPointFForStatic << listPointF;
}else{
for(int index = 0; index < listPointF.size(); index++)
{
bool ok = false;
// 备份更新的点
QList<QPointF> listPointFForStatic = _listPointFForStatic;
for(int index2 = 0; index2 < _listPointFForStatic.size(); index2++)
{
bool flag = false;
QPointF pointF = judgetStaticDistanceLessThanDistance(listPointF.at(index), _listPointFForStatic.at(index2), 0.9, &flag);
if(flag)
{
// qDebug() << __FILE__ << __LINE__ << "****************";
listPointFForStatic[index2] = listPointF.at(index);
_listStaticTime[index2] = 0;
_listCount[index2]++;
ok = true;
break;
}
}
if(!ok)
{
listPointFForStatic.append(listPointF.at(index));
_listCount[listPointFForStatic.size()-1] = 0;
}
_listPointFForStatic = listPointFForStatic;
}
}
}else{
_listListPointFForMove.append(listPointF);
_elapsedTimerForMove.start();
// 动态目标,连线基准
if(_listListPointFForMoveLine.size() == 0)
{
_listListPointFForMoveLine << listPointF;
}else{
// 备份更新的点
QList<QList<QPointF> > listListPointFForMoveLine = _listListPointFForMoveLine;
// 遍历本次传过来的点
for(int index = 0; index < listPointF.size(); index++)
{
bool ok = false;
// 本次传过来的某个点,与已有的连线的点进行比较,小于1.5则连线,并退出循环,开始下个点
for(int index2 = 0; index2 < _listListPointFForMoveLine.size(); index2++)
{
// 如果小于1.0
if(judgetMoveDistanceLessThanDistance(listPointF.at(index), _listListPointFForMoveLine.at(index2).last(), 1.0))
{
listListPointFForMoveLine[index2].append(listPointF.at(index));
ok = true;
break;
}
}
if(!ok)
{
// qDebug() << __FILE__ << __LINE__ << "****************";
QList<QPointF> listPointF2;
listPointF2.append(listPointF.at(index));
listListPointFForMoveLine.append(listPointF2);
}
}
_listListPointFForMoveLine = listListPointFForMoveLine;
}
}
this->update();
}
void RadarScanWidget::recvMatrixUChar(int frameIndex, QList<uchar> listUChar)
{
Q_UNUSED(frameIndex);
_listListUCharForMaxtric.append(listUChar);
this->update();
}
void RadarScanWidget::clearAllData()
{
_listListUCharForMaxtric.clear();
_listListPointFForMove.clear();
_listListPointFForStatic.clear();
for(int index = 0; index < _listCount.size(); index++)
{
_listCount[index] = 0;
}
_listPointFForStatic.clear();
_listListPointFForMoveLine.clear();
this->update();
}
void RadarScanWidget::timeout()
{
static bool asc = true;
if(!asc)
{
_staticCircleR--;
if(_staticCircleR <= 6)
{
asc = true;
}
}else{
_staticCircleR++;
if(_staticCircleR >= 12)
{
asc = false;
}
}
this->update();
}
void RadarScanWidget::paintEvent(QPaintEvent *event)
{
Q_UNUSED(event);
QPainter painter(this);
// painter.setRenderHint(QPainter::Antialiasing, true);
drawBackground(painter);
drawChartBackground(painter);
drawChart(painter);
drawPointData(painter);
drawWallData(painter);
if(_isScanning)
{
drawArc(painter);
}
}
void RadarScanWidget::drawBackground(QPainter &painter)
{
painter.save();
// 背景色
painter.fillRect(0, 0, this->width(), this->height(), QBrush(_backgroundColor));
painter.setPen(_color);
painter.drawLine(this->width()-1, 0, this->width()-1, this->height());
painter.restore();
}
void RadarScanWidget::drawChartBackground(QPainter &painter)
{
painter.save();
// 二维图标背景
painter.setPen(_backgroundChartColor);
painter.setBrush(_backgroundChartColor);
// 圆弧(等待客户确认坐标)
int moreWidth = 40;
painter.drawChord(QRectF(_offsetX - moreWidth, _offsetY, _width + 2 * moreWidth, _height * 2 / 3), 29*16, (180-29*2)*16);
// 多边形(矩形 + 底部三角形)
QPolygonF polygon;
polygon << QPointF(_offsetX, _offsetY + 69.0)
<< QPointF(_offsetX, _offsetY + 350)
<< QPointF(_offsetX + _width / 2, _offsetY + _height)
<< QPointF(_offsetX + _width, _offsetY + 350)
<< QPointF(_offsetX + _width, _offsetY + 69)
<< QPointF(_offsetX, _offsetY + 69);
QPainterPath painterPath;
painterPath.addPolygon(polygon);
painter.drawPath(painterPath);
painter.restore();
}
void RadarScanWidget::drawChart(QPainter &painter)
{
painter.save();
// 垂直线条
painter.setPen(_lineColor);
int verticalLines = _stepsX;
int horizalLines = _stepsY + 1;
float spaceY = (float)_height / _stepsY;
float middleX = (float)_width / 2;
float spaceX = (float)_width / 2 / (verticalLines / 2);
QPen pen = painter.pen();
for(int index = 0; index <= verticalLines / 2; index++)
{
if(index != verticalLines / 2)
{
pen.setStyle(Qt::DashLine);
}else{
pen.setStyle(Qt::SolidLine);
}
painter.setPen(pen);
painter.drawLine(QPointF(_offsetX + middleX - index * spaceX, _offsetY), QPointF(_offsetX + middleX - index * spaceX, _offsetY + _height));
painter.drawLine(QPointF(_offsetX + middleX + index * spaceX, _offsetY), QPointF(_offsetX + middleX + index * spaceX, _offsetY + _height));
}
// 水平线条
for(int index = 0; index < horizalLines; index++)
{
if(index == horizalLines - 1)
{
pen.setStyle(Qt::SolidLine);
}else{
pen.setStyle(Qt::DashLine);
}
painter.setPen(pen);
painter.drawLine(QPointF(_offsetX + middleX - verticalLines / 2 * spaceX, _offsetY + index * spaceY),
QPointF(_offsetX + middleX + verticalLines / 2 * spaceX, _offsetY + index * spaceY));
}
// 绘制垂直坐标文字
painter.setPen(_color);
QFont font = painter.font();
font.setBold(true);
font.setPixelSize(14);
painter.setFont(font);
for(int index = 0; index < _strListVericalLocaltion.size(); index++)
{
painter.drawText(QPointF(_offsetX + _width / 2 + _offsetVerticalTextX, _offsetY + spaceY * index + _offsetVerticalTextY ), _strListVericalLocaltion.at(index));
}
// 绘制水平坐标文字
for(int index = 0; index < _strListHorizalLocaltion.size(); index++)
{
painter.drawText(QPointF(_offsetX + (spaceX+1) * index + _offsetHorizalTextX + (verticalLines/2)*3 - index * 3, _offsetY + _height + _offsetHorizalTextY), _strListHorizalLocaltion.at(index));
}
painter.restore();
}
void RadarScanWidget::drawArc(QPainter &painter)
{
painter.save();
// 绘制圆弧
float spaceX = _width / _stepsX;
float spaceY = _height / _stepsY;
painter.setPen(QColor(0x14,0xab,0xc2));
int startAngle = 30 * 16;
int spanAngle = 120 * 16;
int rate = 1;
int rate2 = 2;
for(int index = 0; index < 5; index++)
{
if(index < 6- _indexOfArc - 1)
{
continue;
}
painter.drawArc(_offsetX + (spaceX - spaceX * rate / rate2) * index,
_offsetY + spaceY * index,
_width - index * 2 * (spaceX - spaceX * rate / rate2),
_height - spaceY * index, startAngle, spanAngle);
}
painter.restore();
}
void RadarScanWidget::drawPointData(QPainter &painter)
{
painter.save();
// 计算相对坐标
// 原点坐标
double offsetPointX = _offsetX + _width / 2;
double offsetPointY = _offsetY + _height;
// 横坐标相对坐标
double widthRangle = 0;
switch (_cooradinateHorizal)
{
case COORDINATE_HORIZAL_4:
widthRangle = 4.0;
break;
case COORDINATE_HORIZAL_6:
widthRangle = 6.0;
break;
case COORDINATE_HORIZAL_8:
widthRangle = 8.0;
break;
default:
break;
}
// 纵坐标相对坐标
double heightRangle = 0;
switch (_cooradinateVertical)
{
case COORDINATE_VERTICAL_10:
heightRangle = 10.0;
break;
case COORDINATE_VERTICAL_20:
heightRangle = 20.0;
break;
case COORDINATE_VERTICAL_30:
heightRangle = 30.0;
break;
default:
break;
}
// 计算点坐标与实际坐标
double xRate = _width / 2 / widthRangle;
double yRate = _height / heightRangle;
int index = 0;
// 运动目标,菱形
painter.setPen(Qt::red);
painter.setBrush(Qt::red);
if(_showPath && _isScanning)
{
QPen pen = painter.pen();
pen.setColor(Qt::red);
pen.setWidth(2);
painter.setPen(pen);
QPolygonF polygonF;
for(int index = 0; index < _listListPointFForMove.size(); index++)
{
QList<QPointF> listPointFForMove = _listListPointFForMove.at(index);
for(int index2 = 0; index2 < listPointFForMove.count(); index2++)
{
if( (listPointFForMove.at(index2).x() < -widthRangle)
|| (listPointFForMove.at(index2).x() > widthRangle)
|| (listPointFForMove.at(index2).y() < 0)
|| (listPointFForMove.at(index2).y() > heightRangle))
{
continue;
}
polygonF << QPointF(offsetPointX + xRate * listPointFForMove.at(index2).x(), offsetPointY - yRate * listPointFForMove.at(index2).y());
}
}
painter.drawPoints(polygonF);
}else if(!_isScanning){
for(int index = 0; index < _listListPointFForMoveLine.size(); index++)
{
QPen pen = painter.pen();
pen.setColor(Qt::red);
pen.setWidth(2);
painter.setPen(pen);
QList<QPointF> listPointFForMoveLine = _listListPointFForMoveLine.at(index);
QPolygonF polygonF;
if(listPointFForMoveLine.size() <= _showMoveLineMoreThanLimitPoints)
{
continue;
}
#if 0
for(int index2 = 1; index2 < listPointFForMoveLine.size(); index2++)
{
painter.drawLine(QPointF(offsetPointX + xRate * listPointFForMoveLine.at(index2-1).x(), offsetPointY - yRate * listPointFForMoveLine.at(index2-1).y()),
QPointF(offsetPointX + xRate * listPointFForMoveLine.at(index2).x(), offsetPointY - yRate * listPointFForMoveLine.at(index2).y()));
}
#else
for(int index2 = 0; index2 < listPointFForMoveLine.size(); index2++)
{
polygonF << QPointF(offsetPointX + xRate * listPointFForMoveLine.at(index2).x(), offsetPointY - yRate * listPointFForMoveLine.at(index2).y());
}
painter.drawPolyline(polygonF);
// qDebug() << __FILE__ << __LINE__ << "dynamic _listListPointFForMoveLine.size() << listPointFForMoveLine;
}
#endif
}
if(_elapsedTimerForMove.elapsed() < _intervalTime && _isScanning)
{
index = _listListPointFForMove.size() - 1;
if(index > 0)
{
QList<QPointF> listPointFForMove = _listListPointFForMove.at(index);
for(int index2 = 0; index2 < listPointFForMove.size(); index2++)
{
painter.drawPixmap(QPointF(offsetPointX + xRate * listPointFForMove.at(index2).x() - 12, offsetPointY - yRate * listPointFForMove.at(index2).y() - 12), _listPixmapForMove.at(index2%_listPixmapForMove.size()));
// 显示坐标
painter.drawText(QPointF(offsetPointX + xRate * listPointFForMove.at(index2).x() + 12, offsetPointY - yRate * listPointFForMove.at(index2).y() + 6),
QString("(%1,%2)").arg(QString::number(listPointFForMove.at(index2).x(), 'f', 1))
.arg(QString::number(listPointFForMove.at(index2).y(), 'f', 1)));
}
}
}
// 静止目标,圆形(不需要画路径)
QPen pen = painter.pen();
pen.setColor(Qt::green);
pen.setWidth(2);
painter.setPen(pen);
if(_showPath && _isScanning)
{
QPolygonF polygonF;
for(int index = 0; index < _listListPointFForStatic.size(); index++)
{
QList<QPointF> listPointFForStatic = _listListPointFForStatic.at(index);
for(int index2 = 0; index2 < listPointFForStatic.count(); index2++)
{
if( (listPointFForStatic.at(index2).x() < -widthRangle)
|| (listPointFForStatic.at(index2).x() > widthRangle)
|| (listPointFForStatic.at(index2).y() < 0)
|| (listPointFForStatic.at(index2).y() > heightRangle))
{
continue;
}
polygonF << QPointF(offsetPointX + xRate * listPointFForStatic.at(index2).x(), offsetPointY - yRate * listPointFForStatic.at(index2).y());
// painter.drawEllipse(QPointF(offsetPointX + xRate * listPointFForStatic.at(index2).x(), offsetPointY - yRate * listPointFForStatic.at(index2).y()), 1, 1);
}
}
}
// 十秒
if(_isScanning)
{
for(int index2 = 0; index2 < _listPointFForStatic.size(); index2++)
{
if(_listStaticTime[index2] < 10)
{
painter.drawPixmap((int)(offsetPointX + xRate * _listPointFForStatic.at(index2).x() - _staticCircleR), (int)( offsetPointY - yRate * _listPointFForStatic.at(index2).y() - _staticCircleR),
_staticCircleR*2, _staticCircleR*2,
_listPixmapForStatic.at(index2%_listPixmapForStatic.size()));
// 显示坐标
painter.drawText(QPointF(offsetPointX + xRate * _listPointFForStatic.at(index2).x() + 12, offsetPointY - yRate * _listPointFForStatic.at(index2).y() + 6),
QString("(%1,%2)").arg(QString::number(_listPointFForStatic.at(index2).x(), 'f', 1))
.arg(QString::number(_listPointFForStatic.at(index2).y(), 'f', 1)));
}
}
}else{
for(int index2 = 0; index2 < _listPointFForStatic.size(); index2++)
{
// 停止扫描后大于15个的轨迹才显示
if(_listCount[index2] > 15)
{
painter.drawPixmap((int)(offsetPointX + xRate * _listPointFForStatic.at(index2).x() - 12), (int)( offsetPointY - yRate * _listPointFForStatic.at(index2).y() - 12),
12*2, 12*2,
_listPixmapForStatic.at(index2%_listPixmapForStatic.size()));
// 显示坐标
painter.drawText(QPointF(offsetPointX + xRate * _listPointFForStatic.at(index2).x() + 12, offsetPointY - yRate * _listPointFForStatic.at(index2).y() + 6),
QString("(%1,%2)").arg(QString::number(_listPointFForStatic.at(index2).x(), 'f', 1))
.arg(QString::number(_listPointFForStatic.at(index2).y(), 'f', 1)));
}
}
}
painter.restore();
}
void RadarScanWidget::drawWallData(QPainter &painter)
{
painter.save();
// 原点坐标
double offsetPointX = _offsetX + _width / 2;
double offsetPointY = _offsetY + _height;
// 横坐标相对坐标
double widthRangle = 0;
switch (_cooradinateHorizal)
{
case COORDINATE_HORIZAL_4:
widthRangle = 4.0;
break;
case COORDINATE_HORIZAL_6:
widthRangle = 6.0;
break;
case COORDINATE_HORIZAL_8:
widthRangle = 8.0;
break;
default:
break;
}
// 纵坐标相对坐标
double heightRangle = 0;
switch (_cooradinateVertical)
{
case COORDINATE_VERTICAL_10:
heightRangle = 10.0;
break;
case COORDINATE_VERTICAL_20:
heightRangle = 20.0;
break;
case COORDINATE_VERTICAL_30:
heightRangle = 30.0;
break;
default:
break;
}
// 311 101
painter.setPen(Qt::white);
int pixmapOffsetX = -3;
int pixmapOffsetY = -3;
int pixmapWidth = 6;
int pixmapHeight = 6;
for(int index = 0; index < _listListUCharForMaxtric.size(); index++)
{
QList<uchar> listUChar = _listListUCharForMaxtric.at(index);
double xRateCol = _width / 2 / widthRangle * 5.0 / 50;
double yRateRol = _height / heightRangle * 31.0 / 311;
for(int col = 0; col < 50; col++)
{
for(int row = 0; row < 311; row++)
{
if(listUChar[col*311+row] == 0)
{
continue;
}
if((int)(offsetPointY - yRateRol * row) + pixmapOffsetY < _offsetY)
{
continue;
}
// painter.drawPoint(offsetPointX - xRateCol * (50-col), offsetPointY - yRateRol * row) ;
painter.drawPixmap((int)(offsetPointX - xRateCol * (50-col)) + pixmapOffsetX, (int)(offsetPointY - yRateRol * row) + pixmapOffsetY,
pixmapWidth, pixmapHeight, _pixmap);
}
}
for(int row = 0; row < 311; row++)
{
if(listUChar[50*311+row] == 0)
{
continue;
}
// painter.drawPoint(offsetPointX - xRateCol * (50-50), offsetPointY - yRateRol * row) ;
painter.drawPixmap((int)(offsetPointX - xRateCol * (50-50)) + pixmapOffsetX, (int)(offsetPointY - yRateRol * row) + pixmapOffsetY,
pixmapWidth, pixmapHeight, _pixmap);
}
for(int col = 51; col < 101; col++)
{
for(int row = 0; row < 311; row++)
{
if(listUChar[col*311+row] == 0)
{
continue;
}
if((int)(offsetPointY - yRateRol * row) + pixmapOffsetY < _offsetY)
{
continue;
}
// painter.drawPoint(offsetPointX + xRateCol * (col - 50), offsetPointY - yRateRol * row) ;
painter.drawPixmap((int)(offsetPointX + xRateCol * (col - 50)) + pixmapOffsetX, (int)(offsetPointY - yRateRol * row) + pixmapOffsetY,
pixmapWidth, pixmapHeight, _pixmap);
}
}
}
painter.restore();
}
void RadarScanWidget::timerEvent(QTimerEvent *event)
{
Q_UNUSED(event);
_indexOfArc ++;
_indexOfArc = _indexOfArc % 6;
for(int index = 0; index < _listPointFForStatic.size(); index++)
{
_listStaticTime[index]++;
}
this->update();
qDebug() << __FILE__ << __LINE__ << " _staticsStaticTargetTime =" << _staticsStaticTargetTime;
// 500ms一次 30 是15S
if(_staticsStaticTargetTime >= 30)
{
int number = 0;
for(int index = 0; index < _listCount.size(); index++)
{
if(_listCount[index] > 15)
{
number++;
}
// qDebug() << __FILE__ << __LINE__ << _listCount;
}
emit signalStaticTargetNumber(number);
_staticsStaticTargetTime = 1;
}
_staticsStaticTargetTime++;
}
QPointF RadarScanWidget::judgetStaticDistanceLessThanDistance(QPointF p1, QPointF p2, qreal distance, bool *ok)
{
QPointF pointF;
// 距离小于0.9则计算
if( qSqrt( qPow(p1.x() - p2.x(), 2.0) + qPow(p1.y() - p2.y(), 2.0) ) < distance)
{
pointF.setX( (p1.x()+p2.x()) / 2.0);
pointF.setY( (p1.y()+p2.y()) / 2.0);
if(ok != 0)
{
*ok = true;
}
return pointF;
}else{
if(ok != 0)
{
*ok = false;
}
return pointF;
}
}
bool RadarScanWidget::judgetMoveDistanceLessThanDistance(QPointF p1, QPointF p2, qreal distance)
{
// 距离小于0.9则计算
if( qSqrt( qPow(p1.x() - p2.x(), 2.0) + qPow(p1.y() - p2.y(), 2.0) ) < distance)
{
return true;
}else{
return false;
}
}
若该文为原创文章,转载请注明原文出处
本文章博客地址:https://blog.csdn.net/qq21497936/article/details/110994486