3D点云绘制,并实时刷新显示

展示效果图如下:
在这里插入图片描述
在这里插入图片描述

#include "widget.h"
#include "ui_widget.h"


Widget::Widget(QWidget *parent)
    : QWidget(parent)
    ,AxisXMinValue(0)
    ,AxisXMaxValue(MAXSIZE)
    ,AxisYMinValue(0)
    ,AxisYMaxValue(MAXSIZE)
    ,AxisZMinValue(0)
    ,AxisZMaxValue(MAXSIZE)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);

    qsrand(QTime(0,0,0).secsTo(QTime::currentTime()));          //设置随机数种子

     //垂直布局
    m_main_layout = new QVBoxLayout();
    setLayout(m_main_layout);

    //QT数据可视化框架的三维散点图
    m_scatter = new QtDataVisualization::Q3DScatter(nullptr);
    m_scatter->setShadowQuality(QtDataVisualization::QAbstract3DGraph::ShadowQualityNone);
    m_scatter->setFlags(m_scatter->flags() | Qt::FramelessWindowHint);
    _3DWidget = QWidget::createWindowContainer(m_scatter);
    m_main_layout->addWidget(_3DWidget);
    m_main_layout->setMargin(0);

    //X轴的标题
    m_scatter->axisX()->setRange(0, MAXSIZE);
    m_scatter->axisX()->setTitleVisible(true);
    m_scatter->axisX()->setTitle(QStringLiteral("X轴"));
    m_scatter->axisX()->setLabelFormat(QStringLiteral("X:%.2f 公里"));//坐标轴保留2位小数

    //Z轴的标题
    m_scatter->axisZ()->setRange(0, MAXSIZE);
    m_scatter->axisZ()->setTitleVisible(true);
    m_scatter->axisZ()->setTitle(QStringLiteral("Z轴"));
    m_scatter->axisZ()->setLabelFormat(QStringLiteral("Z:%.2f 公里"));

    //Y轴(高)的标题
    m_scatter->axisY()->setRange(0, MAXSIZE);
    m_scatter->axisY()->setTitleVisible(true);
    m_scatter->axisY()->setTitle(QStringLiteral("Y轴"));
    m_scatter->axisY()->setLabelFormat(QStringLiteral("Y:%.2f 公里"));

    //设置网格
    m_scatter->axisX()->setSegmentCount((AxisXMaxValue - AxisXMinValue) / 5 + 1);
    m_scatter->axisY()->setSegmentCount((AxisYMaxValue - AxisYMinValue) / 15 );
    m_scatter->axisZ()->setSegmentCount((AxisZMaxValue - AxisZMinValue) / 5 + 1);

    m_scatter->axisX()->setSubSegmentCount(0);
    m_scatter->axisY()->setSubSegmentCount(0);
    m_scatter->axisZ()->setSubSegmentCount(0);

    m_scatter->axisX()->setReversed(true);

    m_scatter->scene()->activeLight()->setAutoPosition(false);
    m_scatter->scene()->activeCamera()->setCameraPosition(10.0f, 10.0f, 100.0f);
    m_scatter->activeTheme()->setType(QtDataVisualization::Q3DTheme::Theme(6));//设置背景为黑色
    m_scatter->activeTheme()->setBackgroundEnabled(true);
    m_scatter->activeTheme()->setGridEnabled(true);
    m_scatter->activeTheme()->setLabelBorderEnabled(true);
    m_scatter->activeTheme()->setLabelBackgroundEnabled(true);

    QLinearGradient gr;
    gr.setColorAt(0.0, QColor("#24205c"));
    gr.setColorAt(0.05, QColor("#8cfffb"));
    gr.setColorAt(0.08, QColor("#2af84c"));
    gr.setColorAt(0.11, QColor("#f8e02a"));
    gr.setColorAt(0.15, QColor("#f82ad9"));
    gr.setColorAt(0.2, QColor("#c52af8"));
    gr.setColorAt(0.25, QColor("#452af8"));
    gr.setColorAt(1.0, QColor("#24205c"));

    QtDataVisualization::QScatter3DSeries* Group = new QtDataVisualization::QScatter3DSeries();
    Group->setColorStyle(QtDataVisualization::Q3DTheme::ColorStyleRangeGradient);
    Group->setItemSize(0.02);
    Group->setBaseGradient(gr);
    Group->setColorStyle(QtDataVisualization::Q3DTheme::ColorStyleRangeGradient);
    Group->setMesh((QtDataVisualization::QAbstract3DSeries::Mesh)11);
    // 设置系列的颜色渐变
    QLinearGradient gradient;
    gradient.setColorAt(0.0, QColor(125,200,200));
    gradient.setColorAt(0.5, QColor(22,255,255));
    gradient.setColorAt(1.0, QColor(255,200,50));
    Group->setBaseGradient(gradient);

    Group->setMeshSmooth(true);

    m_scatter->addSeries(Group);

    timerTick = new QTimer(this);
    connect(timerTick, &QTimer::timeout,this,&Widget::slot_Update_Line);
    timerTick->start(500);
}

Widget::~Widget()
{
    delete ui;
}

void Widget::slot_Update_Line()
{
    m_scatter->removeSeries(m_Series);
    int rand = qrand() % 100 + 50;

    //三个序列的颜色
    const QColor colors[] = {QColor(255,25,200), QColor(0, 255, 0), QColor(22,255,255), QColor(150, 155, 200), QColor(250, 255, 0)};
    //三个序列的名称
    const QString names[] = {QStringLiteral("2021年"), QStringLiteral("2022年"), QStringLiteral("2023年")};
    m_Series = new QtDataVisualization::QScatter3DSeries();
    QtDataVisualization::QScatterDataArray data;
    //依次创建三个序列并加入到三维散点图中
    for (int i = 0; i < rand; i++)
    {
        m_Series->setName(names[qrand() % 3]);
        m_Series->setBaseColor(colors[qrand() % 5]);

        m_Series->setItemSize(0.1);
        m_Series->setMesh(QtDataVisualization::QAbstract3DSeries::Mesh::MeshArrow);//设置样式

        m_Series->setItemLabelFormat((QStringLiteral("@seriesName (@xLabel, @zLabel) =>  @yLabel)")));


        data << QVector3D((qrand() %  300),  (qrand() %  300),  qrand() %  300);
        m_Series->dataProxy()->addItems(data);

        m_scatter->addSeries(m_Series);
    }
}


  • 7
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

weixin_44585751

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值