Paraview与VTK学习笔记(五)

2023-05-16

上一节最后执行到:

this->GetRenderWindow()->Render();
也就是执行到了vtkRenderWindow::Render()了,我们可以看到这个函数是告诉这个RenderWindow下的每一个renderer去渲染他的图像,并且保持进程同步
// Ask each renderer owned by this RenderWindow to render its image and
// synchronize this process
void vtkRenderWindow::Render()
{
  int *size;
  int x,y;
  float *p1;
  // if we are in the middle of an abort check then return now
  if (this->InAbortCheck)
    {
    return;
    }

如果是在中止的中间过程,则check并且返回

// if we are in a render already from somewhere else abort now
  if (this->InRender)
    {
    return;
    }
如果从其他某个地方现在已经在渲染了,那么立即中止

 // if SetSize has not yet been called (from a script, possible off
  // screen use, other scenarios?) then call it here with reasonable
  // default values
  if (0 == this->Size[0] && 0 == this->Size[1])
    {
    this->SetSize(300, 300);
    }
如果SetSize还没有被使用(通过一个脚本,或者关闭屏幕,或者其他情况),那么在这里调用它,并赋值默认值
// reset the Abort flag
  this->AbortRender = 0;
  this->InRender = 1;

  vtkDebugMacro(<< "Starting Render Method.\n");
  this->InvokeEvent(vtkCommand::StartEvent,NULL);

  this->NeverRendered = 0;

  if ( this->Interactor && ! this->Interactor->GetInitialized() )
    {
    this->Interactor->Initialize();
    }
重置中止符号,开始渲染,设置InRender为1。调用开始事件。并且初始化关联器

 // CAUTION:
  // This method uses this->GetSize() and allocates buffers using that size.
  // Remember that GetSize() will returns a size scaled by the TileScale factor.
  // We should use GetActualSize() when we don't want the size to be scaled.

  // if there is a reason for an AccumulationBuffer
  if ( this->SubFrames || this->AAFrames || this->FDFrames)
    {
    // check the current size
    size = this->GetSize();
    unsigned int bufferSize = 3*size[0]*size[1];
    // If there is not a buffer or the size is too small
    // re-allocate it
    if( !this->AccumulationBuffer
        || bufferSize > this->AccumulationBufferSize)
      {
      // it is OK to delete null, no sense in two if's
      delete [] this->AccumulationBuffer;
      // Save the size of the buffer
      this->AccumulationBufferSize = 3*size[0]*size[1];
      this->AccumulationBuffer = new float [this->AccumulationBufferSize];<span style="font-family: Arial, Helvetica, sans-serif;">memset(this->AccumulationBuffer,0,this->AccumulationBufferSize*sizeof(float));}}</span>
这个方法使用this->GetSize(),并且分配buffers从而使用这个size。这个GetSize()函数会根据TileScale调整比例。如果我们不希望这个size被调整,那么调用GetActualSize()。

上面这段代码我们可以看出,主要是为了确保AccumulationBuffer的正确性,如果过不存在或者比bufferSize小。则给它删除原有的,重新赋值并且分配空间。

  // handle any sub frames
  if (this->SubFrames)
    {
    // get the size
    size = this->GetSize();

    // draw the images
    this->DoAARender();

    // now accumulate the images
    if ((!this->AAFrames) && (!this->FDFrames))
      {
      p1 = this->AccumulationBuffer;
      unsigned char *p2;
      unsigned char *p3;
      if (this->ResultFrame)
        {
        p2 = this->ResultFrame;
        }
      else
        {
        p2 = this->GetPixelData(0,0,size[0]-1,size[1]-1,!this->DoubleBuffer);
        }
      p3 = p2;
      for (y = 0; y < size[1]; y++)
        {
        for (x = 0; x < size[0]; x++)
          {
          *p1 += *p2; p1++; p2++;
          *p1 += *p2; p1++; p2++;
          *p1 += *p2; p1++; p2++;
          }
        }
      delete [] p3;
      }
控制子窗口,首先获得size,然后画出图形。把图像集成起来,如果当前window不是AAFrames且不是FDFrames。

    // if this is the last sub frame then convert back into unsigned char
    this->CurrentSubFrame++;
    if (this->CurrentSubFrame >= this->SubFrames)
      {
      double num;
      unsigned char *p2 = new unsigned char [3*size[0]*size[1]];

      num = this->SubFrames;
      if (this->AAFrames)
        {
        num *= this->AAFrames;
        }
      if (this->FDFrames)
        {
        num *= this->FDFrames;
        }

      this->ResultFrame = p2;
      p1 = this->AccumulationBuffer;
      for (y = 0; y < size[1]; y++)
        {
        for (x = 0; x < size[0]; x++)
          {
          *p2 = static_cast<unsigned char>(*p1/num);
          p1++;
          p2++;
          *p2 = static_cast<unsigned char>(*p1/num);
          p1++;
          p2++;
          *p2 = static_cast<unsigned char>(*p1/num);
          p1++;
          p2++;
          }
        }

      this->CurrentSubFrame = 0;
      this->CopyResultFrame();
如果这是最后的子帧,那么重新转换成unsigned char。
 // free any memory
      delete [] this->AccumulationBuffer;
      this->AccumulationBuffer = NULL;
      }
    }

释放内存

 else // no subframes
    {
    // get the size
    size = this->GetSize();

    this->DoAARender();
    // if we had some accumulation occur
    if (this->AccumulationBuffer)
      {
      double num;
      unsigned char *p2 = new unsigned char [3*size[0]*size[1]];

      if (this->AAFrames)
        {
        num = this->AAFrames;
        }
      else
        {
        num = 1;
        }
      if (this->FDFrames)
        {
        num *= this->FDFrames;
        }

      this->ResultFrame = p2;
      p1 = this->AccumulationBuffer;
      for (y = 0; y < size[1]; y++)
        {
        for (x = 0; x < size[0]; x++)
          {
          *p2 = static_cast<unsigned char>(*p1/num);
          p1++;
          p2++;
          *p2 = static_cast<unsigned char>(*p1/num);
          p1++;
          p2++;
          *p2 = static_cast<unsigned char>(*p1/num);
          p1++;
          p2++;
          }
        }

      delete [] this->AccumulationBuffer;
      this->AccumulationBuffer = NULL;
      }

    this->CopyResultFrame();
    }
如果没有子帧。则直接执行。

  delete [] this->ResultFrame;
  this->ResultFrame = NULL;

  this->InRender = 0;
  this->InvokeEvent(vtkCommand::EndEvent,NULL);
}
结束渲染事件。
我们可以看到上面真正渲染的代码是this->DoAARender()。那么我们继续分析这个函数

