Qt 5.15.2 三维显示功能

news2024/11/28 16:37:22

Qt 5.15.2 三维显示功能

三维显示效果:
在这里插入图片描述

.pro项目文件

QT       += core gui opengl 3dcore 3drender 3dinput 3dextras

greaterThan(QT_MAJOR_VERSION, 4): QT += widgets

CONFIG += c++17

# You can make your code fail to compile if it uses deprecated APIs.
# In order to do so, uncomment the following line.
#DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000    # disables all the APIs deprecated before Qt 6.0.0

SOURCES += \
    dialog_fbx2glb.cpp \
    dialog_osgb_to_b3dm.cpp \
    main.cpp \
    mainwindow.cpp \
    scene.cpp

HEADERS += \
    dialog_fbx2glb.h \
    dialog_osgb_to_b3dm.h \
    mainwindow.h \
    scene.h

FORMS += \
    dialog_fbx2glb.ui \
    dialog_osgb_to_b3dm.ui \
    mainwindow.ui

# Default rules for deployment.
qnx: target.path = /tmp/$${TARGET}/bin
else: unix:!android: target.path = /opt/$${TARGET}/bin
!isEmpty(target.path): INSTALLS += target

DISTFILES += \
    images/211.ico \
    images/Clear2.ico \
    images/File.ico \
    images/Open.ico \
    images/opendir.png \
    images/openfile.png

Scene.h

#ifndef SCENE_H
#define SCENE_H

#include <QObject>
#include <QWidget>

#include <Qt3DCore/QEntity>
#include <Qt3DRender/QMesh>
#include <Qt3DRender/QCamera>
#include <Qt3DRender/QPointLight>
#include <Qt3DRender/QDirectionalLight>
#include <Qt3DCore/QTransform>
#include <Qt3DWindow>
#include <QOrbitCameraController>
#include <QFirstPersonCameraController>

#include <Qt3DExtras/QForwardRenderer>
#include <Qt3DExtras/QPhongMaterial>
#include <Qt3DExtras/QTorusMesh>
#include <Qt3DExtras/QSphereMesh>

#include <QKeyEvent>
#include <QTransform>
#include <QComponent>
#include <QQuaternion>
#include <QInputAspect>


class Scene : public QObject
{
    Q_OBJECT
public:
    Qt3DCore::QEntity *rootEntity;
    Qt3DCore::QEntity *model;
    Qt3DCore::QTransform *transform;
    Qt3DRender::QDirectionalLight *light;
    //
    explicit Scene(Qt3DExtras::Qt3DWindow *, QObject *parent=nullptr);
    void SetupMesh(Qt3DRender::QMesh *mesh);
    void StartScene();
    void Camera(Qt3DExtras::Qt3DWindow *view);
    void setCameraCenterPoint(QVector3D center);
    Qt3DCore::QEntity* findChildQEntity(QString objName,Qt3DCore::QEntity* rootEnt);
    QVector3D computCenterPoint(Qt3DCore::QEntity* first);


    void initOrbitCameraController(Qt3DCore::QEntity *ent);
    void initFirstPersonCameraController(Qt3DCore::QEntity *ent);

    void init3d(Qt3DExtras::Qt3DWindow *view);
    void NewScene(Qt3DRender::QMesh *);
    void NewScene2(Qt3DRender::QMesh *mesh);
    void SetupTransformRoot(Qt3DCore::QEntity* model);
    void SetupTransform(Qt3DCore::QEntity* modelPrivate);
    void SetupMaterial(Qt3DCore::QEntity* model);
    void SetupLighting();
    //添加新实体
    Qt3DCore::QEntity* addMeshEntity(Qt3DRender::QMesh *mesh);
    Qt3DCore::QEntity* addEntity(Qt3DCore::QComponent *comp);
    //
    Qt3DCore::QEntity* addNewEntity();
    //
    void KeyControls(QKeyEvent *event);
    void wheelControls(QWheelEvent *event);
    void mouseControls(QMouseEvent *event);
    void mousePressControls(QMouseEvent *event);
    void paintALL();



public slots:
    void LightXChanged(int angle);
    void LightYChanged(int angle);
    void LightZChanged(int angle);

private:
    Qt3DExtras::Qt3DWindow *view;
    unsigned int backgroudColor=0x42f4bc;    //0xffffff;  0x42f4bc
    //
    QPoint m_qpRotPosOld;
    int m_iScloe; //滚动放大缩小尺寸

