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
★ 源码 ★
这里就要有人问了呀,这么优秀的代码,能不能分享下呀,当然可以呀,我不生产代码,我只是代码的搬运工,链接如下:
以上是关于Qt&Vtk-005-Arrays的主要内容,如果未能解决你的问题,请参考以下文章
26.Qt Quick QML-RotationAnimationPathAnimationSmoothedAnimationBehaviorPauseAnimationSequential(代码片段
如何在 Javadoc 中使用 @ 和 符号格式化代码片段?