项目实战:Qt+iMx6生命探测仪(探测障碍物、静止目标、动态目标、生命目标、探测半径、探测前方雷达显示、动态目标轨迹显示、探测热力图、探测过程存储与回放)

若该文为原创文章,转载请注明原文出处
本文章博客地址: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

猜你喜欢

转载自blog.csdn.net/qq21497936/article/details/110994486