vtk曲线插值 vtkParametricSpline
曲线插值是输入一些点之后,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();
}
输出:
可以同时看到中间拟合的曲线和外围生成的弯曲圆柱体