Qt&Vtk-005-Arrays

Posted DreamLife.

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Qt&Vtk-005-Arrays相关的知识,希望对你有一定的参考价值。

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

Qt&Vtk-Arrays

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

1 基础工作

1.1 新建界面设计师类

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

1.2 放置一个QWidget并提升为QVTKOpenGLWidget

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

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 运行效果

4 涉及知识点

4.1 vtkPoints

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

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

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());   //设置渲染背景

看下效果

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

4.3 vtkCellArray

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

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

★ 源码 ★

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

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


以上是关于Qt&Vtk-005-Arrays的主要内容,如果未能解决你的问题,请参考以下文章

26.Qt Quick QML-RotationAnimationPathAnimationSmoothedAnimationBehaviorPauseAnimationSequential(代码片段

对这个带有 & 不带 = 的代码片段返回类型感到非常困惑

Sphinx - 在代码块片段中使用省略号 (...)

如何在 Javadoc 中使用 @ 和 符号格式化代码片段?

Qt编程遇到的问题,我在qt中直接使用C语言的程序片段,有问题 ,求解

为 Blogger 上的博客格式化代码片段 [关闭]