CloudCompare源码分析_显示渲染的程序架构

2023-05-16

这一讲介绍一下CloudCompare的大致绘制流程或者说绘图框架的结构。

根据前面一篇对CloudCompare读取PLY文件的介绍 ,很容易找出当cloudcompare读取到mesh文件(newGroup)后,会把这个文件通过addDB加载到根对象下面,

//ref. mainwindow.cpp
void MainWindow::addToDB(    const QStringList& filenames,
                            QString fileFilter/*=QString()*/,
                            ccGLWindow* destWin/*=nullptr*/)
{
    addToDB(newGroup, true, true, false);
    ....
}



void MainWindow::addToDB(    ccHObject* obj,
                            bool updateZoom/*=true*/,
                            bool autoExpandDBTree/*=true*/,
                            bool checkDimensions/*=true*/,
                            bool autoRedraw/*=true*/)
{
    ......
    //add object to DB root
    if (m_ccRoot)
    {
        //force a 'global zoom' if the DB was emtpy!
        if (!m_ccRoot->getRootEntity() || m_ccRoot->getRootEntity()->getChildrenNumber() == 0)
        {
            updateZoom = true;
        }
        m_ccRoot->addElement(obj, autoExpandDBTree);
    }
    ......
}

这个根对象,就是ccDBRoot,

//ref. ccDBRoot.h
//! GUI database tree root
class ccDBRoot : public QAbstractItemModel
{
    Q_OBJECT

    //! Associated DB root
    ccHObject* m_treeRoot;

    //! Associated widget for DB tree
    QTreeView* m_dbTreeWidget;

    //! Associated widget for selected entity's properties tree
    QTreeView* m_propertiesTreeWidget;

    //! Selected entity's properties data model
    QStandardItemModel* m_propertiesModel;
    //! Selected entity's properties delegate
    ccPropertiesTreeDelegate* m_ccPropDelegate;
......
}

其内部定义了一个ccHObject的指针,m_treeRoot,最终用来容纳子对像

void ccDBRoot::addElement(ccHObject* object, bool autoExpand/*=true*/)
{
    ......
    //look for object's parent
    ccHObject* parentObject = object->getParent();
    if (!parentObject)
    {
        //if the object has no parent, it will be inserted at tree root
        parentObject = m_treeRoot;
        m_treeRoot->addChild(object);
    }

    ......
}

当然,这些都不是重点。重点是:CloudCompare是如何完成3D渲染的,相关的OpenGL函数,或者是Qt的OpenGL相关函数又封装在哪里?

下面我们慢慢来看。

相关的OpenGL函数在哪里?

OpenGL扩展函数

首先我们来看OpenGLExtensions,这些函数也就是OpenGL的扩展函数。

比如我的目录是这样的,

C:\Qt\qt5\5.15.0\msvc2019_64\include\QtOpenGLExtensions\qopenglextensions.h

在这个头文件中,不同的类封装了大量的OpenGL函数,例如,

class QOpenGLExtension_ARB_framebuffer_object : public QAbstractOpenGLExtension
{
public:
    QOpenGLExtension_ARB_framebuffer_object();

    bool initializeOpenGLFunctions() final;

    void glFramebufferTextureLayer(GLenum target, GLenum attachment, GLuint texture, GLint level, GLint layer);
    void glRenderbufferStorageMultisample(GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height);
    void glBlitFramebuffer(GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter);
    void glGenerateMipmap(GLenum target);
    void glGetFramebufferAttachmentParameteriv(GLenum target, GLenum attachment, GLenum pname, GLint *params);
    void glFramebufferRenderbuffer(GLenum target, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer);
    void glFramebufferTexture3D(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level, GLint zoffset);
    void glFramebufferTexture2D(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level);
    void glFramebufferTexture1D(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level);
    GLenum glCheckFramebufferStatus(GLenum target);
    void glGenFramebuffers(GLsizei n, GLuint *framebuffers);
    void glDeleteFramebuffers(GLsizei n, const GLuint *framebuffers);
    void glBindFramebuffer(GLenum target, GLuint framebuffer);
    GLboolean glIsFramebuffer(GLuint framebuffer);
    void glGetRenderbufferParameteriv(GLenum target, GLenum pname, GLint *params);
    void glRenderbufferStorage(GLenum target, GLenum internalformat, GLsizei width, GLsizei height);
    void glGenRenderbuffers(GLsizei n, GLuint *renderbuffers);
    void glDeleteRenderbuffers(GLsizei n, const GLuint *renderbuffers);
    void glBindRenderbuffer(GLenum target, GLuint renderbuffer);
    GLboolean glIsRenderbuffer(GLuint renderbuffer);

protected:
    Q_DECLARE_PRIVATE(QOpenGLExtension_ARB_framebuffer_object)
};