    //旋转
    double m_dRotX;
    double m_dRotY;
    double m_dRotZ;

    //位移
    double m_dMoveX;
    double m_dMoveY;
    double m_dMoveZ;
    //


};

#endif // SCENE_H

scene.cpp

#include "scene.h"
#include <cmath>

Scene::Scene(Qt3DExtras::Qt3DWindow *view, QObject *parent) : QObject (parent)
{
    this->view=view;
    rootEntity = new Qt3DCore::QEntity();
    SetupTransformRoot(rootEntity);
    //
    view->setRootEntity(rootEntity);
    view->defaultFrameGraph()->setClearColor(QColor(QRgb(this->backgroudColor)));   //0x42f4bc
    Camera(view);
    StartScene();
    //
    this->initOrbitCameraController(rootEntity);
    //this->initFirstPersonCameraController();
}

void Scene::Camera(Qt3DExtras::Qt3DWindow *view)
{
    //其中camera是新建的camera实体,lens表示了镜头,这个函数有着四个参数,
    //第一个参数是视觉域,   45.0f
    //第二个是分辨率(这里选择了16比9),  16.0f/9.0f
    //第三个参数是近面摆放位置,   0.1f
    //最后一个是远面放置位置,    3000.0f
    //后两个参数的选择当中要特别注意,只有在远近面之间的物体才会显示,所以要是想全部显示出所加入的实体,
    //那么近面就要足够近,远面就要足够远。
    // Camera
    //Qt3DRender::QCamera *cameraEntity = view->camera();
    Qt3DRender::QCamera *camera = view->camera();
    camera->lens()->setPerspectiveProjection(45.0f,16.0f/9.0f, 0.1f, 3000.0f);   //近面板0.1f,远面板1000.0f
    camera->setViewCenter(QVector3D(-789, -2343, 10));    //0, 0, 0
    camera->setPosition(QVector3D(-789, -2343, 200));   //0,0,40  -200  5000  相机高度

    Qt3DInput::QInputAspect *input = new Qt3DInput::QInputAspect();
    view->registerAspect(input);
    //input->setCamera(cameraEntity);//使摄像机能左右转动
}

void Scene::setCameraCenterPoint(QVector3D center)
{
    Qt3DRender::QCamera *camera = view->camera();
    camera->lens()->setPerspectiveProjection(45.0f,16.0f/9.0f, 0.1f, 3000.0f);   //近面板0.1f,远面板1000.0f
    camera->setViewCenter(QVector3D(center.x()*1.5, center.y()*1.5, abs(center.z())));    //0, 0, 0
    camera->setPosition(QVector3D(center.x()*1.5, center.y()*1.5, abs(center.z())*1.5+50));   //0,0,40  -200  5000  相机高度
    qDebug()<<"camera point="<<camera->position();
    //
    Qt3DInput::QInputAspect *input = new Qt3DInput::QInputAspect();
    view->registerAspect(input);
}

Qt3DCore::QEntity* Scene::findChildQEntity(QString objName,Qt3DCore::QEntity* rootEnt)
{
    for (Qt3DCore::QNode* childNode : rootEnt->childNodes())
    {
        QString itemName="";
        Qt3DCore::QEntity* testObj=dynamic_cast<Qt3DCore::QEntity*>(childNode);
        if(testObj)
        {
            itemName=testObj->objectName();
            if(objName==itemName)
            {
                return testObj;
            }
        }
    }
    return nullptr;
}

QVector3D Scene::computCenterPoint(Qt3DCore::QEntity* first)
{
    QVector3D center(0, 0, 0);
    if(first!=nullptr)
    {
        // Now iterate over all the components and calculate the center point
        int totalSize=0;
        //
        for (Qt3DCore::QNode* childNode : first->childNodes())
        {
            Qt3DCore::QTransform* tranobj=dynamic_cast<Qt3DCore::QTransform*>(childNode);
            if(tranobj)
            {
                center += tranobj->translation();
                totalSize+=1;
            }
            Qt3DRender::QMesh* meshobj=dynamic_cast<Qt3DRender::QMesh*>(childNode);
            if(meshobj)
            {
                center += meshobj->geometry()->minExtent();
                center += meshobj->geometry()->maxExtent();
                totalSize+=2;
            }
        }
        //
        center /= totalSize; // compute the center point
        //定位相机
        //scene->setCameraCenterPoint(center);
        //
    }
    return center;
}


