vtkPolydata连通区域分析```cpp
//这个程序的编写过程和目的:
//1.自定义了两个polydata
//2.将上述两个polyda组合成一个
//3.提取组合体的连通域
//4.标记各个连通域并统计各个连通域的坐标
#include <vtkAutoInit.h>
VTK_MODULE_INIT(vtkRenderingOpenGL2);
VTK_MODULE_INIT(vtkInteractionStyle);
VTK_MODULE_INIT(vtkRenderingFreeType);
VTK_MODULE_INIT(vtkRenderingVolumeOpenGL2);
#include “vtkPolyDataMapper.h”
#include “vtkWin32OpenGLRenderWindow.h”
#include “vtkRenderWindow.h”
#include “vtkRenderWindowInteractor.h”
#include “vtkRenderer.h”
#include “vtkPoints.h”
#include “vtkWin32RenderWindowInteractor.h”
#include “vtkProperty.h”
#include “vtkFloatArray.h”
#include “vtkPolyData.h”
#include “vtkDataSetMapper.h”
#include “vtkActor2D.h”
#include “vtkContourFilter.h”
#include “vtkContourValues.h”
#include “vtkUnstructuredGrid.h”
#include “vtkPointData.h”
#include “vtkTriangle.h”
#include <vtkSmartPointer.h>
#include<vtkInteractorStyleTrackballCamera.h>
#include <vtkPolyDataConnectivityFilter.h>
#include<vtkAppendPolyData.h>
#include
#include <vtkCleanPolyData.h>
using namespace std;
struct coord
{
double x, y, z;
};
void main()
{
//四个点构成几何结构
vtkPoints* points = vtkPoints::New();
points->InsertNextPoint(1.0, 0.0, 0.0);
points->InsertNextPoint(2.0, 0.0, 0.0);
points->InsertNextPoint(0.0, 2.0, 0.0);
points->InsertNextPoint(0.0, 0.0, 2.0);
//四个面构成拓扑结构
vtkTriangle* tran1 = vtkTriangle::New();
tran1->GetPointIds()->SetId(0, 0);
tran1->GetPointIds()->SetId(1, 1);
tran1->GetPointIds()->SetId(2, 2);
vtkTriangle* tran2 = vtkTriangle::New();
tran2->GetPointIds()->SetId(0, 0);
tran2->GetPointIds()->SetId(1, 1);
tran2->GetPointIds()->SetId(2, 3);
vtkTriangle* tran3 = vtkTriangle::New();
tran3->GetPointIds()->SetId(0, 0);
tran3->GetPointIds()->SetId(1, 2);
tran3->GetPointIds()->SetId(2, 3);
vtkTriangle* tran4 = vtkTriangle::New();
tran4->GetPointIds()->SetId(0, 1);
tran4->GetPointIds()->SetId(1, 2);
tran4->GetPointIds()->SetId(2, 3);
vtkCellArray* cells = vtkCellArray::New();
cells->InsertNextCell(tran1);
cells->InsertNextCell(tran2);
cells->InsertNextCell(tran3);
cells->InsertNextCell(tran4);
vtkPolyData* source = vtkPolyData::New();
source->SetPoints(points);
source->SetPolys(cells);
vtkPolyDataMapper* coneMapper = vtkPolyDataMapper::New();
coneMapper->SetInputData(source);
vtkActor* coneActor = vtkActor::New();
coneActor->SetMapper(coneMapper);
vtkRenderer* render = vtkRenderer::New();
vtkRenderWindow* renwin = vtkRenderWindow::New();
vtkRenderWindowInteractor* iren = vtkRenderWindowInteractor::New();
//render->AddActor(coneActor);
render->SetBackground(0.8, 0.4, 0.4);
renwin->AddRenderer(render);
/************第2个vtkpolydata**************/
vtkPoints* points1 = vtkPoints::New();
points1->InsertNextPoint(5.0, 0.0, 0.0);
points1->InsertNextPoint(4.0, 0.0, 0.0);
points1->InsertNextPoint(0.0, 3.0, 0.0);
points1->InsertNextPoint(0.0, 0.0, 6.0);
//四个面是拓扑结构
vtkTriangle* tran11 = vtkTriangle::New();
tran11->GetPointIds()->SetId(0, 0);
tran11->GetPointIds()->SetId(1, 1);
tran11->GetPointIds()->SetId(2, 2);
vtkTriangle* tran21 = vtkTriangle::New();
tran21->GetPointIds()->SetId(0, 0);
tran21->GetPointIds()->SetId(1, 1);
tran21->GetPointIds()->SetId(2, 3);
vtkTriangle* tran31 = vtkTriangle::New();
tran31->GetPointIds()->SetId(0, 0);
tran31->GetPointIds()->SetId(1, 2);
tran31->GetPointIds()->SetId(2, 3);
vtkTriangle* tran41 = vtkTriangle::New();
tran41->GetPointIds()->SetId(0, 1);
tran41->GetPointIds()->SetId(1, 2);
tran41->GetPointIds()->SetId(2, 3);
vtkCellArray* cells1 = vtkCellArray::New();
cells1->InsertNextCell(tran1);
cells1->InsertNextCell(tran2);
cells1->InsertNextCell(tran3);
cells1->InsertNextCell(tran4);
vtkPolyData* source1 = vtkPolyData::New();
source1->SetPoints(points1);
source1->SetPolys(cells1);
vtkPolyDataMapper* coneMapper1 = vtkPolyDataMapper::New();
coneMapper1->SetInputData(source1);
vtkActor* coneActor1 = vtkActor::New();
coneActor1->SetMapper(coneMapper1);
//render->AddActor(coneActor1);
render->SetBackground(0.8, 0.4, 0.0);
renwin->AddRenderer(render);
/*******************合并两个polydata**********************/
// combine two poly data
vtkSmartPointer<vtkAppendPolyData> appendFilter =
vtkSmartPointer<vtkAppendPolyData>::New();
appendFilter->AddInputData(source1);
appendFilter->AddInputData(source);
appendFilter->Update();
// Remove any duplicate points.
vtkSmartPointer<vtkCleanPolyData> cleanFilter =
vtkSmartPointer<vtkCleanPolyData>::New();
cleanFilter->SetInputConnection(appendFilter->GetOutputPort());
cleanFilter->Update();
//Create a mapper and actor
vtkSmartPointer<vtkPolyDataMapper> appendmapper =
vtkSmartPointer<vtkPolyDataMapper>::New();
appendmapper->SetInputConnection(cleanFilter->GetOutputPort());
vtkSmartPointer<vtkActor> appendactor =
vtkSmartPointer<vtkActor>::New();
appendactor->SetMapper(appendmapper);
render->AddActor(appendactor);
/*************************提取并查看连通区域******************************/
int cc = source->GetNumberOfPoints();
cout << "cc=" << cc << endl;
vtkSmartPointer<vtkPolyDataConnectivityFilter> connectFilter1 =
vtkSmartPointer<vtkPolyDataConnectivityFilter>::New();
//connectFilter1->SetInputData(source);
connectFilter1->SetInputData(cleanFilter->GetOutput());
connectFilter1->SetExtractionModeToAllRegions();//提取所有连通区域
connectFilter1->ColorRegionsOn();//该模式主要用于连通区域标记,配合函数ColorRegionsOn()使用,在连通区域像是的同时,生成一个名为RegionId的点属性数据。
connectFilter1->MarkVisitedPointIdsOn();
connectFilter1->Update();
int regionNum = connectFilter1->GetNumberOfExtractedRegions();
cout<< "总连通区域个数:" << regionNum<<endl;
coord c[8] = { { 0 } };
int sum[8] = { 0 };//存储每个连通域包含的点的个数
int temp = 0;
int mm = connectFilter1->GetOutput()->GetNumberOfPoints();
cout << "所有连通域总的点个数" << mm << endl;
for (int i = 0; i<mm; ++i)
{
int regionId = connectFilter1->GetOutput()->GetPointData()->GetScalars()->GetTuple1(i);//连通区域的索引编号
cout << "regionId" << regionId << endl;
double *xyz = connectFilter1->GetOutput()->GetPoint(i);//连通域中每个点的坐标
if (regionId == temp)//将属于各自连通域的坐标累加存储
{
sum[temp]++;
c[temp].x += xyz[0];
c[temp].y += xyz[1];
c[temp].z += xyz[2];
}
else
{
temp++;
}
}
iren->SetRenderWindow(renwin);
iren->Initialize();
iren->Start();
points->Delete();
tran1->Delete();
tran2->Delete();
tran3->Delete();
tran4->Delete();
cells->Delete();
source->Delete();
coneMapper->Delete();
coneActor->Delete();
render->Delete();
renwin->Delete();
iren->Delete();
}