又例如,

class QOpenGLExtension_ARB_gpu_shader_fp64 : public QAbstractOpenGLExtension
{
public:
    QOpenGLExtension_ARB_gpu_shader_fp64();

    bool initializeOpenGLFunctions() final;

    void glGetUniformdv(GLuint program, GLint location, GLdouble *params);
    void glUniformMatrix4x3dv(GLint location, GLsizei count, GLboolean transpose, const GLdouble *value);
    void glUniformMatrix4x2dv(GLint location, GLsizei count, GLboolean transpose, const GLdouble *value);
    void glUniformMatrix3x4dv(GLint location, GLsizei count, GLboolean transpose, const GLdouble *value);
    void glUniformMatrix3x2dv(GLint location, GLsizei count, GLboolean transpose, const GLdouble *value);
    void glUniformMatrix2x4dv(GLint location, GLsizei count, GLboolean transpose, const GLdouble *value);
    void glUniformMatrix2x3dv(GLint location, GLsizei count, GLboolean transpose, const GLdouble *value);
    void glUniformMatrix4dv(GLint location, GLsizei count, GLboolean transpose, const GLdouble *value);
    void glUniformMatrix3dv(GLint location, GLsizei count, GLboolean transpose, const GLdouble *value);
    void glUniformMatrix2dv(GLint location, GLsizei count, GLboolean transpose, const GLdouble *value);
    void glUniform4dv(GLint location, GLsizei count, const GLdouble *value);
    void glUniform3dv(GLint location, GLsizei count, const GLdouble *value);
    void glUniform2dv(GLint location, GLsizei count, const GLdouble *value);
    void glUniform1dv(GLint location, GLsizei count, const GLdouble *value);
    void glUniform4d(GLint location, GLdouble x, GLdouble y, GLdouble z, GLdouble w);
    void glUniform3d(GLint location, GLdouble x, GLdouble y, GLdouble z);
    void glUniform2d(GLint location, GLdouble x, GLdouble y);
    void glUniform1d(GLint location, GLdouble x);

protected:
    Q_DECLARE_PRIVATE(QOpenGLExtension_ARB_gpu_shader_fp64)
};

这样的函数还有非常多,这里我就不一一列举了。如果要详细了解的话,可以参考相关文档,例如,上面两个类的第一个函数分别可参考,

https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glFramebufferTextureLayer.xhtml

https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glGetUniform.xhtml

相关的函数在QCC_GL_LIB项目中用到,我们可以在CloudCompare的子项目中找到,目录地址是

libs\CCFbo\include

OpenGL各版本的函数

在Qt的源码中,这些函数的目录地址是,

qt5\5.15.0\msvc2019_64\include\QtGui\

例如我的本地地址,对应OpenGL4.5版本的函数地址是,

C:\Qt\qt5\5.15.0\msvc2019_64\include\QtGui\qopenglfunctions_4_5_core.h

由于这些类中包含的函数体量过大,这里我只贴了部分源码,如下,

class Q_GUI_EXPORT QOpenGLFunctions_4_5_Core : public QAbstractOpenGLFunctions
{
public:
    QOpenGLFunctions_4_5_Core();
    ~QOpenGLFunctions_4_5_Core();

    bool initializeOpenGLFunctions() override;

