vtkPolydata连通区域分析

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();

}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值