Qt&Vtk-005-Arrays

DreamLife 发表于 2021/08/07 11:54:06 2021/08/07
【摘要】 欢迎来到我的博客,希望这篇文章对你有所帮助,如果觉得不错,请点赞搜藏哈。Qt&Vtk-Arrays1 基础工作1.1 新建界面设计师类1.2 放置一个QWidget并提升为QVTKOpenGLWidget2 代码搬运2.1 marrays.h2.2 marrays.cpp3 运行效果4 涉及知识点4.1 vtkPoints4.2 vtkNamedColors4.3 vtkCellArray4...

titlle bar

欢迎来到我的博客,希望这篇文章对你有所帮助,如果觉得不错,请点赞搜藏哈。

# Qt&Vtk-Arrays

今天我有来搬运代码了,今天搬运的是我们vtk中的Arrays,原来实例运行效果如下。

image-20210623153331496

1 基础工作

1.1 新建界面设计师类

由于昨天在搬运第一个实例AmbientSpheres的时候,我对我的工程做了小小调整,今天我可以免去前面的那些步骤,直接新建一个Qt 界面设计师类就可以,就是下图中的这个。

image-20210623153637304

1.2 放置一个QWidget并提升为QVTKOpenGLWidget

在新窗口中新建一个Qwidget,并使用提升工具,提升为为QVTKOpenGLWidget,如下图所示。

image-20210623193545394

2 代码搬运

2.1 marrays.h

#ifndef MARRAYS_H
#define MARRAYS_H
​
#include <QWidget>
#include "QVTKOpenGLWidget.h"               //新版本,旧版QVTKWidget
#include "vtkAutoInit.h"
#include "vtkActor.h"
#include "vtkCellArray.h"
#include "vtkDoubleArray.h"
#include "vtkFloatArray.h"
#include "vtkIntArray.h"
#include "vtkNamedColors.h"
#include "vtkNew.h"
#include "vtkPointData.h"
#include "vtkPoints.h"
#include "vtkPolyData.h"
#include "vtkPolyDataMapper.h"
#include "vtkRenderWindow.h"
#include "vtkRenderWindowInteractor.h"
#include "vtkRenderer.h"
#include <array>
namespace Ui {
class MArrays;
}
​
class MArrays : public QWidget
{
    Q_OBJECT
​
public:
    explicit MArrays(QWidget *parent = 0);
    ~MArrays();
​
private:
    Ui::MArrays *ui;
​
    vtkNew<vtkNamedColors> colors;              //新建颜色对象
    vtkNew<vtkDoubleArray> pcoords;             //新建Double数组
​
    std::array<std::array<double,3>,4> pts = {{{{0.0, 0.0, 0.0}},
                                               {{0.0, 1.0, 0.0}},
                                               {{1.0, 0.0, 0.0}},
                                               {{1.0, 1.0, 0.0}}}};     //新建Double 二维数组
​
    vtkNew<vtkPoints> points;                   //新建坐标点
​
    vtkNew<vtkCellArray> strips;                //暂时不清楚
​
    vtkNew<vtkIntArray> temperature;            //暂时不了解
​
    vtkNew<vtkDoubleArray> vorticity;           //Double 数组
​
    vtkNew<vtkPolyData> polydata;               //PolyData格式的数据
​
    vtkNew<vtkPolyDataMapper> mapper;           //映射器
​
    vtkNew<vtkActor> actor;                     //就是Actor
​
    vtkNew<vtkRenderer> render;                 //渲染
​
};
​
#endif // MARRAYS_H
​
​

2.2 marrays.cpp