    // OpenGL 1.0 core functions
    void glViewport(GLint x, GLint y, GLsizei width, GLsizei height);
    void glDepthRange(GLdouble nearVal, GLdouble farVal);
    GLboolean glIsEnabled(GLenum cap);
    void glGetTexLevelParameteriv(GLenum target, GLint level, GLenum pname, GLint *params);
    void glGetTexLevelParameterfv(GLenum target, GLint level, GLenum pname, GLfloat *params);
    void glGetTexParameteriv(GLenum target, GLenum pname, GLint *params);
    void glGetTexParameterfv(GLenum target, GLenum pname, GLfloat *params);
    void glGetTexImage(GLenum target, GLint level, GLenum format, GLenum type, void *pixels);
    const GLubyte * glGetString(GLenum name);
    void glGetIntegerv(GLenum pname, GLint *data);
    void glGetFloatv(GLenum pname, GLfloat *data);
    GLenum glGetError();
    void glGetDoublev(GLenum pname, GLdouble *data);
    void glGetBooleanv(GLenum pname, GLboolean *data);
    void glReadPixels(GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, void *pixels);
    void glReadBuffer(GLenum src);
    void glPixelStorei(GLenum pname, GLint param);
    void glPixelStoref(GLenum pname, GLfloat param);
    void glDepthFunc(GLenum func);
    void glStencilOp(GLenum fail, GLenum zfail, GLenum zpass);
    void glStencilFunc(GLenum func, GLint ref, GLuint mask);
    void glLogicOp(GLenum opcode);
    void glBlendFunc(GLenum sfactor, GLenum dfactor);
    void glFlush();
    void glFinish();
    void glEnable(GLenum cap);
    void glDisable(GLenum cap);
    void glDepthMask(GLboolean flag);
    void glColorMask(GLboolean red, GLboolean green, GLboolean blue, GLboolean alpha);
    void glStencilMask(GLuint mask);
    void glClearDepth(GLdouble depth);
    void glClearStencil(GLint s);
    void glClearColor(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha);
    void glClear(GLbitfield mask);
    void glDrawBuffer(GLenum buf);
    void glTexImage2D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const void *pixels);
    void glTexImage1D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLint border, GLenum format, GLenum type, const void *pixels);
    void glTexParameteriv(GLenum target, GLenum pname, const GLint *params);
    void glTexParameteri(GLenum target, GLenum pname, GLint param);
    void glTexParameterfv(GLenum target, GLenum pname, const GLfloat *params);
    void glTexParameterf(GLenum target, GLenum pname, GLfloat param);
    void glScissor(GLint x, GLint y, GLsizei width, GLsizei height);
    void glPolygonMode(GLenum face, GLenum mode);
    void glPointSize(GLfloat size);
    void glLineWidth(GLfloat width);
    void glHint(GLenum target, GLenum mode);
    void glFrontFace(GLenum mode);
    void glCullFace(GLenum mode);
 ......
}

libs\qCC_glWindow\src\ccGLUtils.cpp中了函数

DisplayTexture2DPosition

为例,其中通过QOpenGLFunctions_2_1调用了OpenGLES2.1中的函数完成相关功能,

void ccGLUtils::DisplayTexture2DPosition(GLuint texID, int x, int y, int w, int h, unsigned char alpha/*=255*/)
{
    QOpenGLContext* context = QOpenGLContext::currentContext();
    if (!context)
    {
        assert(false);
        return;
    }
    QOpenGLFunctions_2_1* glFunc = context->versionFunctions<QOpenGLFunctions_2_1>();
    if (glFunc)
    {
        glFunc->glBindTexture(GL_TEXTURE_2D, texID);

        glFunc->glPushAttrib(GL_ENABLE_BIT);
        glFunc->glEnable(GL_TEXTURE_2D);

        glFunc->glColor4ub(255, 255, 255, alpha);
        glFunc->glBegin(GL_QUADS);
        glFunc->glTexCoord2f(0.0, 1.0);
        glFunc->glVertex2i(x, y + h);
        glFunc->glTexCoord2f(0.0, 0.0);
        glFunc->glVertex2i(x, y);
        glFunc->glTexCoord2f(1.0, 0.0);
        glFunc->glVertex2i(x + w, y);
        glFunc->glTexCoord2f(1.0, 1.0);
        glFunc->glVertex2i(x + w, y + h);
        glFunc->glEnd();

        glFunc->glPopAttrib();

        glFunc->glBindTexture(GL_TEXTURE_2D, 0);
    }
}

