vtk曲线插值 vtkParametricSpline

我的VTK/ITK文章列表

曲线插值是输入一些点之后,vtk可以生成一条曲线穿过这些点

其中,设置//spline->ClosedOff();这里取消注释就会生成闭合曲线,可以自己试试。


#include "vtkActor.h"

#include "vtkCamera.h"

#include "vtkCellArray.h"

#include "vtkPoints.h"

#include "vtkPolyData.h"

#include "vtkPolyDataMapper.h"

#include "vtkRenderWindow.h"

#include "vtkRenderWindowInteractor.h"

#include "vtkRenderer.h" 

#include "vtkProperty.h"

#include "vtkTubeFilter.h"

#include "vtkParametricSpline.h"

#include "vtkParametricFunctionSource.h"
#include "CommonTools/CommonTools.h"

int main()
{
	vtkPoints *points = vtkPoints::New();
	points->InsertPoint(0, 0.0, 0.0, 0.0);
	points->InsertPoint(1, 1.0, 1.0, 1.0);
	points->InsertPoint(2, 1.0, 0.0, 0.0);
	points->InsertPoint(3, 1.0, 0.0, 1.0);

	//插值为样条曲线

	vtkParametricSpline *spline = vtkParametricSpline::New();
	spline->SetPoints(points);
	//spline->ClosedOff();

	vtkParametricFunctionSource *splineSource = vtkParametricFunctionSource::New();
	splineSource->SetParametricFunction(spline);
	splineSource->Update();

	CommonTools::SavePolyData(splineSource->GetOutput(), "E:/1/source.vtk");


	vtkPolyDataMapper *splineMapper = vtkPolyDataMapper::New();
	splineMapper->SetInputConnection(splineSource->GetOutputPort());


	vtkActor *splineActor = vtkActor::New();
	splineActor->SetMapper(splineMapper);
	splineActor->GetProperty()->SetColor(0.3800, 0.7000, 0.1600);


	vtkTubeFilter *tube = vtkTubeFilter::New();
	tube->SetInputData(splineSource->GetOutput());
	tube->SetNumberOfSides(20);
	tube->SetRadius(0.2);
	tube->Update();

	CommonTools::SavePolyData(tube->GetOutput(), "E:/1/source2.vtk");

	vtkPolyDataMapper *tubeMapper = vtkPolyDataMapper::New();
	tubeMapper->SetInputData(tube->GetOutput());
	vtkActor *tubeActor = vtkActor::New();
	tubeActor->SetMapper(tubeMapper);

	vtkRenderer *ren1 = vtkRenderer::New();
	vtkRenderWindow *renWin = vtkRenderWindow::New();
	renWin->AddRenderer(ren1);
	vtkRenderWindowInteractor *iren = vtkRenderWindowInteractor::New();
	iren->SetRenderWindow(renWin);
	ren1->AddActor(splineActor);
	ren1->AddActor(tubeActor);
	ren1->SetBackground(1, 1, 1);
	renWin->SetSize(250, 250);
	renWin->Render();
	iren->Start();

	return 0;

}

 

	void SavePolyData(vtkSmartPointer<vtkPolyData> polydata, const std::string& file)
	{
		vtkSmartPointer<vtkPolyDataWriter> pngWriter = vtkSmartPointer<vtkPolyDataWriter>::New();
		pngWriter->SetFileName(file.c_str());/*"test.vtk"*/
		pngWriter->SetInputData(polydata);
		pngWriter->Write();
	}

输出:

vtk曲线插值 vtkParametricSpline

 vtk曲线插值 vtkParametricSpline

 vtk曲线插值 vtkParametricSpline

 可以同时看到中间拟合的曲线和外围生成的弯曲圆柱体