// Handle rendering any antialiased frames.
void vtkRenderWindow::DoAARender()
{
  int i;

  // handle any anti aliasing控制任何抗锯齿
  if (this->AAFrames)
    {
    int *size;
    int x,y;
    float *p1;
    vtkRenderer *aren;
    vtkCamera *acam;
    double *dpoint;
    double offsets[2];
    double origfocus[4];
    double worldOffset[3];
这个函数显然我们可以看到,它是用来控制渲染抗锯齿帧的。
   // get the size
    size = this->GetSize();

    origfocus[3] = 1.0;

    for (i = 0; i < this->AAFrames; i++)
      {
      // jitter the cameras
      offsets[0] = vtkMath::Random() - 0.5;
      offsets[1] = vtkMath::Random() - 0.5;

      vtkCollectionSimpleIterator rsit;
      for (this->Renderers->InitTraversal(rsit);
           (aren = this->Renderers->GetNextRenderer(rsit)); )
        {
        acam = aren->GetActiveCamera();

获得size,然后对于AA帧,抖动相机?

        // calculate the amount to jitter
        acam->GetFocalPoint(origfocus);
        aren->SetWorldPoint(origfocus);
        aren->WorldToDisplay();
        dpoint = aren->GetDisplayPoint();
        aren->SetDisplayPoint(dpoint[0] + offsets[0],
                              dpoint[1] + offsets[1],
                              dpoint[2]);
        aren->DisplayToWorld();
        dpoint = aren->GetWorldPoint();
        dpoint[0] /= dpoint[3];
        dpoint[1] /= dpoint[3];
        dpoint[2] /= dpoint[3];
        acam->SetFocalPoint(dpoint);

        worldOffset[0] = dpoint[0] - origfocus[0];
        worldOffset[1] = dpoint[1] - origfocus[1];
        worldOffset[2] = dpoint[2] - origfocus[2];

        acam->GetPosition(dpoint);
        acam->SetPosition(dpoint[0]+worldOffset[0],
                          dpoint[1]+worldOffset[1],
                          dpoint[2]+worldOffset[2]);
        }

      // draw the images
      this->DoFDRender();
计算抖动的值,然后继续渲染

     // restore the jitter to normal
      for (this->Renderers->InitTraversal(rsit);
           (aren = this->Renderers->GetNextRenderer(rsit)); )
        {
        acam = aren->GetActiveCamera();

        // calculate the amount to jitter
        acam->GetFocalPoint(origfocus);
        aren->SetWorldPoint(origfocus);
        aren->WorldToDisplay();
        dpoint = aren->GetDisplayPoint();
        aren->SetDisplayPoint(dpoint[0] - offsets[0],
                              dpoint[1] - offsets[1],
                              dpoint[2]);
        aren->DisplayToWorld();
        dpoint = aren->GetWorldPoint();
        dpoint[0] /= dpoint[3];
        dpoint[1] /= dpoint[3];
        dpoint[2] /= dpoint[3];
        acam->SetFocalPoint(dpoint);

        worldOffset[0] = dpoint[0] - origfocus[0];
        worldOffset[1] = dpoint[1] - origfocus[1];
        worldOffset[2] = dpoint[2] - origfocus[2];

        acam->GetPosition(dpoint);
        acam->SetPosition(dpoint[0]+worldOffset[0],
                          dpoint[1]+worldOffset[1],
                          dpoint[2]+worldOffset[2]);
        }

然后把抖动恢复成正常值

      // now accumulate the images
      p1 = this->AccumulationBuffer;
      if (!this->FDFrames)
        {
        unsigned char *p2;
        unsigned char *p3;
        if (this->ResultFrame)
          {
          p2 = this->ResultFrame;
          }
        else
          {
          p2 = this->GetPixelData(0,0,size[0]-1,size[1]-1,!this->DoubleBuffer);
          }
        p3 = p2;
        for (y = 0; y < size[1]; y++)
          {
          for (x = 0; x < size[0]; x++)
            {
            *p1 += static_cast<float>(*p2);
            p1++;
            p2++;
            *p1 += static_cast<float>(*p2);
            p1++;
            p2++;
            *p1 += static_cast<float>(*p2);
            p1++;
            p2++;
            }
          }
        delete [] p3;
        }
      }
    }
然后再组装图像。

  else
    {
    this->DoFDRender();
    }
}
如果没有AA帧,就直接执行下一级渲染。