void Scene::init3d(Qt3DExtras::Qt3DWindow *view)
{
    delete model;
    //
    view->defaultFrameGraph()->setClearColor(QColor(QRgb(this->backgroudColor)));
    Camera(view);
    this->StartScene();
}

void Scene::StartScene()
{
    model = new Qt3DCore::QEntity(rootEntity);
    model->setObjectName("救生圈场景模型");

    //救生圈场景 模型   这个尺寸大小影响显示
    Qt3DExtras::QTorusMesh *torusMesh = new Qt3DExtras::QTorusMesh(model);
    torusMesh->setRadius(5);
    torusMesh->setMinorRadius(1);
    torusMesh->setRings(100);
    torusMesh->setSlices(20);
    model->addComponent(torusMesh);
    /*
    Qt3DExtras::QSphereMesh *sphereMesh = new Qt3DExtras::QSphereMesh(model);
    sphereMesh->setRadius(5);
    model->addComponent(sphereMesh);


    QString filename="C:/data/obj/Tile_+005_+006_OBJ/Tile_+005_+006/Tile_+005_+006.obj";
    //filename="D:\\data\\data3d\fbx\\HCZ.fbx";
    Qt3DRender::QMesh *mesh = new Qt3DRender::QMesh(model);
    mesh->setSource(QUrl::fromLocalFile(filename));
    mesh->setMeshName("objMesh");
    //mesh->setSource(QUrl("qrc:/data/obj/Tile_+005_+006_OBJ/Tile_+005_+006/Tile_+005_+006.obj"));
    //mesh->setSource(QUrl(filename));   //file:///
    model->addComponent(mesh);*/
    //
    SetupTransform(model);
    SetupMaterial(model);
    SetupLighting();

}

void Scene::NewScene(Qt3DRender::QMesh *mesh)
{
    delete model;
    model = new Qt3DCore::QEntity(rootEntity);

    SetupMesh(mesh);
    SetupTransform(model);
    SetupMaterial(model);
    SetupLighting();
}
void Scene::NewScene2(Qt3DRender::QMesh *mesh)
{
    delete model;
    model = new Qt3DCore::QEntity(rootEntity);

    SetupMesh(mesh);
    SetupTransform(model);
    SetupMaterial(model);
    SetupLighting();
}
Qt3DCore::QEntity* Scene::addMeshEntity(Qt3DRender::QMesh *mesh)
{
    Qt3DCore::QEntity* newEnt = new Qt3DCore::QEntity(rootEntity);
    newEnt->addComponent(mesh);
    return newEnt;
}

Qt3DCore::QEntity* Scene::addEntity(Qt3DCore::QComponent *comp)
{
    Qt3DCore::QEntity* newEnt = new Qt3DCore::QEntity(rootEntity);
    newEnt->addComponent(comp);
    return newEnt;
}

Qt3DCore::QEntity* Scene::addNewEntity()
{
    return new Qt3DCore::QEntity(rootEntity);
}

void Scene::SetupMesh(Qt3DRender::QMesh *mesh)
{
    model->addComponent(mesh);
}

void Scene::SetupTransformRoot(Qt3DCore::QEntity* model)
{
    transform = new Qt3DCore::QTransform(model);
    transform->setScale3D(QVector3D(1, 1, 1));
    transform->setRotation(QQuaternion::fromAxisAndAngle(QVector3D(1, 0, 0), 0));
    //transform->setRotation(QQuaternion::fromAxisAndAngle(QVector3D(0, 1, 0), 0));
    //transform->setScale(1.0f);
    //transform->setTranslation(QVector3D(-700.0f,-2100.0f,10.0f));

    model->addComponent(transform);
}
void Scene::SetupTransform(Qt3DCore::QEntity* modelPrivate)
{
    Qt3DCore::QTransform* tf = new Qt3DCore::QTransform(modelPrivate);
    tf->setScale3D(QVector3D(1, 1, 1));
    tf->setRotation(QQuaternion::fromAxisAndAngle(QVector3D(0, 0, 0), 0));
    //tf->setRotation(QQuaternion::fromAxisAndAngle(QVector3D(0, 1, 0), 0));
    //tf->setScale(1.0f);
    //tf->setTranslation(QVector3D(-700.0f,-2100.0f,10.0f));

    modelPrivate->addComponent(tf);
}

