1. 效果:
2.简介:
可以实现在多边形上进行交互,选择;在多边形曲面上实现轮廓点的交互绘制。
该类的使用需要结合 vtkPolygonalSurfacePointPlacer 类,定位点的功能也就是拾取器。
前提:输入的多边形曲面需要计算法向量。
3.源码:
#include <vtkActor.h>
#include <vtkCamera.h>
#include <vtkContourWidget.h>
#include <vtkNamedColors.h>
#include <vtkNew.h>
#include <vtkOrientedGlyphContourRepresentation.h>
#include <vtkPolyData.h>
#include <vtkPolyDataCollection.h>
#include <vtkPolyDataMapper.h>
#include <vtkPolygonalSurfaceContourLineInterpolator.h>
#include <vtkPolygonalSurfacePointPlacer.h>
#include <vtkProperty.h>
#include <vtkRenderWindow.h>
#include <vtkRenderWindowInteractor.h>
#include <vtkRenderer.h>
#include <vtkSmartPointer.h>
#include <vtkSphereSource.h>
#include <vtkTriangleFilter.h>
#include <vtkXMLPolyDataReader.h>int main(int argc, char* argv[])
{vtkNew<vtkNamedColors> colors;vtkSmartPointer<vtkPolyData> polyData;if (argc < 2){vtkNew<vtkSphereSource> sphereSource;sphereSource->SetThetaResolution(40);sphereSource->SetPhiResolution(20);sphereSource->Update();polyData = sphereSource->GetOutput();}else{vtkNew<vtkXMLPolyDataReader> reader;reader->SetFileName(argv[1]);reader->Update();polyData = reader->GetOutput();}// The Dijkistra interpolator will not accept cells that aren't triangles.vtkNew<vtkTriangleFilter> triangleFilter;triangleFilter->SetInputData(polyData);triangleFilter->Update();auto pd = triangleFilter->GetOutput();// Create a mapper and actor.vtkNew<vtkPolyDataMapper> mapper;mapper->SetInputConnection(triangleFilter->GetOutputPort());vtkNew<vtkActor> actor;actor->SetMapper(mapper);actor->GetProperty()->SetInterpolationToFlat();actor->GetProperty()->SetColor(colors->GetColor3d("MistyRose").GetData());// Create the render window, renderer and interactor.vtkNew<vtkRenderer> renderer;vtkNew<vtkRenderWindow> renderWindow;renderWindow->AddRenderer(renderer);renderWindow->SetWindowName("PolygonalSurfaceContourLineInterpolator");vtkNew<vtkRenderWindowInteractor> interactor;interactor->SetRenderWindow(renderWindow);// Add the actors to the renderer, set the background and size.renderer->AddActor(actor);renderer->SetBackground(colors->GetColor3d("CadetBlue").GetData());// Here comes the contour widget stuff...vtkNew<vtkContourWidget> contourWidget;contourWidget->SetInteractor(interactor);vtkSmartPointer<vtkOrientedGlyphContourRepresentation> rep =dynamic_cast<vtkOrientedGlyphContourRepresentation*>(contourWidget->GetRepresentation());rep->GetLinesProperty()->SetColor(colors->GetColor3d("Crimson").GetData());rep->GetLinesProperty()->SetLineWidth(3.0);vtkNew<vtkPolygonalSurfacePointPlacer> pointPlacer;pointPlacer->AddProp(actor);pointPlacer->GetPolys()->AddItem(pd);rep->SetPointPlacer(pointPlacer);vtkNew<vtkPolygonalSurfaceContourLineInterpolator> interpolator;interpolator->GetPolys()->AddItem(pd);rep->SetLineInterpolator(interpolator);renderWindow->Render();interactor->Initialize();contourWidget->EnabledOn();interactor->Start();return EXIT_SUCCESS;
}
4.使用场景
可以用来做任意曲面切割:
曲面拟合主要用的贝塞尔曲面,交互部分用
vtkPolygonalSurfacePointPlacer,
vtkPolygonalSurfaceContourLineInterpolator
也可使用
vtkOrientedGlyphContourRepresentation
以及自定义的vtk3DWidget子类