VTK笔记——拟合样条曲线(Parametric Spline)
相信大家对曲线并不陌生,在生活学习中都会接触到。同样,在3D方面,曲线也很有用处。
什么是样条曲线
引用百度词条:
所谓样条曲线(Spline Curves)是指给定一组控制点而得到一条曲线,曲线的大致形状由这些点予以控制,一般可分为插值样条和逼近样条两种,插值样条通常用于数字化绘图或动画的设计,逼近样条一般用来构造物体的表面。
因此,要拟合一条曲线,控制点是必不可少的,通常点越多越好,但至少需要3个点,曲线的形状则是有曲线方程控制。
如何拟合插值样条曲线
示例代码:
#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;
}