qt 3d航迹图
一般就是三种方法
1.opengl,vtk这种从零自己画,网上也可能有半成品,大多是付费的。
2.重写qwt3d,07年就停止更新了,画出来类似opengl,需要自己修改参数,参数修改不对很难搞,对于经纬高某一个数数值跨度小不太友好。我这边需求数据就不太符合,所以很难搞,直接换成q3d了
3.直接用q3d,耗费资源比较大,方便点,但是只有曲面图,散点图和柱形图。除了不能拟合个线,其他都挺好用。
照着这个大佬的配置一下Am_Jun
重写qwt3d
track3d.h
#ifndef TRACK3D_H
#define TRACK3D_H#include <QTimer>
#include <qwt3d_surfaceplot.h>
#include <qwt3d_function.h>
#include <QMouseEvent>
using namespace Qwt3D;class Rosenbrock:public Function{ // 定义Rosenbrock类,继承自Function类
public:Rosenbrock(SurfacePlot & pw):Function(pw){} // 构造函数,初始化SurfacePlot对象和Function对象Rosenbrock(){} // 无参构造函数double operator()(double x, double y)//需要自行更改这个函数,以x,y轴的数值确定z值,坑的很{// return 2*x*y;//z轴初始范围与该函数相关return 9 * (y - 32.6);}
};class track3D:public Qwt3D::SurfacePlot
{
public:// 构造函数 初始化三维图表track3D();// 初始化Rosenbrock函数表面(用于定义坐标系底图)//void rosenbrockinit();// 添加航迹线bool addLine(QString linename,int linewidth);// 添加标记点(实现为仅保留单点的特殊线段)bool addPoint(QString pointName, int color,int lineWidth);// 更新指定标记点的坐标(保持固定长度)bool updatePointData(QString pointName,Qwt3D::Triple point);// 删除指定航迹线bool deleteLine(QString linename);// 清除所有航迹线bool deleteAllLine();// 向指定航迹线添加数据点bool addData(QString linename,Qwt3D::Triple point);// 设置当前坐标范围极值virtual void setCurMaxMin();// 重新绘制图表void replot();// 将QColor转换为Qwt3D的RGBA格式Qwt3D::RGBA colorToRGBA(const QColor& qtColor);
protected:virtual void keyPressEvent(QKeyEvent *);private:bool first = 0;// 三维图表实例(当前类本身)Qwt3D::SurfacePlot plot;//地图 管理航迹 航迹线管理器(键:线名称,值:线对象指针)QMap<QString,Qwt3D::Line3D*> mLine;//航迹 管理大小 航迹线长度记录(用于动态截断)QMap<QString,int> mLineSize;QVector<Line3D> testData;//颜色索引(循环使用预设颜色)int colorindex;// 预设颜色列表QVector<QColor> baseColors = {QColor(Qt::red), QColor(Qt::blue), QColor(Qt::black),QColor(Qt::green), /* 其他颜色 */};// 当前坐标轴范围临时变量double myCurxMin = 10000;double myCurxMax = -10000;double myCuryMin = 10000;double myCuryMax = -10000;// 初始坐标轴范围(经度/纬度)double myxMin = 10000;double myxMax = -10000;double myyMin = 10000;double myyMax = -10000;// 单条航迹最大数据点数int m_limit = 20000;// 默认线宽int defaultWidth = 5;//设置显示盒子Rosenbrock *m_rosenbrock;
};#endif // TRACK3D_H
track3d.cpp
#include "track3d.h"
#include <QDebug>track3D::track3D()
{// 设置图表的标题setTitle("GPS");// 设置绘图样式为线条三维样式setPlotStyle(Qwt3D::LINE3D_STYLE);//自动缩放坐标轴//coordinates()->setAutoScale(0);//设置隔离线数目setIsolines(5);// 创建一个Rosenbrock函数对象,并将其与当前SurfacePlot对象关联m_rosenbrock = new Rosenbrock(*this);// 设置网格的分辨率为10x10m_rosenbrock->setMesh(41,31);// 设置函数的定义域为x,y都在0到100之间m_rosenbrock->setDomain(myxMin,myxMax,myyMin,myyMax);m_rosenbrock->setMinZ(0);m_rosenbrock->setMaxZ(50);m_rosenbrock->create();// 设置坐标轴的网格线显示,仅在左侧、背面和底面显示
// coordinates()->setGridLines(true,false,Qwt3D::LEFT|Qwt3D::BACK|Qwt3D::FLOOR);// 为每个坐标轴设置主刻度和次刻度数量for (unsigned i=0; i != coordinates()->axes.size(); ++i){coordinates()->axes[i].setMajors(5); // 主刻度数量coordinates()->axes[i].setMinors(1); // 次刻度数量}// 设置各坐标轴的标签coordinates()->axes[X1].setLabelString("经度/°");coordinates()->axes[Y1].setLabelString("纬度/°");coordinates()->axes[Z1].setLabelString("高度/m");// 设置坐标轴样式为盒子样式setCoordinateStyle(BOX);// 设置图表的平移、旋转、缩放、缩小比例以及坐标轴的主刻度和副刻度数目setShift(1,0,0);setRotation(30,0,15);setShift(0, 0, 0); // 将图表移动到中心setZoom(0.9);// 更新数据,并更新图表replot();
}//void track3D::rosenbrockinit()
//{
// //更新坐标轴样式
// Rosenbrock rosenbrock(*this);
// rosenbrock.setDomain(myxMin,myxMax,myyMin,myyMax);
// rosenbrock.setMinZ(myzMin);
// rosenbrock.setMaxZ(myzMax);
// rosenbrock.create();
//}void track3D::keyPressEvent(QKeyEvent * e) // 定义键盘事件处理函数
{int c = e->key(); // 获取用户按下的键if(e->key() == Qt::Key_Up) // 判断用户按下的键是否为向上键{setShift(1,0,0); // 设置图形在三维空间中的位置,参数为x,y,z轴方向上的偏移量setRotation(30,0,15); // 设置图形在三维空间中的旋转角度,参数为x,y,z轴方向上的旋转角度setScale(1,1,1); // 设置图形缩放比例setShift(0.15,0,0); // 重新设置图形的偏移量,使其在x轴正方向上有一定的移动setZoom(0.9); // 缩小视图镜头}else if(c == 65) // 判断用户按下的键是否为字符'A'{setScale(xScale(),yScale(),zScale() * 1.2); // 增加z方向上的缩放比例}else if(c == 68) // 判断用户按下的键是否为字符'D'{setScale(xScale() * 1.2,yScale(),zScale()); // 增加x方向上的缩放比例}else if(c == 83) // 判断用户按下的键是否为字符'S'{setScale(xScale(),yScale() * 1.2,zScale()); // 增加y方向上的缩放比例}
}
//添加轨迹线
bool track3D::addLine(QString linename,int linewidth)
{//如果没有,则进行添加if(!mLine.contains(linename)){Qwt3D::Line3D _l3d;Qwt3D::Line3D *myLine1 = dynamic_cast<Qwt3D::Line3D *>(this->addEnrichment(_l3d));myLine1->configure(linewidth,true);colorindex = colorindex % 2;myLine1->setLineColor(colorToRGBA(baseColors[colorindex])); //设置默认颜色为红色colorindex++;mLine.insert(linename,myLine1);return true;}return false;
}bool track3D::addPoint(QString pointName,int color, int lineWidth)
{//实现方法:按照正常线段添加曲线 更新时只保留一个点位//如果没有,则进行添加if(!mLine.contains(pointName)){Qwt3D::Line3D _l3d;Qwt3D::Line3D *myLine1 = dynamic_cast<Qwt3D::Line3D *>(this->addEnrichment(_l3d));myLine1->configure(lineWidth,true);myLine1->setLineColor(colorToRGBA(baseColors[color]));mLine.insert(pointName,myLine1);return true;}return false;
}
//更新标识线-动态绘制时每次调用该函数使得线段长度固定
bool track3D::updatePointData(QString pointName, Triple point)
{//更新点的坐标if(mLine.contains(pointName)){mLineSize[pointName] += 1;auto it = mLine.find(pointName);if(mLineSize[pointName] > m_limit){//删除原来的数据it.value()->clear();mLineSize[pointName] = 0;}//更新点it.value()->add(point);}}
//删除单挑轨迹线
bool track3D::deleteLine(QString linename)
{if(mLine.contains(linename)) //如果包含{auto it = mLine.find(linename);it.value()->clear();this->degrade(it.value());mLine.remove(linename);return true;}return false;
}
//删除所有轨迹线
bool track3D::deleteAllLine()
{for(auto line:mLine){line->clear(); //移除所有曲线数据this->degrade(line);}mLine.clear(); //移除所有曲线return true;
}bool track3D::addData(QString linename, Triple point)
{if(mLine.contains(linename)) {// 独立判断各坐标轴极值if (point.x < myCurxMin) { myCurxMin = point.x;}if (point.x > myCurxMax) { myCurxMax = point.x;}if (point.y < myCuryMin) { myCuryMin = point.y;}if (point.y > myCuryMax) { myCuryMax = point.y;}setCurMaxMin(); // 只有当极值变化时才更新坐标范围replot(); // 刷新图表auto it = mLine.find(linename);it.value()->add(point);return true;} else {if(addLine(linename,defaultWidth)) return true;return false;}
}void track3D::setCurMaxMin()
{myxMax = qMax(myxMax,myCurxMax);myxMin = qMin(myxMin,myCurxMin);myyMax = qMax(myyMax,myCuryMax);myyMin = qMin(myyMin,myCuryMin);//myzMax = qMax(myzMax,myCurzMax);//myzMin = qMin(myzMin,myCurzMin);// myxMax = myxMax + 1;
// myxMin = myxMin - 1;// myyMax = myyMax + 1;
// myyMin = myyMin - 1;// myzMax = myzMax + 1;
// myzMin = myzMin - 1;qDebug() << "myxMax" << myxMax << "myxMin" << myxMin<< "myyMax" << myyMax << "myyMin" << myyMin;//<< "myzMax" << myzMax << "myzMin" << myzMin;// double _yScale = myxMax / myzMax;
// _yScale = (myxMax / myzMax) > _yScale? (myyMax / myzMax): _yScale;
// setScale(1,1,_yScale);m_rosenbrock->setDomain(myxMin - 0.001,myxMax + 0.001,myyMin - 0.001,myyMax + 0.001);//m_rosenbrock->setMinZ(0);//m_rosenbrock->setMaxZ(50);m_rosenbrock->create();// 为每个坐标轴设置主刻度和次刻度数量for (unsigned i = 0; i != coordinates()->axes.size(); ++i){coordinates()->axes[i].setMajors(5); // 主刻度数量coordinates()->axes[i].setMinors(1); // 次刻度数量}// 设置各坐标轴的标签coordinates()->axes[X1].setLabelString("经度/°");coordinates()->axes[Y1].setLabelString("纬度/°");coordinates()->axes[Z1].setLabelString("高度/m");// 设置坐标轴样式为盒子样式//setCoordinateStyle(BOX);}// 数据更新与重绘
void track3D::replot()
{std::vector<Line3D> lineContain;for(auto line:mLine){lineContain.push_back(*line);//方法1 单独为线段更新//updateData(*line);//updateGL();}//存在两条以上曲线时,必须使用此方法更新数据(参数为vector<Line3D>)updateData(lineContain);updateGL();
}//qColor 2 RGBA
RGBA track3D::colorToRGBA(const QColor &qtColor)
{Qwt3D::RGBA qwt3DColor;qwt3DColor.r = qtColor.redF(); // 获取红色分量并转换为0.0到1.0的范围qwt3DColor.g = qtColor.greenF(); // 获取绿色分量并转换为0.0到1.0的范围qwt3DColor.b = qtColor.blueF(); // 获取蓝色分量并转换为0.0到1.0的范围qwt3DColor.a = qtColor.alphaF(); // 获取透明度分量并转换为0.0到1.0的范围return qwt3DColor;
}
使用示例
track3D *m_track = nullptr;
//初始化航迹图并插入
m_track = new track3D();
ui->tabWidget->insertTab(1, m_track, "3D Track"); // 我插入到tab里的,可以直接创建个界面中
//插入线条
if (m_track->addLine("理论轨迹", 2)) {for (int i = 1;i < m_data.length() - 1;i ++) {Triple point(m_data.at(i).Longitude, m_data.at(i).Latitude, m_data.at(i).Altitude);m_track->addData("理论轨迹", point);qDebug() << m_data.at(i).Longitude << " " << m_data.at(i).Latitude << " " << m_data.at(i).Altitude;}m_track->replot();
}
照着这个大佬配置长沙红胖子Qt
直接使用q3d
q3dsurfacewidget.h
#ifndef Q3DSURFACEWIDGET_H
#define Q3DSURFACEWIDGET_H#include <QMainWindow>#include <Q3dscatter>
#include <q3dsurface.h>
#include <q3dtheme.h>
#include <qsurface3dseries.h>
#include <qvector3d.h>
#include <QtDataVisualization>
#include <qabstract3dinputhandler.h>
#include <qmap.h>using namespace QtDataVisualization;QT_BEGIN_NAMESPACE
namespace Ui { class Q3dSurfaceWidget; }
QT_END_NAMESPACEclass Q3dSurfaceWidget : public QMainWindow
{Q_OBJECTpublic:Q3dSurfaceWidget(QWidget *parent = nullptr);~Q3dSurfaceWidget();void drawPoint(QString linename,QVector<QVector3D> points);private:Ui::Q3dSurfaceWidget *ui;Q3DScatter *m_3Dgraph;void initControl();//理论数据QtDataVisualization::QScatter3DSeries *m_Theory;//散点类型//实际数据QtDataVisualization::QScatter3DSeries *m_Actual;//散点类型//数据代理QScatterDataProxy *proxy_Theory = nullptr;QScatterDataProxy *proxy_Actual = nullptr;};#endif // Q3DSURFACEWIDGET_H
q3dsurfacewidget.cpp
#include "q3dsurfacewidget.h"
#include "ui_q3dsurfacewidget.h"
#include "QSplitter"#include <QDebug>
#include <QDateTime>Q3dSurfaceWidget::Q3dSurfaceWidget(QWidget *parent) :QMainWindow(parent),ui(new Ui::Q3dSurfaceWidget)
{ui->setupUi(this);this->setWindowTitle("UDP_Reciver");initControl();QSplitter *splitter = new QSplitter(Qt::Horizontal);splitter->addWidget(ui->widget);this->setCentralWidget(splitter);}Q3dSurfaceWidget::~Q3dSurfaceWidget()
{delete ui;
}void Q3dSurfaceWidget::initControl()
{m_3Dgraph = new Q3DScatter();ui->widget = QWidget::createWindowContainer(m_3Dgraph);proxy_Theory = new QScatterDataProxy(); //数据代理proxy_Actual = new QScatterDataProxy(); //数据代理m_Theory = new QScatter3DSeries(proxy_Theory);//创建序列m_Theory->setMeshSmooth(true);m_3Dgraph->addSeries(m_Theory);m_Actual = new QScatter3DSeries(proxy_Actual);//创建序列m_Actual->setMeshSmooth(true);m_3Dgraph->addSeries(m_Actual);//创建坐标轴m_3Dgraph->axisX()->setTitle("经度");m_3Dgraph->axisX()->setTitleVisible(true);m_3Dgraph->axisX()->setRange(0,100);m_3Dgraph->axisY()->setTitle("海拔");m_3Dgraph->axisY()->setTitleVisible(true);m_3Dgraph->axisY()->setRange(0,100);m_3Dgraph->axisZ()->setTitle("纬度");m_3Dgraph->axisZ()->setTitleVisible(true);m_3Dgraph->axisZ()->setRange(0,100);m_3Dgraph->activeTheme()->setLabelBackgroundEnabled(false);m_3Dgraph->activeTheme()->setBackgroundColor(QColor(90,90,90));//设置背景色m_Theory->setMesh(QAbstract3DSeries::MeshMinimal);//数据点为圆球m_Theory->setSingleHighlightColor(QColor(0,0,255));//设置点选中时的高亮颜色m_Theory->setBaseColor(QColor(0,255,255));//设置点的颜色m_Theory->setItemSize(0.05);//设置点的大小m_Actual->setMesh(QAbstract3DSeries::MeshMinimal);//数据点为圆球m_Actual->setSingleHighlightColor(QColor(0,0,0));//设置点选中时的高亮颜色m_Actual->setBaseColor(QColor(255,0,255));//设置点的颜色m_Actual->setItemSize(0.05);//设置点的大小}void Q3dSurfaceWidget::drawPoint(QString linename,QVector<QVector3D> points)
{if (points.isEmpty()) return; // 如果点集合为空,直接返回// 计算所有点的最小值和最大值float minX = points[0].x(), minY = points[0].y(), minZ = points[0].z();float maxX = points[0].x(), maxY = points[0].y(), maxZ = points[0].z();for (const auto &point : points) {minX = qMin(minX, point.x());minY = qMin(minY, point.y());minZ = qMin(minZ, point.z());maxX = qMax(maxX, point.x());maxY = qMax(maxY, point.y());maxZ = qMax(maxZ, point.z());}// 动态调整坐标轴范围m_3Dgraph->axisX()->setRange(minX - 1, maxX + 1);m_3Dgraph->axisY()->setRange(minY - 1, maxY + 1);m_3Dgraph->axisZ()->setRange(minZ - 1, maxZ + 1);if(linename == "理论"){QScatterDataArray *dataArray = new QScatterDataArray();dataArray->resize(points.count());QScatterDataItem *ptrToDataArray = &dataArray->first();for (int i = 0;i < points.count();i++ ){ptrToDataArray->setPosition(points[i]);ptrToDataArray++;}m_Theory->dataProxy()->resetArray(dataArray);//更新散点}if(linename == "实际"){QScatterDataArray *dataArray = new QScatterDataArray();dataArray->resize(points.count());QScatterDataItem *ptrToDataArray = &dataArray->first();for (int i = 0;i < points.count();i++ ){ptrToDataArray->setPosition(points[i]);ptrToDataArray++;}m_Actual->dataProxy()->resetArray(dataArray);//更新散点}
}
使用示例
Q3dSurfaceWidget *m_track = nullptr;//初始化航迹图并插入
m_track = new Q3dSurfaceWidget();
ui->tabWidget->insertTab(1, m_track, "3D Track"); // 在第二个位置(索引为1)插入标签页//我这边用定时器每十毫秒加个点,也能用for
//初始化时钟
if(timer_show == nullptr)
{timer_show = new QTimer();//开始跑connect(timer_show, &QTimer::timeout, [=]() {if(i < m_data.length() -1){if(isTheory == 1){ m_points_2.append(QVector3D(m_data.at(i).TargetLongitude,m_data.at(i).TargetAltitude,m_data.at(i).TargetLatitude));m_track->drawPoint("理论",m_points_2);}if(isActual == 1){m_points.append(QVector3D(m_data.at(i).Longitude,m_data.at(i).Altitude,m_data.at(i).Latitude));m_track->drawPoint("实际",m_points);}i++;}
});timer_show->start(10);
}
计算经纬高两个点之间的距离
//计算经纬高距离
//Haversine公式 然后当成三角形计算斜边
QVector<datacsv> m_data;
struct datacsv
{//时间戳QString TimeStamp;//经度double Longitude;//纬度double Latitude;//海拔double Altitude;//目标经度double TargetLongitude;//目标纬度double TargetLatitude;//目标海拔double TargetAltitude;
};
double a = pow(sin((m_data.at(i).Latitude - m_data.at(i).TargetLatitude) / 100000 / 2 * 3.1415926535 / 180) ,2) + cos(m_data.at(i).Latitude / 100000 * 3.1415926535 / 180) * cos(m_data.at(i).TargetLatitude / 100000 * 3.1415926535 / 180) * pow(sin((m_data.at(i).Longitude - m_data.at(i).TargetLongitude) / 100000 / 2 * 3.1415926535 / 180) ,2);
double d = 2 * m_R * atan(sqrt(a / (1 - a)));
double d_2 = abs(m_data.at(i).Altitude - m_data.at(i).TargetAltitude);
double result = sqrt(d * d + d_2 * d_2);
//restlt就是最后结果
相关文章:
qt 3d航迹图
一般就是三种方法 1.opengl,vtk这种从零自己画,网上也可能有半成品,大多是付费的。 2.重写qwt3d,07年就停止更新了,画出来类似opengl,需要自己修改参数,参数修改不对很难搞,对于经…...
探索排序算法的奥秘(上):冒泡排序、选择排序、插入排序
在计算机科学中,排序算法是数据处理的基础工具之一。通过对数据进行有序排列,可以极大地提高数据检索和处理的效率。本文将详细介绍三种经典的排序算法:冒泡排序、选择排序和插入排序。我们将从算法思想、原理、代码实现(C语言、P…...
Stable Diffusion 技术全景解析与行业竞争力分析
目录 一、Stable Diffusion 技术概览 1. 核心背景 2. 技术架构 二、行业地位与竞品对比 1. 市场定位 2. 核心竞争优势 三、部署成本与硬件要求 1. 硬件配置方案 2. 优化技巧 四、优势与劣势分析 1. 核心优势 2. 主要劣势 五、开源策略与商业模型 1. 开源协议 2. …...
基于Python的DeepSeek API图形界面开发
基于Python的DeepSeek API图形界面开发 在人工智能技术广泛应用的今天,如何将强大的API能力与用户友好的界面结合,成为开发者关注的重点。本文将以DeepSeek API为例,详解如何通过Python构建兼具功能性与美观度的GUI应用程序。 一、技术架构…...
w~嵌入式C语言~合集4
我自己的原文哦~ https://blog.51cto.com/whaosoft/13870376 一、STM32怎么选型 什么是 STM32 STM32,从字面上来理解,ST是意法半导体,M是Microelectronics的缩写,32表示32位,合起来理解,STM32就是指S…...
自动驾驶(ADAS)领域常用数据集介绍
1. KITTI 数据集 简介:由德国卡尔斯鲁厄理工学院与丰田研究院联合创建,是自动驾驶领域最经典的评测基准,涵盖立体视觉、光流、3D检测等任务。包含市区、乡村和高速公路场景的真实数据,标注对象包括车辆、行人等,支持多…...
【嵌入式八股23】Linux关键指令
系统关机命令 在 Linux 系统中,有多种命令可用于实现系统关机或重启操作,以下为你详细介绍各命令及其特点: 指令 说明 shutdown该命令能够安全地将系统关机。它允许用户指定关机的时间,还可以在关机前向所有登录用户发送警告消息。例如,shutdown -h now 可立即关机,shu…...
机器学习的一百个概念(13)布里尔分数
前言 本文隶属于专栏《机器学习的一百个概念》,该专栏为笔者原创,引用请注明来源,不足和错误之处请在评论区帮忙指出,谢谢! 本专栏目录结构和参考文献请见[《机器学习的一百个概念》 ima 知识库 知识库广场搜索: 知识库创建人机器学习@Shockang机器学习数学基础@Shocka…...
AI提示词(Prompt)终极指南:从入门到精通(附实战案例)
在AI重塑工作方式的今天,掌握Prompt工程已成为智能时代的必备技能。本指南系统解析提示词设计精髓,从认知底层逻辑到实战应用技巧,带您解锁AI工具的完整潜能。涵盖主流模型选型策略、三大黄金法则、结构化模板及典型避坑指南,更有…...
鸿蒙版电影app设计开发
鸿蒙电影购票APP项目介绍 一、项目概述及使用方式 (一)项目概述 在智能手机与移动互联网蓬勃发展的当下,移动设备已成为人们生活不可或缺的一部分,而电影购票这一日常娱乐消费行为也日益向移动端迁徙。鸿蒙系统作为新兴力量&…...
如何启动jar包隐藏cmd窗口
要启动一个JAR文件并隐藏命令行窗口(cmd),你可以使用不同的方法,具体取决于你的操作系统。以下是几种常见的方法: 在Windows中使用批处理文件 你可以创建一个批处理文件(.bat文件),…...
【Redis】基础3:一些应用场景
文章目录 1. session管理1.1 手机号登录流程1.2 session的数据结构设计1.2.1 一些概念1.2.2 session数据结构例子 1.3 引入redis来实现共享session1.3.1 流程发送验证码短信的流程验证码登录流程登录检查流程 1.3.2 要考虑的问题 2. 限时抢购代金券2.1 业务流程2.2 代金券表设计…...
【创新实训个人博客】multi-agent调研(2)
下面的部分我们将简单介绍现有的三个multi-agent框架,并对它们进行简单的比较 multi-agent框架分析 MetaGPT 相关资料 代码repo:https://github.com/geekan/MetaGPT论文:https://arxiv.org/pdf/2308.0035 AgentVerse 相关资料 代码repo&…...
对鸿蒙 Next 系统“成熟论”的深度剖析-优雅草卓伊凡
对鸿蒙 Next 系统“成熟论”的深度剖析-优雅草卓伊凡 在科技飞速发展的当下,鸿蒙 Next 系统无疑成为了众多科技爱好者与行业人士关注的焦点。今日,卓伊凡便收到这样一个饶有趣味的问题:鸿蒙 Next 系统究竟需要多长时间才能完全成熟ÿ…...
模方ModelFun瓦片数据操作教程
摘要:本文主要介绍模方ModelFun瓦片数据操作,包含:打开/关闭瓦片数据,备份和恢复,导出 OBJ/ OSGB,导出DOM/DSM。 1.打开/关闭瓦片数据 在“总体模型视图/OSGB”里对 tiles 进行操作:选择&…...
RabbitMQ应用(基于腾讯云)
1.防火墙配置 关于RabbitMQ的远程,主要有4个端口需要开通【入站规则】,分别是: 端口 5672:这是 RabbitMQ 的默认 AMQP(Advanced Message Queuing Protocol)端口,用于客户端与 RabbitMQ 服务器之…...
堆和二叉树的概念和操作
目录 1.树的概念 1.1数的表示 1.2二叉树 1.3特殊的二叉树 1.3.1满二叉树 1.3.2完全二叉树 1.3.3 二叉树存储结构 2.堆 2.1堆的实现 初始化和销毁 堆的插入 堆的向上调整算法编辑 编辑 堆的删除 出堆顶 1.树的概念 树是非线性的数据结构,有限节点具有的层…...
互联网大厂Java面试实录:从Spring Boot到微服务架构的技术问答
互联网大厂Java面试实录:从Spring Boot到微服务架构的技术问答 在某互联网大厂的面试现场,严肃的面试官开始了对求职者谢飞机的技术考核。此次面试围绕Java技术栈的应用与场景展开。 第一轮:基础架构与语言 面试官: 请你用简单…...
Rollup、Webpack、Esbuild 和 Vite 前端打包工具
Rollup、Webpack、Esbuild 和 Vite 都是前端开发中常用的打包工具,它们各有特点,以下是对它们的详细对比: 核心功能 Rollup:专注于 JavaScript 模块打包,擅长将小的 JavaScript 模块打包成一个或多个文件,…...
刀客独家 | 潘胜接管百度移动生态市场部
一、 据刀客doc向独家信源确认,百度移动生态事业群(MEG)市场部日前完成重要人事调整:潘胜已经接任市场负责人。 此前,根据雷锋网3月底的报道,百度云渠道生态总经理陈之若离职,原移动生态事业群…...
如何在Chrome浏览器中启用硬件加速【提升浏览器性能】
在使用谷歌浏览器时,硬件加速是提升性能的一个重要功能。它可以将一些计算任务从CPU转移到GPU,从而加速图像处理、视频播放等任务。如果您希望提升浏览器的运行速度,可以通过以下简单步骤启用硬件加速。 1. 打开Chrome浏览器设置 首先&#…...
部署mongodb三幅本集群
背景:原先使用的mongodb采用的是SSPL协议,此协议客户检测到有bug,故需要替换mongodb的版本,原先采用helm部署的mongodb但是无法找到4.1.4版本的chart包,故手写yaml部署 1、部署mongodb-arbiter服务 这个服务是用来选…...
JavaScript 解构赋值(下):对象解构与高级应用
对象解构赋值 基本语法 const person { name: Alice, age: 30 }; const { name, age } person;console.log(name); // Alice console.log(age); // 30别名 const { name: fullName, age: years } person; console.log(fullName); // Alice console.log(years); // 30…...
批量级负载均衡(Batch-Wise Load Balance)和顺序级负载均衡(Sequence-Wise Load Balance)
本文主要比较了批量级负载均衡(Batch-Wise Load Balance)和顺序级负载均衡(Sequence-Wise Load Balance)在 Mixture-of-Experts(MoE)模型训练中的核心区别 。批量级负载均衡通过对整个训练批次的专家负载进行平衡约束,实现了更灵活的均衡策略,有助于专家在不同领域的专…...
什么是EI期刊?EI目录列表如何看?一文查看最新目录+避坑指南
近期有很多人在后台问小编关于EI期刊的各种问题,且前段时间EI期刊目录刚刚更新,小编正好借此,这期仔细给大家介绍一下。 什么是EI期刊? EI期刊也称为工程索引期刊,是供查阅工程技术领域文献的综合性情报检索刊物。每年…...
[创业之路-341]:华为人力资源管理 - 华为技术专家体系详解
华为技术专家体系详解 一、技术专家等级划分 华为技术专家体系以 “专业能力管理贡献” 为双维度,覆盖 19级(技术专家B)至22级(集团核心领导者),其中 19B-20A级 为核心技术专家层级: 19B级&a…...
【HarmonyOS 5】鸿蒙检测系统完整性
【HarmonyOS 5】鸿蒙检测系统完整性 一、前言 从现实安全威胁来看,设备系统完整性风险已影响至移动应用的各个场景。不少用户因使用越狱设备(Jailbreak)或非真实设备(Emulator),导致应用安全防护机制失效…...
量子网络:构建未来通信的超高速“高速公路”
在当今数字化时代,通信技术的飞速发展极大地推动了全球信息的流动和共享。然而,随着数据量的爆炸式增长和对信息安全需求的不断提高,传统通信网络正面临着前所未有的挑战。量子网络作为一种新兴的通信技术,以其超高速传输和绝对安…...
安卓触摸事件分发机制分析
1. 前言 🎯 一句话总结: 触摸事件(TouchEvent)会从 Activity 层开始,按从外到内的方式传递给每一个 ViewGroup/View,直到某个 View 消费(consume) 它,事件传递就会停止…...
Servlet (简单的servlet的hello world程序)
Servlet servlet在20年前左右,是网站开发的一种主力技术. 现在随着时间的推移,Java这个圈子中,逐渐使用spring代替了servlet.现在讲servlet,目的有两个方面. 1.spring作为一个框架.底层仍然是需要调用servlet里的一些api的,包括熟悉servlet有助于理解spring工作原理.包括spr…...
解析 OpenHarmony、HarmonyOS 与 HarmonyOS Next:优雅草卓伊凡的观点
解析 OpenHarmony、HarmonyOS 与 HarmonyOS Next:优雅草卓伊凡的观点 在科技领域,围绕操作系统的讨论从未停歇,其中 OpenHarmony、HarmonyOS 及其后续版本 HarmonyOS Next 备受瞩目。优雅草的卓伊凡对此有着深入见解,在此为大家详…...
Redis03-基础-C#客户端
零、文章目录 Redis03-基础-C#客户端 1、安装NuGet包 dotnet add package Newtonsoft.Json -v 13.0.3 dotnet add package StackExchange.Redis -v 2.8.242、操作帮助类实现 /*** 主题:Redis帮助类 功能:1、设置连接字符串、选择数据库2、String操作…...
JimuBI 积木报表 v1.9.5发布,大屏和仪表盘,免费数据可视化
项目介绍 JimuBI (积木报表BI) 是一款免费的数据可视化产品,含大屏和仪表盘、门户、移动图表,像搭建积木一样完全在线设计! 大屏采用类word风格,可以随意拖动组件,想怎么设计怎么设计,可以像百度和阿里一样…...
有关爬虫中数据库的封装——单线程爬虫
在编写爬虫程序时,数据存储是一个非常重要的环节。尤其是在单线程爬虫中,虽然并发量不大,但如果每次操作数据库都直接连接、查询、关闭,不仅代码臃肿,还容易出错,甚至影响爬虫的稳定性。 因此,…...
React19 useOptimistic 用法
用法 乐观更新 发起异步请求时,先假设请求会成功立即更新 UI 给用户反馈若请求最终失败,再将 UI 恢复到之前的状态 const [optimisticState, addOptimistic] useOptimistic(state, updateFn) 参数 state:实际值,可以是 useSta…...
简单的 shell 程序
整体思路 一个简单的 shell 程序的工作流程如下: 初始化环境:在启动时从系统获取环境变量。循环等待用户输入:不断输出命令行提示符,等待用户输入命令。解析命令:把用户输入的命令解析成可执行的格式。执行命令&…...
MIT XV6 - 1.1 Lab: Xv6 and Unix utilities - sleep
接上文 MIT XV6 - 1. 环境准备 实验正文 打开实验链接 Lab: Xv6 and Unix utilities ,可以看到他一共有6个小实验(头大,让我们争取日拱一卒吧…): Boot xv6 (easy)sleep (easy)pingpong (easy)primes (moderate)/(hard)find (moderate)xargs (moderate…...
测地型GNSS接收机_毫米高精度精准定位
在建筑安全、地灾监测、大坝桥梁隧道监测、工程测绘、国土规划等专业领域,传统工具效率低、精度差、环境适应性弱的痛点长期存在。计讯物联测地型GNSS接收机以毫米级精度、全场景适应、智能互联为核心优势,重新定义高精度空间数据采集标准&#…...
React19源码系列之 root.render过程
在创建react项目的时候,入口文件总是有这样一行代码 root.render(<App />) 所以 root.render() 执行是怎样的? 下面就来看看。 之前的文章就提及,root是一个 ReactDOMRoot 对象,其原型链上有 render 和 unmount 方法。 ReactDOMHy…...
0804标星_复制_删除-网络ajax请求2-react-仿低代码平台项目
文章目录 1 标星2 复制3 假删除4 恢复5 彻底删除结语 1 标星 操作:标星和取消标星,有2种状态的布尔值。通过更新问卷功能实现。 后端quetion.js添加接口 {// 更新问卷信息url: /api/question/:id,method: patch,response() {return {errno: 0}}},前端q…...
二叉树遍历(C语言版)
前序遍历创建树,中序遍历把创建出来的二叉树的结点打印出来 题目链接:牛客网-二叉树遍历 前序遍历创建树的思想: 把每个结点看作是子树的根节点,以根左右的顺序创建一整棵二叉树 1.空 返回空 2.非空 先是malloc一个结点ÿ…...
OceanBase数据库-学习笔记2-C#/C++程序如何访问
MySQL模式下,程序(C#)连接数据库操作demo SqlSugar public class MainModel {private static readonly ConnectionConfig connectionConfig new ConnectionConfig(){ConnectionString "serverxxx.xxx.xxx.xxx;port2881;user idroot;…...
Python中的Walrus运算符分析
Python中的Walrus运算符(:)是Python 3.8引入的一个新特性,允许在表达式中同时赋值和返回值。它的核心作用是减少重复计算,提升代码简洁性。以下是其适用的典型场景及示例: 1. 在循环中避免重复计算 当循环条件需要多次…...
【深度好文】4、Milvus 存储设计深度解析
引言 作为一款主流的云原生向量数据库,Milvus 通过其独特的存储架构设计来保证高效的查询性能。本文将深入剖析 Milvus 的核心存储机制,特别是其最小存储单元 Segment 的完整生命周期,包括数据写入、持久化、合并以及索引构建等关键环节。 …...
航顺 芯片 开发记录 (一) 2025年4月27日19:23:32
芯片型号: HK32F030MF4P6 第一步:创建工程目录 inc :头文件目录 MDK-ARM : 工程根目录 (新建工程选择该目录) src :相关资源存放位置 官方函数库相关内容 官方函数库大致结构图 ├─HK32F030MLib ├─CMSIS │ ├─CM0 │ │ └─Core │ │ arm_common_table…...
Java 设计模式
Java后端常用设计模式总览表 模式核心思想Spring / Spring Boot应用手写实现核心单例模式 (Singleton)一个类只有一个实例,提供全局访问点Spring容器中的默认Bean都是单例管理volatile synchronized 双重检查锁定,懒加载单例工厂模式 (Factory)统一管理…...
Milvus如何实现关键词过滤和向量检索的混合检索
Milvus 可以实现关键词过滤和向量检索的混合检索,具体来说,可以结合向量搜索与其他属性字段(如关键词、类别标签等)进行联合查询。这样,在检索时不仅考虑向量的相似度,还能根据特定的关键词或标签等条件对数据进行筛选,从而提高检索的精度和灵活性。 1. 理解混合检索的…...
基于Qt5的蓝牙打印开发实战:从扫描到小票打印的全流程
文章目录 前言一、应用案例演示二、开发环境搭建2.1 硬件准备2.2 软件配置 三、蓝牙通信原理剖析3.1 实现原理3.2 通信流程3.3 流程详解3.4 关键技术点 四、Qt蓝牙核心类深度解析4.1 QBluetoothDeviceDiscoveryAgent4.2 QBluetoothDeviceInfo4.3 QBluetoothSocket 五、功能实现…...
Linux日志处理命令多管道实战应用
全文目录 1 日志处理1.1 实时日志分析1.1.1 nginx日志配置1.1.2 nginx日志示例1.1.3 日志分析示例 1.2 多文件合并分析1.3 时间范围日志提取 2 问题追查2.1 进程级问题定位2.2 网络连接排查2.3 硬件故障追踪 3 数据统计3.1 磁盘空间预警3.2 进程资源消耗排名3.3 HTTP状态码统计…...
Node.js CSRF 保护指南:示例及启用方法
解释 CSRF 跨站请求伪造 (CSRF/XSRF) 是一种利用用户权限劫持会话的攻击。这种攻击策略允许攻击者通过诱骗用户以攻击者的名义提交恶意请求,从而绕过我们的安全措施。 CSRF 攻击之所以可能发生,是因为两个原因。首先,CSRF 攻击利用了用户无法辨别看似合法的 HTML 元素是否…...