学习:
vtkGlyph3DMapper: 按照指定方式绘制顶点,例如本示例中,用vtkSphere绘制顶点
vtkDataSetMapper: vtkDataSet对应的Mapper
vtkConvexPointSet: 表示凸多几何拓扑类型
vtkPoints: 顶点数据集合
vtkShrinkFilter: 收缩操作滤波器
/*
* ModuleName: 模块名称
* Description:
* 参考代码:https://lorensen.github.io/VTKExamples/site/Cxx/GeometricObjects/ConvexPointSet/
* Author: hsw
* Date: 2020-03-15
*
*/
// QT
#include <QMainWindow>
#include <QDebug>
// VTK
#include <vtkActor.h>
#include <vtkCamera.h>
#include <vtkConvexPointSet.h>
#include <vtkDataSetMapper.h>
#include <vtkGlyph3DMapper.h>
#include <vtkNamedColors.h>
#include <vtkPoints.h>
#include <vtkProperty.h>
#include <vtkRenderer.h>
#include <vtkRenderWindow.h>
#include <vtkRenderWindowInteractor.h>
#include <vtkShrinkFilter.h>
#include <vtkSmartPointer.h>
#include <vtkSphereSource.h>
#include <vtkUnstructuredGrid.h>
#include <vtkAutoInit.h>
// C++
#include <array>
namespace Ui {
class MainWindow;
}
VTK_MODULE_INIT(vtkRenderingOpenGL2);
VTK_MODULE_INIT(vtkInteractionStyle);
VTK_MODULE_INIT(vtkRenderingContextOpenGL2);
VTK_MODULE_INIT(vtkRenderingFreeType);
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
explicit MainWindow(QWidget *parent = 0);
~MainWindow();
private:
Ui::MainWindow *ui;
private:
vtkSmartPointer<vtkDataSetMapper> mapper;
vtkSmartPointer<vtkActor> actor;
vtkSmartPointer<vtkNamedColors> colors;
vtkSmartPointer<vtkConvexPointSet> cps;
vtkSmartPointer<vtkPoints> points;
vtkSmartPointer<vtkPolyData> polyData;
vtkSmartPointer<vtkGlyph3DMapper> pointMapper;
vtkSmartPointer<vtkActor> pointActor;
vtkSmartPointer<vtkUnstructuredGrid> ug;
vtkSmartPointer<vtkSphereSource> sphere;
vtkSmartPointer<vtkRenderer> renderer;
};
#include "mainwindow.h"
#include "ui_mainwindow.h"
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
// vtkNamedColors
colors = vtkSmartPointer<vtkNamedColors>::New();
// vtkPoints:几何数据
points = vtkSmartPointer<vtkPoints>::New();
points->InsertNextPoint( 0, 0, 0);
points->InsertNextPoint( 1, 0, 0);
points->InsertNextPoint( 1, 1, 0);
points->InsertNextPoint( 0, 1, 0);
points->InsertNextPoint( 0, 0, 1);
points->InsertNextPoint( 1, 0, 1);
points->InsertNextPoint( 1, 1, 1);
points->InsertNextPoint( 0, 1, 1);
points->InsertNextPoint( 0.5, 0, 0);
points->InsertNextPoint( 1, 0.5, 0);
points->InsertNextPoint( 0.5, 1, 0);
points->InsertNextPoint( 0, 0.5, 0);
points->InsertNextPoint( 0.5, 0.5, 0);
// vtkConvexPointSet: 拓扑数据
cps = vtkSmartPointer<vtkConvexPointSet>::New();
for (int i = 0; i < 13; ++i)
{
cps->GetPointIds()->InsertId(i,i);
}
// vtkUnstructuredGrid: 表示0D/1D/2D/3D拓扑数据,vtkDataSet的具体实现
ug = vtkSmartPointer<vtkUnstructuredGrid>::New();
ug->Allocate(1,1);
ug->InsertNextCell(cps->GetCellType(), cps->GetPointIds());
ug->SetPoints(points);
// vtkDataSetMapper
mapper = vtkSmartPointer<vtkDataSetMapper>::New();
mapper->SetInputData(ug);
actor = vtkSmartPointer<vtkActor>::New();
actor->SetMapper(mapper);
actor->GetProperty()->SetColor(colors->GetColor3d("Tomato").GetData());
actor->GetProperty()->SetLineWidth(3);
actor->GetProperty()->EdgeVisibilityOn();
// Glyph the points
sphere = vtkSmartPointer<vtkSphereSource>::New();
sphere->SetPhiResolution(21);
sphere->SetThetaResolution(21);
sphere->SetRadius(.03);
// vtkPolyData
polyData = vtkSmartPointer<vtkPolyData>::New();
polyData->SetPoints(points);
// vtkGlyph3DMapper:顶点用vtkSphere表示,即,每个顶点表示为一个球
pointMapper = vtkSmartPointer<vtkGlyph3DMapper>::New();
pointMapper->SetInputData(polyData);
pointMapper->SetSourceConnection(sphere->GetOutputPort());
pointActor = vtkSmartPointer<vtkActor>::New();
pointActor->SetMapper(pointMapper);
pointActor->GetProperty()->SetColor(colors->GetColor3d("Peacock").GetData());
//Create a renderer
renderer = vtkSmartPointer<vtkRenderer>::New();
//Add the actors to the scene
renderer->AddActor(actor);
renderer->AddActor(pointActor);
renderer->SetBackground(colors->GetColor3d("Silver").GetData());
renderer->ResetCamera();
renderer->GetActiveCamera()->Azimuth(210);
renderer->GetActiveCamera()->Elevation(30);
renderer->ResetCameraClippingRange();
// vtkRenderWindow
ui->qvtkWidget->GetRenderWindow()->AddRenderer(renderer);
}
MainWindow::~MainWindow()
{
delete ui;
}


本文介绍了如何使用QT学习VTK库,特别是vtkGlyph3DMapper和vtkConvexPointSet来绘制凸多边形点集。通过vtkDataSetMapper映射数据,并利用vtkPoints存储顶点信息。此外,还提到了vtkShrinkFilter滤波器用于顶点的收缩操作。

553

被折叠的 条评论
为什么被折叠?