同样,在

.\libs\qCC_glWindow\src\ccGLWindow.cpp

中,对3D的渲染使用的也是QOpenGLFunctions_2_1,源码如下,

    //Default OpenGL functions set
    using ccQOpenGLFunctions = QOpenGLFunctions_2_1;

void ccGLWindow::draw3D(CC_DRAW_CONTEXT& CONTEXT, RenderingParams& renderingParams)
{
    ccQOpenGLFunctions* glFunc = functions();
    assert(glFunc);

    glFunc->glPointSize(m_viewportParams.defaultPointSize);
    glFunc->glLineWidth(m_viewportParams.defaultLineWidth);

    glFunc->glEnable(GL_DEPTH_TEST);
    ......

}

CloudCompare是如何完成3D渲染的

在cloudcompare中,有一个轻量级的项目,ccViewer,如果想了解渲染的话,单看这个就够了。

渲染的函数路线如下,

ccGLWindow:

void ccGLWindow::paintGL() -->

ccGLWindow::fullRenderingPass(CONTEXT, renderingParams); -->

ccGLWindow::draw3D(CONTEXT, renderingParams); -->

ccGLWindow::drawCross()

这里,主体的绘图函数其实就是

void ccGLWindow::draw3D(CC_DRAW_CONTEXT& context, RenderingParams& params);

在该函数中,最终会调用ccHObject::draw进行绘制,

ccHObject:

ccGLWindow::draw3D(CONTEXT, renderingParams); -->

void ccHObject::draw(CC_DRAW_CONTEXT& context)

前一讲已经介绍过,打开一个mesh的时候,最终是加入到ccHObject中的container,因为打开的mesh本身也是一个ccHObject,所以实际上就是放在其m_children中,

//Definition

class QCC_DB_LIB_API ccHObject : public ccObject, public ccDrawableObject
{
public: //construction
    ......
    //! Standard instances container (for children, etc.)
    using Container = std::vector<ccHObject *>;
    ......
    //! Children
    Container m_children;
    ......
}

所以在ccHObject中,绘制函数是

void ccHObject::draw(CC_DRAW_CONTEXT& context)
{
    ......
    //draw entity
    if (m_visible && drawInThisContext)
    {
        if (( !m_selected || !MACRO_SkipSelected(context) ) &&
            (  m_selected || !MACRO_SkipUnselected(context) ))
        {
            //apply default color (in case of)
            ccGL::Color4v(glFunc, context.pointsDefaultCol.rgba);

            //enable clipping planes (if any)
            bool useClipPlanes = (draw3D && !m_clipPlanes.empty());
            if (useClipPlanes)
            {
                toggleClipPlanes(context, true);
            }

            drawMeOnly(context);

            //disable clipping planes (if any)
            if (useClipPlanes)
            {
                toggleClipPlanes(context, false);
            }
        }
    }
    ......
    //draw entity's children
    for (auto child : m_children)
    {
        child->draw(context);
    }
    ......    
}

这是一个递归调用函数,当要对mesh进行绘制的时候,会调用下面的这个drawMeOnly函数,这也就是Mesh的最终绘制函数,顶点和面的计算都在这里进行。

void ccMesh::drawMeOnly(CC_DRAW_CONTEXT& context)

该函数因为内容比较多,这里就不展开了,有兴趣的读者不妨自己打开看看源码。

好了,到现在为止,我们对CloudCompare的大致绘制流程或者说框架已经有了 一个初略的了解,后面有机会我们进一步深入。

本文结束。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