void Scene::SetupMaterial(Qt3DCore::QEntity* model)
{
    Qt3DRender::QMaterial *material = new Qt3DExtras::QPhongMaterial(model);
    model->addComponent(material);
}

void Scene::SetupLighting()
{
    Qt3DCore::QEntity *lightEntity = new Qt3DCore::QEntity(rootEntity);
    light = new Qt3DRender::QDirectionalLight(lightEntity);
    light->setColor("white");
    light->setIntensity(1);
    light->setWorldDirection(QVector3D(0,0,-1));

    lightEntity->addComponent(light);
}

//接管相机的鼠标操作 盘旋操作
void Scene::initOrbitCameraController(Qt3DCore::QEntity *ent)
{
    Qt3DExtras::QOrbitCameraController *controller = new Qt3DExtras::QOrbitCameraController(ent);
    controller->setCamera(view->camera());

}
//接管相机的鼠标操作  第一人操作
void Scene::initFirstPersonCameraController(Qt3DCore::QEntity *ent)
{
    Qt3DExtras::QFirstPersonCameraController *controller=new Qt3DExtras::QFirstPersonCameraController(ent);
    controller->setCamera(view->camera());
}

void Scene::paintALL()
{
    //对rootEntity 整体操作
    transform->setTranslation(QVector3D(m_dMoveX,m_dMoveY,m_iScloe));
    transform->setRotation(QQuaternion(sqrt(m_dRotX*m_dRotX+m_dRotY*m_dRotY),m_dRotX,m_dRotY,m_dRotZ));

}

//mouse wheel +/-  放大/缩小 功能
void Scene::wheelControls(QWheelEvent *event)
{
    float scale=2;
    if(event->angleDelta().x() >0 || event->angleDelta().y()>0){
        //放大
        //scale=1.1f;
        transform->setTranslation(QVector3D(transform->translation().x(),transform->translation().y(),transform->translation().z()+scale));
    }
    else
    {   //缩小
        //scale=0.9f;
        transform->setTranslation(QVector3D(transform->translation().x(),transform->translation().y(),transform->translation().z()-scale));
    }

    /*
    if (event->delta() < 0) {
        //m_iScloe--;
        m_iScloe=event->delta();
        this->paintALL();
    }
    else if (event->delta() > 0) {
        //m_iScloe++;
        m_iScloe=event->delta();
        this->paintALL();
    }*/

}

void Scene::mousePressControls(QMouseEvent *event)
{
    if(event->button()==Qt::LeftButton)
    {

    }
}