#include "marrays.h"
#include "ui_marrays.h"
#include <QDebug>
MArrays::MArrays(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::MArrays)
{
    ui->setupUi(this);
​
    pcoords->SetNumberOfComponents(3);          //实例中说是设置其组件数为3,默认为1,这里还不明白
    pcoords->SetNumberOfTuples(4);              //设置pcoords可以容纳4个Tuples数据
​
    for (auto i = 0ul;i<pts.size();++i) {       //把数据加进去
        pcoords->SetTuple(i,pts[i].data());
    }
​
    points->SetData(pcoords);                   //我理解就是数据放进这个点数组里面
​
    strips->InsertNextCell(4);                  //这个干啥还不清楚
    strips->InsertCellPoint(0);
    strips->InsertCellPoint(1);
    strips->InsertCellPoint(2);
    strips->InsertCellPoint(3);
​
//    temperature->SetName("Temperature");      //这个为啥要设置名字,咱也不懂,先撸为敬
                                                //测试这个和颜色有关系
    temperature->InsertNextValue(10);
    temperature->InsertNextValue(20);
    temperature->InsertNextValue(50);
    temperature->InsertNextValue(80);
​
//    vorticity->SetName("Vorticity");          //这个为啥要设置名字,咱也不懂,先撸为敬
    vorticity->InsertNextValue(1.0);
    vorticity->InsertNextValue(1.0);
    vorticity->InsertNextValue(1.0);
    vorticity->InsertNextValue(1.0);
​
    polydata->SetPoints(points);
    polydata->SetStrips(strips);
    polydata->GetPointData()->SetScalars(temperature);      //官方文档中就一句话,设置标量数据,啥是标量数据呀,咋就能修改颜色了
    polydata->GetPointData()->AddArray(vorticity);
​
    mapper->SetInputData(polydata);         //映射器输入数据
    mapper->SetScalarRange(0,80);           //又一个Scalar 也能影响颜色,这尼玛,这个好像是要区我们temperature中的区一部分吧
​
    actor->SetMapper(mapper);               //
​
    render->AddActor(actor);                //添加actor
    render->SetBackground(colors->GetColor3d("DarkSlateGray").GetData());   //设置渲染背景
​
    ui->widget->GetRenderWindow()->AddRenderer(render);         //添加渲染器
​
}
​
MArrays::~MArrays()
{
    delete ui;
}
​

3 运行效果

image-20210623200314286

4 涉及知识点

4.1 vtkPoints

参考链接:https://vtk.org/doc/release/5.0/html/a01872.html

image-20210624102126940

vtkPointers是由点云组成的数组。不包含任何vertex,直接放进vtkPolyData中进行显示是看不到。

点云是啥呢,我也不知道,放链接

点云是指目标表面特性的海量点集合。

点云:https://baike.baidu.com/item/%E7%82%B9%E4%BA%91/10823598?fr=aladdin

https://blog.csdn.net/weixin_34186128/article/details/85960107

https://zhuanlan.zhihu.com/p/270584859


4.2 vtkNamedColors

参考链接:https://vtk.org/doc/release/6.1/html/classvtkNamedColors.html

image-20210624102318982

vtkNamedColors,在我目前的理解来看,就是可以通过颜色的名字来设置颜色。而非必须通过RBG/RGBA来设置。如下

render->SetBackground(colors->GetColor3d("DarkSlateGray").GetData());   //设置渲染背景

以上理解如有不对,请指正!!!

目前摸索的大致用法,就是我可以自己定义自己的颜色,比如,我修改现在的代码,对我们文件中的Color增加一个自己定义的颜色,如下:

colors->SetColor("TestColor",1.0,0.0,0.0);

我调用了colors的SetColor函数,定义了一个自己的颜色,名字就是TestColor ,颜色就是按照RGB来,红色。接在这设置背景的时候使用自己的颜色代码就可以。如下:

render->SetBackground(colors->GetColor3d("TestColor").GetData());   //设置渲染背景

看下效果

image-20210624154817456

目前浅陋的摸索仅知道这一点,欢迎补充

4.3 vtkCellArray

参考链接:https://vtk.org/doc/nightly/html/classvtkCellArray.html

image-20210624102510249

vtkCellArray这个东西,我也没有找到啥有用的内容,咱也不知道这是个啥东西。这里暂时先引用官方的描述,待后面我逐渐明白了在做补存。

object to represent cell connectivity

vtkCellArray stores dataset topologies as an explicit connectivity table listing the point ids that make up each cell.

Internally, the connectivity table is represented as two arrays: Offsets and Connectivity.

Offsets is an array of [numCells+1] values indicating the index in the Connectivity array where each cell's points start. The last value is always the length of the Connectivity array.

The Connectivity array stores the lists of point ids for each cell.

4.4 vtkPointData

参考链接:https://vtk.org/doc/nightly/html/classvtkPointData.html

image-20210624131800430


★ 源码 ★

在这里插入图片描述


这里就要有人问了呀,这么优秀的代码,能不能分享下呀,当然可以呀,我不生产代码,我只是代码的搬运工,链接如下:


自取:https://github.com/DreamLife-Jianwei/Qt-Vtk


在这里插入图片描述



【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区),文章链接,文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件至:cloudbbs@huaweicloud.com进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容。
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。