基于VTK的Delaunay的三角剖分算法

实现效果:

开发环境:VS2015 + VTK5.10

#define vtkRenderingCore_AUTOINIT 4(vtkInteractionStyle,vtkRenderingFreeType,vtkRenderingFreeTypeOpenGL,vtkRenderingOpenGL) 
#define vtkRenderingVolume_AUTOINIT 1(vtkRenderingVolumeOpenGL)

#include <vtkSmartPointer.h>
#include <vtkPoints.h>
#include <vtkPolyData.h>
#include <vtkPointData.h>
#include <vtkDelaunay2D.h>
#include <vtkMath.h>
#include <vtkVertexGlyphFilter.h>
#include <vtkPolyDataMapper.h>
#include <vtkProperty.h>
#include <vtkActor.h>
#include <vtkRenderWindow.h>
#include <vtkRenderer.h>
#include <vtkRenderWindowInteractor.h>
#include "vtkCellArray.h"
#include "vtkInteractorStyleTrackballCamera.h"


using namespace std;


int main()
{
    
    

	unsigned int gridSize = 20;
	vtkSmartPointer<vtkPoints> points =
		vtkSmartPointer<vtkPoints>::New();

	for (unsigned int x = 0; x < gridSize; x++)
	{
    
    
		for (unsigned int y = 0; y < gridSize; y++)
		{
    
    
			points->InsertNextPoint(x, y, vtkMath::Random(0.0, 3.0));
		}
	}

	vtkSmartPointer<vtkPolyData> polydata =
		vtkSmartPointer<vtkPolyData>::New();
	polydata->SetPoints(points);

	vtkSmartPointer<vtkDelaunay2D> delaunay =
		vtkSmartPointer<vtkDelaunay2D>::New();
	delaunay->SetInput(polydata);
	delaunay->Update();

	vtkSmartPointer<vtkVertexGlyphFilter> glyphFilter =
		vtkSmartPointer<vtkVertexGlyphFilter>::New();
	glyphFilter->SetInput(polydata);
	glyphFilter->Update();

	vtkSmartPointer<vtkPolyDataMapper> pointsMapper =
		vtkSmartPointer<vtkPolyDataMapper>::New();
	pointsMapper->SetInput(glyphFilter->GetOutput());
	vtkSmartPointer<vtkActor> pointsActor =
		vtkSmartPointer<vtkActor>::New();
	pointsActor->SetMapper(pointsMapper);
	pointsActor->GetProperty()->SetPointSize(5);
	pointsActor->GetProperty()->SetColor(1, 0, 0);

	vtkSmartPointer<vtkPolyDataMapper> triangulatedMapper =
		vtkSmartPointer<vtkPolyDataMapper>::New();
	triangulatedMapper->SetInputConnection(delaunay->GetOutputPort());
	vtkSmartPointer<vtkActor> triangulatedActor =
		vtkSmartPointer<vtkActor>::New();
	triangulatedActor->SetMapper(triangulatedMapper);
	triangulatedActor->GetProperty()->SetColor(0, 0, 0);
	triangulatedActor->GetProperty()->EdgeVisibilityOn();
	triangulatedActor->GetProperty()->SetEdgeColor(1, 1, 1);

	int j = 0;
	vtkIdType npts, *pts;
	vtkCellArray* oCellArr = vtkCellArray::New();
	//输出每个三角形的索引,vtk是从左下角开始计数的
	//while (delaunay->GetOutput()->GetPolys()->GetNextCell(npts, pts)) {
    
    
	//	cout << "triangle [" << pts[0] << " " << pts[1] << " " << pts[2] <<
	//		"]" << endl;
	//}

	vtkSmartPointer<vtkRenderer> renderer =
		vtkSmartPointer<vtkRenderer>::New();
	renderer->AddActor(pointsActor);
	renderer->AddActor(triangulatedActor);
	renderer->SetBackground(0, 0, 0);

	vtkSmartPointer<vtkRenderWindow> renderWindow =
		vtkSmartPointer<vtkRenderWindow>::New();
	renderWindow->AddRenderer(renderer);
	renderWindow->SetSize(640, 640);
	renderWindow->Render();
	renderWindow->SetWindowName("PolyData Delaunay2D");

	vtkSmartPointer<vtkRenderWindowInteractor> renderWindowInteractor =
		vtkSmartPointer<vtkRenderWindowInteractor>::New();
	renderWindowInteractor->SetRenderWindow(renderWindow);

	vtkInteractorStyleTrackballCamera *style = vtkInteractorStyleTrackballCamera::New();
	renderWindowInteractor->SetInteractorStyle(style);

	renderWindowInteractor->Initialize();
	renderWindowInteractor->Start();

	return 0;
}

如果想获得每个三角面片的顶点索引,是用代码中delaunay->GetOutput()->GetPolys()->GetNextCell(npts, pts)这块实现的

参考文献

C++/Python:
Ref. 1.
Ref. 2
Ref. 3
VTK:
Ref. 4
Ref. 5
Ref. 6

猜你喜欢

转载自blog.csdn.net/qq_41598072/article/details/114282956