void Scene::mouseControls(QMouseEvent *event)
{
    QPoint pos = event->pos();

    //左键按下+move=>旋转
    if( event->buttons() & Qt::LeftButton)
    {

        if (pos.x()  > m_qpRotPosOld.x())
        {
            m_dRotX += 1;
        }
        else if(pos.x()  < m_qpRotPosOld.x())
        {
            m_dRotX -= 1;
        }
        if(pos.y()  > m_qpRotPosOld.y())
        {
            m_dRotY += 1;
        }
        else if(pos.y()  < m_qpRotPosOld.y())
        {
            m_dRotY -= 1;
        }
        //this->paintALL();
    }
    if( event->buttons() & Qt::RightButton)             //右键
    {   //右键按下+move=>移动
        if (pos.x()  > m_qpRotPosOld.x())
        {
            m_dMoveX += 1;
        }
        else if(pos.x()  < m_qpRotPosOld.x())
        {
            m_dMoveX -= 1;
        }
        if(pos.y()  > m_qpRotPosOld.y())
        {
            m_dMoveY -= 1;
        }
        else if(pos.y()  < m_qpRotPosOld.y())
        {
            m_dMoveY += 1;
        }
        //this->paintALL();
    }

    //rotate
    if(event->button() & Qt::RightButton)
    {   //mouse right press and moveing
        //if(event->type()==QEvent::MouseMove)
        {
            //event->MouseButtonPress
            int dy=pos.y()-m_qpRotPosOld.y();
            int dx=pos.x()-m_qpRotPosOld.x();
            if(dy>0){
                transform->setRotationY(transform->rotationY()+1);
            }
            else if(dy<0)
            {
                transform->setRotationY(transform->rotationY()-1);
            }
            //
            if(dx>0){
                transform->setRotationX(transform->rotationX()+1);
            }
            else if(dx<0)
            {
                transform->setRotationX(transform->rotationX()-1);
            }
        }
    }
    /**/
    //move
    if(event->button() & Qt::LeftButton)
    {   //mouse right press and moveing
        //if(event->type()==QEvent::MouseMove)
        {
            //event->MouseButtonPress
            int dy=pos.y()-m_qpRotPosOld.y();
            int dx=pos.x()-m_qpRotPosOld.x();
            if(dy>0){
                transform->setTranslation(QVector3D(transform->translation().x(),transform->translation().y()-2,transform->translation().z()));
            }
            else if(dy<0)
            {
                transform->setTranslation(QVector3D(transform->translation().x(),transform->translation().y()+2,transform->translation().z()));
            }
            if(dx>0){
                transform->setTranslation(QVector3D(transform->translation().x()-2,transform->translation().y(),transform->translation().z()));
            }
            else if(dx<0)
            {
                transform->setTranslation(QVector3D(transform->translation().x()+2,transform->translation().y(),transform->translation().z()));
            }
        }
    }
    //旋转显示窗口
    //glTranslatef(m_dMoveX, m_dMoveY, m_iScloe);
    //glRotatef(sqrt(m_dRotX*m_dRotX+m_dRotY*m_dRotY), m_dRotY,m_dRotX,m_dRotZ);
    m_qpRotPosOld = pos;
}

void Scene::KeyControls(QKeyEvent *event){
    if (event->modifiers().testFlag(Qt::ControlModifier)){
        //ctrl+方向键
        if(event->key()==Qt::Key_Up){
            transform->setRotationX(transform->rotationX()-6);
        }
        if(event->key()==Qt::Key_Down){
            transform->setRotationX(transform->rotationX()+6);
        }
        if(event->key()==Qt::Key_Left){
            transform->setRotationY(transform->rotationY()-6);
        }
        if(event->key()==Qt::Key_Right){
            transform->setRotationY(transform->rotationY()+6);
        }
    }else if (event->modifiers().testFlag(Qt::ShiftModifier)) {
        //shift+方向键 上/下
        if(event->key()==Qt::Key_Up){  //放大
            transform->setTranslation(QVector3D(transform->translation().x(),transform->translation().y(),transform->translation().z()-2));
        }
        if(event->key()==Qt::Key_Down){  //缩小
            transform->setTranslation(QVector3D(transform->translation().x(),transform->translation().y(),transform->translation().z()+2));
        }
    }else{
        //方向键  move
        if(event->key()==Qt::Key_Up){
            transform->setTranslation(QVector3D(transform->translation().x(),transform->translation().y()+1,transform->translation().z()));
        }
        if(event->key()==Qt::Key_Down){
            transform->setTranslation(QVector3D(transform->translation().x(),transform->translation().y()-1,transform->translation().z()));
        }
        if(event->key()==Qt::Key_Left){
            transform->setTranslation(QVector3D(transform->translation().x()-1,transform->translation().y(),transform->translation().z()));
        }
        if(event->key()==Qt::Key_Right){
            transform->setTranslation(QVector3D(transform->translation().x()+1,transform->translation().y(),transform->translation().z()));
        }
    }
}

void Scene::LightXChanged(int angle)
{
    light->setWorldDirection(QVector3D(angle,light->worldDirection().y(),light->worldDirection().z()));
}

void Scene::LightYChanged(int angle)
{
    light->setWorldDirection(QVector3D(light->worldDirection().x(),angle,light->worldDirection().z()));
}