CloudCompare源码分析_显示渲染的程序架构 的相关文章

  • 虚拟机可以连接,但是不能上网

    解决方法链接 虚拟可以连接但不能上网 xff0c 一般是DNS的问题 解决方法 xff1a xff08 1 xff09 进入网络共享中 xff0c xff08 2 xff09 进入本地连接 属性 xff08 3 xff09 进入TCP IP
  • QThread必须要了解的几个函数

    概述 如果想对Qt中的QThread有个更加深刻的了解 xff0c 必须要知道这几个重要的函数 xff0c 现在就一一介绍下 函数介绍 属性返回值函数体功能staticQThread QThread currentThread 返回当前线程
  • codeforces 766C Mahmoud and a Message

    题意 xff1a 给你一个长度为n的仅包括小写字母的字符串 xff0c 每个小写字母能在一个长度不超过a i xff08 i是小写字母序号如a为0 xff09 的子串中 问 xff1a 1 有多少种分隔方法 2 所有分割方法中最长的子串有多
  • 结构体对齐详解

    1 结构体基础知识 a 认识结构体 结构体是一些值的集合 这些值称为成员变量 结构体的每个成员可以是不同类型的变量 声明一个结构体类型 声明一个学生类型 Stu就是你对这个结构体的称呼 struct Stu char name 20 cha
  • gitlab搬迁到其它服务器

    由于一些因素 xff0c 需要把gitlab从A服务器搬迁到B服务器 xff0c 现记录步骤如下 xff1a 1 查看A服务器的gitlab版本号 xff1a cat opt gitlab embedded service gitlab r
  • 深度学习在图像超分辨率重建中的应用

    同步更新于知乎 xff1a https zhuanlan zhihu com p 25532538 超分辨率技术 xff08 Super Resolution xff09 是指从观测到的低分辨率图像重建出相应的高分辨率图像 xff0c 在监
  • Xorg 的认识

    1 什么是X Window服务器 xff1f 一种图形用户界面只不过是运行在系统上的一个应用程序 它不是 Linux内核的一部分 xff0c 也没有 集成在你的系统里 它是一个可以为你的工作站提供图形化工作界面的强大工具 由于标准的重要性
  • 利用Python获取带合并单元格的表格数据

    由于在日常运维中经常出现一些合并单元格的表格 xff0c 如果要获取数据比较麻烦 xff0c 现将将封装成类 xff0c 并通过调用list excel data 获取列表形式的数据 dict excel data xff1a 获取字典格式
  • 输出不重复的数组元素

    include lt stdio h gt include lt stdlib h gt include lt math h gt int main int n int f 61 1 scanf 34 d 34 amp n int a n
  • UDP编程之windows socket 缓冲区默认大小

    笔者遇到下位机发过来的几百k的文件 xff0c 为了调试方便 xff0c 一开始并没有加协议 后面发现在OnRecv的回调中打印消息时 xff0c 居然UDP丢包了 后面经过多次分析 xff0c 才发现windows默认的socket缓冲区
  • Wmmem占用内存、CPU过多

    Wmmem占用内存 CPU过多 1 问题描述2 解释 2 1 Vmmem是啥2 2 解决办法 1 问题描述 Windows10中 xff0c 没跑啥软件 xff0c 就看见内存满了 Vmmem占用最多 2 解释 2 1 Vmmem是啥 wi
  • Java基础篇:反射机制详解

    一 什么是反射 xff1a xff08 1 xff09 Java反射机制的核心是在程序运行时动态加载类并获取类的详细信息 xff0c 从而操作类或对象的属性和方法 本质是JVM得到class对象之后 xff0c 再通过class对象进行反编
  • 使用linux裁剪树莓派完整sd卡镜像

    解决了最小镜像的制作问题以后 xff0c 就发现手里已经积攒了不少用Win32DiskImager制作的完整sd卡镜像 虽然压缩过了以后很小 xff0c 但是在恢复镜像时32G大小的写入速度简直慢到龟速 xff0c 所以我通过Ubuntu来
  • Arch 安装中文输入法

    推荐安装小狼毫输入法 安装 从官方仓库安装ibus软件包 xff1a span class hljs comment pacman S ibus span 此外 xff0c 为了启动ibus的Qt应用程序支持 安装ibus qt软件库 xf
  • angular11报错Can‘t bind to ‘ngForOf‘ since it isn‘t a known property of ‘tr‘. 三种排查办法以及解决方案

    当你遇到Can t bind to ngForOf since it isn t a known property of tr 34 无法绑定到 ngforof xff0c 因为它不是 tr 的已知属性 xff08 可能问题一 xff1a
  • 如何禁止DELETE、PUT、OPTIONS、TRACE、HEAD等协议访问应用程序

    简介 WebDAV xff08 Web based Distributed Authoring and Versioning xff09 是基于 HTTP 1 1 的一个通信协议 它为 HTTP 1 1 添加了一些扩展 xff08 就是在
  • c++对象模型系列

    一 指针与引用 一 概括 指针和引用 xff0c 在C 43 43 的软件开发中非常常见 xff0c 如果能恰当的使用它们能够极大的提 高整个软件的效率 xff0c 但是很多的C 43 43 学习者对它们的各种使用情况并不是都了解 xff0
  • ProxmoxVE 6.4-13 (PVE)安装 OpenWrt

    创建虚拟机没什么好说的 xff0c 和大多数教程一样 xff0c 主要记录下我遇到的问题 img2kvm报错 storage 39 vm 103 disk 0 39 does not exist 吐槽 xff1a 这玩意官网打不开 xff0
  • IOS学习笔记8—UITableViewController

    UITableViewController是IOS开发中一个比较重要的试图控制器 xff0c 是集成了UITableView视图的控制器 xff0c 在实际开发中经常用到 xff0c 功能非常强大 xff0c 可定制性也很高 xff0c 下
  • nanodet阅读:(2)正负样本定义(ATSS)

    一 前言 本篇博客主要是ATSS部分 xff0c 这部分个人认为是核心之一 xff0c 毕竟正负样本的选择很重要 xff0c ATSS论文证实 xff0c anchor based和anchor free性能差异的根本原因在于正负样本的定义

