数据的合并在3D应用中时常会用到,怎样合并数据,对于不同类型的数据,合并的方法却不相同。
vtk中的数据集有很多类型,主要包括结构化网络数据集、非结构化网络数据集、多边形数据集、结构化点集、线性网络数据集、非结构化点集等几类。
下面介绍对多边形数据集(Polygonal Data)做合并。
vtkAppendPolyData
vtkAppendPolyData是一个filter,主要的作用就是将两个或多个多边形数据集合并为一个的多边形数据集。所有的几何信息都会被提取,但是点、单元属性(标量、向量、法线)的提取和扩展需要每个数据集有这个点或者单元属性。例如如果一个数据集有点标量信息(如权重)而另一个数据集没有这个点的标量信息,那个这个点的标量信息就不会被扩展。
使用方法
加入两个或多个数据
auto appendFilter =
vtkSmartPointer<vtkAppendPolyData>::New();
appendFilter->AddInputConnection(tubeFilter->GetOutputPort());
appendFilter->AddInputConnection(coneSource->GetOutputPort());
如果合并的数据包含多个多边形数据,可以循环加入。
去掉重复多余的点和单元
auto cleanFilter =
vtkSmartPointer<vtkCleanPolyData>::New();
cleanFilter->SetInputConnection(appendFilter->GetOutputPort());
cleanFilter->Update();
示例
将一个圆柱和圆柱合并成一个多边形数据
CombinePolyData.cxx
#include <vtkSmartPointer.h>
#include <vtkLineSource.h>
#include <vtkTubeFilter.h>
#include <vtkConeSource.h>
#include <vtkAppendPolyData.h>
#include <vtkCleanPolyData.h>
#include <vtkPolyDataMapper.h>
#include <vtkActor.h>
#include <vtkRenderer.h>
#include <vtkRenderWindow.h>
#include <vtkRenderWindowInteractor.h>
int main(int argc, char* argv)
{
auto lineSource =
vtkSmartPointer<vtkLineSource>::New();
lineSource->SetPoint1(0.0, 0.0, 0.0);
lineSource->SetPoint2(-6.0, 0.0, 0.0);
auto tubeFilter =
vtkSmartPointer<vtkTubeFilter>::New();
tubeFilter->SetInputConnection(lineSource->GetOutputPort());
tubeFilter->SetRadius(0.5);
tubeFilter->SetNumberOfSides(50);
tubeFilter->CappingOn();
auto coneSource =
vtkSmartPointer<vtkConeSource>::New();
coneSource->SetHeight(3.0);
coneSource->SetRadius(1.0);
coneSource->SetCenter(0.0, 0.0, 0.0);
auto appendFilter =
vtkSmartPointer<vtkAppendPolyData>::New();
appendFilter->AddInputConnection(tubeFilter->GetOutputPort());
appendFilter->AddInputConnection(coneSource->GetOutputPort());
auto cleanFilter =
vtkSmartPointer<vtkCleanPolyData>::New();
cleanFilter->SetInputConnection(appendFilter->GetOutputPort());
cleanFilter->Update();
auto mapper =
vtkSmartPointer<vtkPolyDataMapper>::New();
mapper->SetInputConnection(cleanFilter->GetOutputPort());
auto actor =
vtkSmartPointer<vtkActor>::New();
actor->SetMapper(mapper);
auto renderer =
vtkSmartPointer<vtkRenderer>::New();
auto renderWindow =
vtkSmartPointer<vtkRenderWindow>::New();
renderWindow->SetSize(640, 480);
renderWindow->AddRenderer(renderer);
auto renderWindowInteractor =
vtkSmartPointer<vtkRenderWindowInteractor>::New();
renderWindowInteractor->SetRenderWindow(renderWindow);
renderer->AddActor(actor);
renderWindow->Render();
renderWindowInteractor->Start();
return EXIT_SUCCESS;
}