void Scene::LightZChanged(int angle)
{
    light->setWorldDirection(QVector3D(light->worldDirection().x(),light->worldDirection().y(),angle));
}

本blog地址:https://blog.csdn.net/hsg77

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1295684.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

“我要报名”参观双十二外贸电商节,报名方式都在这!

双十二外贸电商节深圳进出口贸易博览会 2023年12月11-12日 深圳福田会展中心 近1万方展览面积 30000专业观众 跨境选品 外贸采购 行业趋势 人才对接 ▼▼▼▼ 展会时间 2023年12月11日-12日 展会地点 深圳福田会展中心 双十二外贸电商节暨2023深圳进出口贸易博览会选…

更多内窥镜维修技能学习与交流可关注西安彩虹

内窥镜结构及光学成像原理 众多品牌的硬镜其内部结构基本相似&#xff08;如下图&#xff09;&#xff0c;最关键的在于不同用途的硬镜在其结构上发生变化&#xff0c;包括光学成像系统和机械结构。光学成像系统由物镜系统、转像系统、目镜系统三大系统组成。 工作原理 被观察…

发布“最强”AI大模型,股价大涨,吊打GPT4的谷歌股票值得投资吗?

来源&#xff1a;猛兽财经 作者&#xff1a;猛兽财经 谷歌在AI领域的最新进展&#xff0c;引发投资者关注 在谷歌-C(GOOGL)谷歌-A&#xff08;GOOG&#xff09;昨日发布了最新的AI大模型Gemini后&#xff0c;其股价就出现了大幅上涨&#xff0c;更是引发了投资者的密切关注&a…

将输入的字符串反向输出(c语言)

#include<stdio.h> #include<string.h> int main() {int i, j, k;char s[50], temp;gets(s);//输入k strlen(s);//计算字符的长度//反向输出for (i 0, j k - 1;i < k / 2;i, j--){temp s[i];s[i] s[j];s[j] temp;}puts(s);//输出 }

Ubuntu22.04安装和卸载软件的命令行

一、安装 sudo apt install xxx 二、卸载 sudo apt remove xxx 三、卸载依赖包(可选) 第二步软件卸载之后&#xff0c;有一些依赖包没有被卸载。可以使用sudo apt autoremove xxx来卸载。如果不卸载应该也没什么影响

数据结构线性表-栈和队列的实现

1. 栈(Stack) 1.1 概念 栈&#xff1a;一种特殊的线性表&#xff0c;其只允许在固定的一端进行插入和删除元素操作。进行数据插入和删除操作的一端称为栈 顶&#xff0c;另一端称为栈底。栈中的数据元素遵守后进先出LIFO&#xff08;Last In First Out&#xff09;的原则。 …

周星驰 互联网3.0 团队下个月将上线独立 App

2023年12月7日&#xff0c;新浪科技报道指出&#xff0c;周星驰旗下的互联网3.0团队透露&#xff0c;Moonbox&#xff0c;这家周星驰创立的互联网3.0初创公司&#xff0c;计划在明年1月份完成Moonbox App的上线&#xff0c;届时该应用将免费向用户提供服务。 目前&#xff0c;…

进制 + 原码,反码,补码

进制转换 整数部分 小数部分 原码 反码 补码 原码转补码&#xff1a; 左边和右边第一个1不变&#xff0c;中间取反。-0 除外。 计算机系统中数值一律用补码来存储的原因 其他 术语 进制表 进制数的表示 详细教程可转 爱编程的大丙

GEE:不同方向的线性检测算子

作者:CSDN @ _养乐多_ 本文将介绍在 Google Earth Engine(GEE)平台上,使用不同方向的线性检测算子进行卷积操作的代码框架、核心函数和多种卷积核,比如 E-W、NE-SW、N-S、NW-SE 方向检测算子等。 结果如下图所示, 文章目录 一、定向检测算子二、完整代码三、代码链接一…

机器人纯阻抗控制接触刚性环境

问题描述 在机器人学中&#xff0c;阻抗控制是一种常用的控制策略&#xff0c;用于管理机器人在与环境交互时的运动和力。阻抗控制背后的关键概念是将环境视为导纳&#xff0c;而将机器人视为阻抗。 纯阻抗控制接触刚性环境时&#xff0c;机器人的行为方式主要受其阻抗参数的…

