相信大家对曲线并不陌生,在生活学习中都会接触到。同样,在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; }