VTK笔记——拟合样条曲线(Parametric Spline)

相信大家对曲线并不陌生,在生活学习中都会接触到。同样,在3D方面,曲线也很有用处。

什么是样条曲线

引用百度词条:

所谓样条曲线(Spline Curves)是指给定一组控制点而得到一条曲线,曲线的大致形状由这些点予以控制,一般可分为插值样条和逼近样条两种,插值样条通常用于数字化绘图或动画的设计,逼近样条一般用来构造物体的表面。

因此,要拟合一条曲线,控制点是必不可少的,通常点越多越好,但至少需要3个点,曲线的形状则是有曲线方程控制。

如何拟合插值样条曲线

4个点

示例代码:

#include <vtkPolyData.h>
#include <vtkSmartPointer.h>
#include <vtkPolyDataMapper.h>
#include <vtkActor.h>
#include <vtkRenderWindow.h>
#include <vtkRenderer.h>
#include <vtkRenderWindowInteractor.h>
#include <vtkProperty.h>
#include <vtkParametricSpline.h>
#include <vtkParametricFunctionSource.h>
#include <vtkSphereSource.h>
#include <vtkGlyph3DMapper.h>

int main(int, char *[])
{
	double p0[3] = { 1.0, 0.0, 0.0 };
	double p1[3] = { 0.0, 1.0, 0.0 };
	double p2[3] = { 0.0, 0.0, 1.0 };
	double p3[3] = { 1.0, 2.0, 3.0 };

	vtkSmartPointer<vtkPoints> points =
		vtkSmartPointer<vtkPoints>::New();
	points->InsertNextPoint(p0);
	points->InsertNextPoint(p1);
	points->InsertNextPoint(p2);
	points->InsertNextPoint(p3);

	vtkSmartPointer<vtkParametricSpline> spline =
		vtkSmartPointer<vtkParametricSpline>::New();
	spline->SetPoints(points);

	vtkSmartPointer<vtkParametricFunctionSource> functionSource =
		vtkSmartPointer<vtkParametricFunctionSource>::New();
	functionSource->SetParametricFunction(spline);
	functionSource->Update();

	vtkSmartPointer<vtkPolyDataMapper> splineMapper =
		vtkSmartPointer<vtkPolyDataMapper>::New();
	splineMapper->SetInputConnection(functionSource->GetOutputPort());

	vtkSmartPointer<vtkActor> splineActor =
		vtkSmartPointer<vtkActor>::New();
	splineActor->SetMapper(splineMapper);

	vtkSmartPointer<vtkSphereSource> sphereSource =
		vtkSmartPointer<vtkSphereSource>::New();
	sphereSource->SetPhiResolution(21);
	sphereSource->SetThetaResolution(21);
	sphereSource->SetRadius(.1);

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

	vtkSmartPointer<vtkGlyph3DMapper> splinePointsMapper =
		vtkSmartPointer<vtkGlyph3DMapper>::New();
	splinePointsMapper->SetInputData(splinePointsData);
	splinePointsMapper->SetSourceConnection(sphereSource->GetOutputPort());

	vtkSmartPointer<vtkActor> pointsActor =
		vtkSmartPointer<vtkActor>::New();
	pointsActor->SetMapper(splinePointsMapper);
	pointsActor->GetProperty()->SetColor(1, 0, 0);

	vtkSmartPointer<vtkRenderer> renderer =
		vtkSmartPointer<vtkRenderer>::New();
	vtkSmartPointer<vtkRenderWindow> renderWindow =
		vtkSmartPointer<vtkRenderWindow>::New();
	renderWindow->SetSize(600, 600);
	renderWindow->AddRenderer(renderer);
	vtkSmartPointer<vtkRenderWindowInteractor> renderWindowInteractor =
		vtkSmartPointer<vtkRenderWindowInteractor>::New();
	renderWindowInteractor->SetRenderWindow(renderWindow);

	renderer->AddActor(splineActor);
	renderer->AddActor(pointsActor);

	renderWindow->Render();
	renderWindowInteractor->Start();

	return EXIT_SUCCESS;
}

FYI:
vtk ParametricSpline example
样条曲线 百度百科
在这里插入图片描述