MeteoInfo-Java解析与绘图教程

MeteoInfo-Java解析与绘图教程(四) 上文我们说到,将地图叠加在色斑图上,但大部分都是卫星绘图,现在开始讲解micaps数据绘图,同样也是更多自定义 配置 首先我们解析micaps数据,将之前学到的东西拿过来绘图 MeteoDataInfo meteoDataInfo new MeteoDataInfo(); meteoDataInfo.o…

机器学习---集成学习的初步理解

1. 集成学习 集成学习(ensemble learning)是现在非常火爆的机器学习方法。它本身不是一个单独的机器学 习算法&#xff0c;而是通过构建并结合多个机器学习器来完成学习任务。也就是我们常说的“博采众长”。集 成学习可以用于分类问题集成&#xff0c;回归问题集成&#xff…

luceda ipkiss教程 43:画渐变圆弧型波导

案例分享&#xff1a; from si_fab import all as pdk import ipkiss3.all as i3 from ipcore.properties.restrictions import RestrictTuple from ipkiss.geometry.shapes.modifiers import __ShapePathBase__ import numpy as np from math import atan2class ShapePathTa…

spring boot整合mybatis进行部门管理管理的增删改查

部门列表查询&#xff1a; 功能实现&#xff1a; 需求&#xff1a;查询数据库表中的所有部门数据&#xff0c;展示在页面上。 准备工作&#xff1a; 准备数据库表dept&#xff08;部门表&#xff09;&#xff0c;实体类Dept。在项目中引入mybatis的起步依赖&#xff0c;mysql的…

【ArcGIS Pro微课1000例】0052:基于SQL Server创建企业级地理数据库案例

文章目录 环境搭建创建企业级数据库连接企业级数据库环境搭建 ArcGIS:ArcGIS Pro 3.0.1Server.ecp:版本为10.7SQL Server:版本为SQL Server Developer 2019创建企业级数据库 企业级地理数据库的创建需要通过工具箱来实现。工具位于:数据管理工具→地理数据库管理→创建企业…

20 套监控平台统一成 1 套 Flashcat,国泰君安监控选型提效之路

author:宋庆羽-国泰君安期货 运维工作最重要的就是维护系统的稳定性&#xff0c;其中监控是保证系统稳定性很重要的一环。通过监控可以了解系统的运行状态&#xff0c;及时发现问题和系统隐患&#xff0c;有助于一线人员快速解决问题&#xff0c;提高业务系统的可用时长。 作为…

C#网络编程(System.Net命名空间)

目录 一、System.Net命名空间 1.Dns类 &#xff08;1&#xff09;示例源码 &#xff08;2&#xff09;生成效果 2.IPAddress类 &#xff08;1&#xff09;示例源码 &#xff08;2&#xff09;生成效果 3.IPEndPoint类 &#xff08;1&#xff09; 示例源码 &#xff0…

中东电商指南分享!盘点中东四大跨境电商平台

提到跨境电商新蓝海&#xff0c;就不得不想起土豪聚集地 ——中东&#xff0c;中东地区拥有庞大的人口、高人均GDP、强大的消费能力以及广泛普及的互联网&#xff0c;但外出购物却相对不便&#xff0c;正是这一特点为中东跨境电商市场创造了巨大的优势。随着中东地区电商的崛起…

excel做预测的方法集合

一. LINEST函数 首先&#xff0c;一元线性回归的方程&#xff1a; y a bx 相应的&#xff0c;多元线性回归方程式&#xff1a; y a b1x1 b2x2 … bnxn 这里&#xff1a; y - 因变量即预测值x - 自变量a - 截距b - 斜率 LINEST的可以返回回归方程的 截距(a) 和 斜…

macOS Big Sur/Mac电脑安装vscode显示您没有权限来打开应用程序‘Visual Studio Code‘ 请联系您的电脑或网络管理员问题修复

错误方法 首先我以为我的权限不足。&#xff0c;需要去用户群组里设置。结果根本不是这个的问题。 1.在系统偏好设置->用户与群组检查了一下我的用户是不是管理员 结果发现是管理员 2.根据苹果提示&#xff0c;右键我的文件夹->显示简介->最下面的共享与权限 解锁&…