随机推荐

  • nanodet阅读:(3)Loss计算及推理部分

    一 前言 loss的计算是一个AI工程代码的核心之一 xff0c nanodet的损失函数与yolo v3 5系列有很大不同 xff0c 具体见Generalized Focal Loss xff0c 说实话一开始看这个损失函数博客 xff
  • nanodet阅读:(1)概述

    一 前言 出于某些需要 xff0c 阅读一下anchor free模型的代码 xff0c 因为之前用过nanodet xff0c 对其印象深刻 xff0c 所以重温一下代码 好记性不如烂笔头 xff0c 多记录 多总结 多分享 正如作者博客
  • c++循环引用

    虽然C 43 43 11引入了智能指针的 xff0c 但是开发人员在与内存的斗争问题上并没有解放 xff0c 如果我们使用 不当仍然有内存泄漏问题 xff0c 其中智能指针的循环引用缺陷是最大的问题 main cpp test Create
  • JupyterLab使用教程

    JupyterLab使用教程 一 Jupyter简介1 用户接口2 架构原理1 xff09 IPython Kernel2 xff09 Jupyter Notebook接口3 xff09 Notebook导出为其它格式4 xff09 Pro
  • Python虚拟环境(pipenv、venv、conda一网打尽)

    Python虚拟环境详解 一 什么是虚拟环境1 什么是Python环境2 什么是虚拟环境3 常用工具 二 pipenv1 安装pipenv2 命令概览3 pipenv基本使用1 xff09 创建虚拟环境2 xff09 激活虚拟环境3 xff
  • MERGE INTO用法更新和插入多条子记录

    lt update id 61 34 addMarkChild 34 parameterType 61 34 java util HashMap 34 gt MERGE INTO t kpi simu detail person dp US
  • 51 nod 1255 字典序最小的子序列

    http www 51nod com onlineJudge questionCode html problemId 61 1255 思路 xff1a 分三种情况 xff1a 1 xff1a 栈空 xff0c 直接将字母压入 2 xff1a
  • C++ thread.join 与 terminate

    C 43 43 11 std thread join 主要函数注意事项原因解决方案 std thread 是C 43 43 11的新特性 xff0c 对于windows来说 xff0c 取代了原来的静态方法的创建方式 DWORD WINAP
  • 算法-计算无向图中两个节点之间所有的路径

    图论 寻找节点间所有路径 最近在论文中 xff0c 要获得节点间的路由 xff0c 由此又开始继续去年的算法学习 下面的就关于寻找两个节点之间所有的路径 因为是在获得路径后 xff0c 再加上权重 xff0c 所以不能将那些求最短路径的算法
  • 算法-图论_关键节点的判断

    无向图的关节点 概述 xff1a 在网络中关节点的判断将成为影响网络连通性的主要因素 节点之间通过关键点传递信息 xff0c 如在我们以太网中的网关 当网关节点失效 xff0c 那么两个网络之间的节点就不能够进行通信 在无线传感器网络中 x
  • Mongodb锁机制

    Mongodb锁机制 Mongodb使用读写锁来允许很多用户同时去读一个资源 xff0c 比如数据库或者集合 读采用的是共享锁 xff0c 写采用的是排它锁 对于大部分的读写操作 xff0c WiredTiger使用的都是乐观锁 xff0c
  • 利用pycharm创建第一个django项目

    利用pycharm创建第一个django项目 最近把python的基本语法还有一些绘图chart学习完了 xff0c 开始django学习之路 xff0c 它是个免费的强大的开源web框架 安装好python 下载pycharm之后 xff
  • VSCode中调试nodejs

    VSCode中调试nodejs 项目中用node去编译脚本 xff0c 尝试调试 1 下载nodejs 下载网址 xff1a https nodejs org zh cn 我是安装在windows环境中 xff0c 所以选择 2 启动VS
  • Bilateral Upsample

    bilateral的原理和方法已经了解过 xff0c 借鉴Bilateral的方法进行上采样 xff0c 可以使用输入的图像作为先验 xff0c 引导低分辨图像恢复成原分辨的图像 xff0c 这里简要介绍如下 xff1a 1 首先看一下联合
  • 注册表

    1 概述 是微软的一个数据库 xff0c 用于存储系统和应用程序的设置信息 参数包括控制windows的启动 xff0c 硬件驱动及windows应用程序的运行 非常重要 xff0c 谨慎操作 数据结构 注册表由键 xff0c 子键 xff
  • VS以管理员权限打开

    描述 在VS进行debug的时候 xff0c 会提示使用管理员的权限进行调试 经常出现重新打开程序的问题 xff0c 所以干脆将VS直接设置为默认管理员的角色运行 1 找到程序目录 C Program Files x86 Microsoft
  • ABAQUS仿真结果云图不对称问题

    问题描述 xff1a 在某次使用ABAQUS进行冲压仿真的过程中 xff0c 本应产生基本对称的应力应变云图 xff0c 但是结果显示并不对称 解决方法 xff1a 设置幅值曲线 ABAQUS幅值曲线介绍 在ABAQUS中 xff0c 通过
  • GreenHills基本操作:调试

    1 编译 1 1 整体编译 1 2 编译是否优化选项 或 2 调试 2 1 进入调式 2 2 调试下载 2 3 跳转至具体行 2 4 函数调用过程查看 2 5 通过文件树查找指定文件 2 6 快速查看所需函数 xff0c 设置断点
  • ROS2 humble + windows10,如何安装调试rplidar a1激光扫描传感器

    玩ROS一直是在ubuntu xff0c 最近因为各种原因 xff0c 在windows10上调试ROS2 这一典型的问题是 xff0c 很多硬件都是没有库文件的支持 xff0c 国内的很多硬件也大多只支持ROS1 完全不调试源码直接使用各
  • CloudCompare源码分析_显示渲染的程序架构

    这一讲介绍一下CloudCompare的大致绘制流程或者说绘图框架的结构 根据前面一篇对CloudCompare读取PLY文件的介绍 xff0c 很容易找出当cloudcompare读取到mesh文件 xff08 newGroup xff0