// Handle rendering any focal depth frames.
void vtkRenderWindow::DoFDRender()
{
  int i;

  // handle any focal depth
  if (this->FDFrames)
    {...this->DoStereoRender()....<span style="font-family: Arial, Helvetica, sans-serif;">}</span>
  else
    {
    this->DoStereoRender();
    }
这个函数是用来控制渲染所有焦点深度的帧的。其基本过程和上面一样。就没什么细说的,只是算法不一样。再看下一级渲染:

void vtkRenderWindow::DoStereoRender()
{
  vtkCollectionSimpleIterator rsit;

  this->Start();//初始化渲染进程
  this->StereoUpdate();//更新整个系统,如果需要,还要控制立体渲染。对于一些立体方法,在这里子类需要选择硬件支持

  if (this->StereoType != VTK_STEREO_RIGHT)
    { // render the left eye
    vtkRenderer *aren;
    for (this->Renderers->InitTraversal(rsit);
         (aren = this->Renderers->GetNextRenderer(rsit)); )
      {
首先渲染左眼。一个安全的方式通过集合去进行迭代,没一次传递相同的cookie值。这里定义一个for循环,对于每一个Render循环。
      // Ugly piece of code - we need to know if the camera already
      // exists or not. If it does not yet exist, we must reset the
      // camera here - otherwise it will never be done (missing its
      // oppportunity to be reset in the Render method of the
      // vtkRenderer because it will already exist by that point...)
      if ( !aren->IsActiveCameraCreated() )
        {
        aren->ResetCamera();
        }
      aren->GetActiveCamera()->SetLeftEye(1);
      }
    this->Renderers->Render();
    }
我们需要知道相机是否已经存在。如果过不存在,我们需要reser它。否则我们把它设置为左眼使用。然后进行渲染。
  if (this->StereoRender)
    {
    this->StereoMidpoint();
    if (this->StereoType != VTK_STEREO_LEFT)
      { // render the right eye
      vtkRenderer *aren;
      for (this->Renderers->InitTraversal(rsit);
           (aren = this->Renderers->GetNextRenderer(rsit)); )
        {
        // Duplicate the ugly code here too. Of course, most
        // times the left eye will have been rendered before
        // the right eye, but it is possible that the user sets
        // everything up and renders just the right eye - so we
        // need this check here too.
        if ( !aren->IsActiveCameraCreated() )
          {
          aren->ResetCamera();
          }
        aren->GetActiveCamera()->SetLeftEye(0);
        }
      this->Renderers->Render();
      }
    this->StereoRenderComplete();
    }

}
这段代码与上面基本一样,其实就是再渲染右眼,但中间有一个this->Steromidpoint(),这个方法使用来渲染从左眼到右眼的对参数的一些改变操作。
接下来,不论左眼右眼,我们都可以看到,它调用了this->Renders->Render();

Renders是vtkRendererCollection类的一个对象。

void vtkRendererCollection::Render()
{
  vtkRenderer      *ren, *firstRen;
  vtkRenderWindow  *renWin;
  int               numLayers, i;

  vtkCollectionSimpleIterator rsit;
  this->InitTraversal(rsit);
  firstRen = this->GetNextRenderer(rsit);
  if (firstRen == NULL)
    {
    // We cannot determine the number of layers because there are no
    // renderers.  No problem, just return.
    return;
    }
  renWin = firstRen->GetRenderWindow();
  numLayers = renWin->GetNumberOfLayers();

初始化rsit,然后获取第一个renderer。然后再获取RenderWindow和Layer的数量。

 // Only have the renderers render from back to front.  This is necessary
  // because transparent renderers clear the z-buffer before each render and
  // then overlay their image.
  for (i = 0; i < numLayers; i++)
    {
    for (this->InitTraversal(rsit); (ren = this->GetNextRenderer(rsit)); )
      {
      if (ren->GetLayer() == i)
        {
        ren->Render();
        }
      }
    }
从后到前,对于每一层Layer,使每一个renderer渲染。
  // Let the user know if they have put a renderer at an unused layer.
  for (this->InitTraversal(rsit); (ren = this->GetNextRenderer(rsit)); )
    {
    if (ren->GetLayer() < 0 || ren->GetLayer() >= numLayers)
      {
      vtkErrorMacro(<< "Invalid layer for renderer: not rendered.");
      }
    }
}
报错,使用户知道他是否使一个renderer放到了不会用到的layer上。
















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

Paraview与VTK学习笔记(五) 的相关文章

  • ASP .Net Core内置 Identity 简介 使用

    一 简介 1 概况 ASP NET Core Identity是一个成员身份系统 xff0c 可将用户注册和登录功能添加到 ASP NET Core Web UI 成员身份系统处理身份验证和授权问题 身份验证涉及你的身份 授权涉及允许你进行
  • sql 2008 安装失败 mof语法错误 处理

    这几天比较忧闷 xff0c 在一台比较老的win2003机器上安装sql2008一直出 MOF语法错误 安装失败 xff0c 浪费了我几天的时间才搞定 现把经历写出来以帮他人可以少走歪路 这台机器是一个平时当开发平台的机器 xff0c AM
  • 十年老撕鸡分享,五分钟搭建个人轻论坛

    点击 关注 爪哇笔记 给公众号标星置顶 更多精彩 第一时间直达 前言 09 年开始接触论坛 xff0c 那会微信还没有诞生 xff0c 也没有什么移动互联网 xff0c 大家还都在用功能机玩着 2G 的文字游戏 xff01 那会玩论坛的还比
  • sql server之在存储过程中利用OpenJson将Json字符串转化为表格

    在Sql server2016的版本后 xff0c 数据库增加了对Json格式的支持 xff0c 详细信息可以参考微软官方文档链接 应用背景 在线订餐系统中 xff0c 购物车的内容存储在浏览器缓存中 所以数据库关于订单的设计是订单表 xf
  • 生活大爆炸版 石头剪刀布

    如果大家认为写的不错 xff0c 请点赞关注收藏 xff01 题目描述 石头剪刀布是常见的猜拳游戏 xff1a 石头胜剪刀 xff0c 剪刀胜布 xff0c 布胜石头 如果两个人出拳一 样 xff0c 则不分胜负 在 生活大爆炸 第二季第8
  • debian10安装docker

    使用root登录 将已安装的软件包更新到最新版本 xff1a apt update apt upgrade 安装通过 HTTPS 添加新存储库所需的依赖项 xff1a apt install apt transport https ca c
  • 黑盒(功能)测试以及测试用例设计

    概念 xff1a 黑盒测试是把测试对象看做一个黑盒子 xff0c 利用黑盒测试法进行动态测试时 xff0c 需要测试软件产品已经实现的功能是否符合功能设计要求 xff0c 不需测试软件产品的内部结构和处理过程 黑盒测试注重于测试软件的功能性
  • 2018.09.27 网络协议(tarjan)

    描述 一些学校连接在一个计算机网络上 学校之间存在软件支援协议 每个学校都有它应支援的学校名单 xff08 学校 a 支援学校 b xff0c 并不表示学校 b 一定支援学校 a xff09 当某校获得一个新软件时 xff0c 无论是直接得
  • golang exec 执行 shell 如何同步输出/得到执行结果

    背景 项目中需要执行shell命令 xff0c 虽然exec包提供了CombinedOutput 方法 xff0c 在shell运行结束会返回shell执行的输出 xff0c 但是用户在发起一次任务时 xff0c 可能在不停的刷新log x
  • Android下USB的虚拟串口功能

    1 先关闭usb的gadge功能 echo 0 gt sys class android usb android0 enable 2 设置acm transports为 34 TTY 34 的功能 echo 34 TTY 34 gt sys
  • ubuntu鼠标灵敏度设置

    ubuntu鼠标灵敏度设置 安装ubuntu以后使用系统鼠标灵敏度设置总觉得不太管用 xff0c 于是各方搜索 xff0c 最终找到一个有效的解决方案 具体命令如下 xff1a span class hljs built in sudo s
  • Win10安装Anaconda和TensorFlow

    Anaconda与TensorFlow Anaconda是一个开源的Python发行版本 包含了很多科学包 Tensorflow是谷歌近几年发行的机器学习框架 安装过程 Anaconda安装 其安装过程简单 Anaconda安装成功测试卸载
  • Navicat报错2003:can't connect to MySQl server on localhost

    好久没用Navicat来操作Mysql 今天一用出现错误 解决方法 控制面板 大图标 管理工具 服务 MYSQL启动
  • vscode编辑c++报错undefined reference to `Point::setY(int)‘ collect2.exe: error: ld returned 1 exit statu

    提示 xff1a 文章写完后 xff0c 目录可以自动生成 xff0c 如何生成可参考右边的帮助文档 64 TOC 文vscode编辑c 43 43 报错undefined reference to 96 Point setY int co
  • 解决RuntimeError: Expected all tensors to be on the same device, but found at least two devices,

    问题描述 说明网络中有的数据在gpu运算有的在cpu运算 解决方法 报错的行加上 cuda 即可 参考 https www cnblogs com tanyahuang p 15522833 html
  • 线性表 顺序存储 C语言实现

    线性表 顺序存储 C语言实现 关于线性表8个基本操作的c语言实现 注意 顺序表用数组表示 线性表位序从1开始 数组元素下标从0开始 顺序表插入删除 判断插入 删除位置是否合法的表示方法 include lt stdio h gt SqLis
  • 百度飞桨:春节写春联:你写上联,AI写下联

    写春联 xff1a 你写上联 xff0c AI写下联 一 前言二 项目简介三 基本要求四 代码实现五 项目成果六 总结 百度飞桨系列文章 xff1a 百度飞桨 xff1a 给出关键词 xff0c AI自动生成元宵节祝福 百度飞桨 xff1a
  • 百度飞桨:(情人节特辑)想做就做,让爱豆对你说情话,过凡尔赛式情人节~

    想做就做 xff0c 让爱豆对你说情话 xff0c 过凡尔赛式情人节 xff01 一 前言二 项目简介三 代码实现四 项目成果五 总结 百度飞桨系列文章 xff1a 百度飞桨 xff1a 春节写春联 xff1a 你写上联 xff0c AI写
  • ECS的概念

    服务器的部署模式发展历程 单机架构 xff1a 一台服务器提供给客户所有应用 缺点 xff1a 单机架构要求服务器的性能非常强大纵向扩展 xff1a 换高主频的CPU xff0c 增大CPU xff0c 增大内存纵向扩展的缺陷 xff1a
  • Python基础详解(十三):(视频符号化)将视频转换成ASCII符号形式展示出来

    目录 一 前言二 项目简介三 基本要求四 代码实现4 1 安装ffmpeg exe4 2 安装you get库4 2 1 下载4 2 2 检查视频信息4 2 3 下载 mp3 格式视频 4 3 执行代码 五 总结 一 前言 今天手把手教大家

随机推荐

  • 百度飞桨:给出关键词,AI自动生成元宵节祝福~

    元宵节 xff0c 祝福语 一 前言二 模型介绍三 数据准备四 执行代码4 1 安装依赖4 2 开始训练4 3安装模型 五 预测输出六 元宵节快乐七 总结 百度飞桨系列文章 xff1a 百度飞桨 xff1a 春节写春联 xff1a 你写上联
  • Python基础详解(十五):json.dump()、json.dumps()、json.load()、json.loads()

    Python基础详解 一 函数用法二 执行代码2 1 json dumps 2 2 json dump 2 3 json loads 2 4 json load 一 函数用法 json dumps xff1a 将Python数据结构转换为J
  • 基于卷积神经网络VGG实现水果分类识别

    基于卷积神经网络VGG实现水果分类识别 一 前言二 模型介绍三 数据处理四 模型搭建4 1 定义卷积池化网络4 2 搭建VGG网络4 3 参数配置4 4 模型训练4 5 绘制loss和acc图像 五 模型评估六 模型预测七 总结资源 百度飞
  • 改进粒子群算法二维平面路径规划

    改进粒子群算法二维平面路径规划 一 前言二 模型介绍三 算法改进四 执行代码五 总结 一 前言 路径规划是运动规划的主要研究内容之一 运动规划由路径规划和轨迹规划组成 xff0c 连接起点位置和终点位置的序列点或曲线称之为路径 xff0c
  • 基于百度短语音API的语音识别实现

    基于百度短语音API的语音识别实现 一 前言二 API介绍2 1 简介2 2 API的调用流程 三 执行代码四 总结 一 前言 语音识别是一门交叉学科 近二十年来 xff0c 语音识别技术取得显著进步 xff0c 开始从实验室走向市场 人们
  • 百度常规赛:视杯视盘分割

    百度常规赛 xff1a 视杯视盘分割 一 比赛简介二 赛题背景三 赛题说明3 1 数据简介 Dataset Introduction3 2 数据描述 Data Description 四 代码执行 一 比赛简介 GAMMA挑战赛是由百度在M
  • 2022-LaTex最新官网安装教程

    2022 LaTex最新安装教程 xff1a TeX Live 43 TeXstudio 一 简介二 TeX Live下载安装2 1 点击进入官网2 2 点击下载链接2 3 选择安装方式2 4 点击镜像下载网站2 5 点击下载2 6 开始安
  • 中秋佳节,基于华为云AI制作属于自己的月亮!

    中秋佳节 xff0c 基于华为云AI制作属于自己的月亮 xff01 一 前言二 结果展示三 模型简介四 实验环境五 实验步骤1 导入依赖包2 参数设置3 调用视频和图片4 定义SkyFilter类5 处理视频并与原视频对比 六 生成自己的换
  • 设置Matlab的永久默认工作路径

    设置Matlab的默认工作路径 第一步第二步第三步 第一步 用记事本或者MATLAB打开 安装Matlab路径下的 xff1a D Program Files MATLAB R2021a toolbox local matlabrc m 文
  • IndexOptions类说明

    IndexOptions是在lucene core x jar包下面 xff0c 其作用是在新建索引时候选择索引属性 IndexOptions是一个枚举类 xff1a 枚举变量说明 xff1a NONE不被索引DOCS AND FREQS文
  • SCI论文阅读-深度学习在测井气体红外光谱定量分析中的应用

    期刊 xff1a Applied Optics中科院最新分区 xff08 2022年12月最新版 xff09 xff1a 4区影响因子 xff08 2021 2022 xff09 xff1a 1 905第一作者 xff1a 宋丽梅通讯作者
  • SCI论文阅读-使用基于图像的机器学习模型对FTIR光谱进行功能组识别

    期刊 xff1a Analytical Chemistry中科院最新分区 xff08 2022年12月最新版 xff09 xff1a 1区 TOP 影响因子 xff08 2021 2022 xff09 xff1a 8 008第一作者 xff
  • windows驱动开发-编译错误集合

    作者 QQ群 xff1a 852283276 微信 xff1a arm80x86 微信公众号 xff1a 青儿创客基地 B站 xff1a 主页 https space bilibili com 208826118 WDK7600 wdmgu
  • mac date命令详解

    文章目录 mac date 命令详解1 共同点2 不同点3 mac date 命令用法详解4 示例 mac date 命令详解 前言 xff1a Mac下date命令式BSD xff08 Berkeley Software Distribu
  • Word文档转PDF后文件变小、图片不清晰解决办法

    Word文档往往需要转成PDF文件 xff0c 如果文档中有图片 xff0c 转换之后在PDF中图片不清晰或者放大之后不清晰 xff08 根本原因是转PDF过程中对图片进行了压缩 xff09 xff0c 影响打印或者投稿 通过以下几步可以轻
  • VS2013/MFC 实现Windows资源管理器的简单方法

    开发平台 xff1a Win7 43 VS2013 总想用MFC来实现Windows系统下的一些小程序 xff0c 今天突然想实现Windows资源管理器 xff0c 发现一种非常简单的方法能够实现它 xff0c 主要用List Contr
  • OpenStack安装相关问题及解决方法

    OpenStack排错总结 1 AMQP Server on controller 5672 is unreachable 解决方法 xff1a iptables I INPUT p tcp dport 5672 j ACCEPT 2 un
  • WSL2迁移方法

    WSL是Windows下的Linux子系统 xff0c 可以代替虚拟机来运行Linux系统 xff0c 占用资源少 xff0c 使用方便 xff0c 下面说一下如何对已发布子系统进行迁移 一种情况是针对同一个系统 xff0c 更换安装的位置
  • 将Word 2010的公式转换成MathType公式

    现在越来越多的人在文档中编辑公式的时候会选择MathType来编辑 xff0c 因为它包含有众多的数学符号和模板 xff0c 编辑公式时非常方便 但是也有一些人在编辑公式时没有使用MathType公式编辑器 xff0c 直接使用Word中自
  • Paraview与VTK学习笔记(五)

    上一节最后执行到 xff1a this gt GetRenderWindow gt Render 也就是执行到了vtkRenderWindow Render 了 xff0c 我们可以看到这个函数是告诉这个RenderWindow下的每一个r