版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/xs1997/article/details/89760840
#include <vtkSphereSource.h>
#include <vtkProperty.h>
#include <vtkPolyData.h>
#include <vtkSmartPointer.h>
#include <vtkPolyDataMapper.h>
#include <vtkActor.h>
#include <vtkRenderWindow.h>
#include <vtkRenderer.h>
#include <vtkRenderWindowInteractor.h>
#include <vtkDijkstraGraphGeodesicPath.h>
#include <vtkSTLReader.h>
#include <vtkIncrementalOctreePointLocator.h>
int main(int, char *[])
{
// Read a stl file.
vtkSmartPointer<vtkPolyData> input1 = vtkSmartPointer<vtkPolyData>::New();
vtkSmartPointer<vtkSTLReader> reader1 = vtkSmartPointer<vtkSTLReader>::New();
reader1->SetFileName("test.stl");
reader1->Update();
input1->DeepCopy(reader1->GetOutput());
input1->DeepCopy(reader1->GetOutput());
vtkSmartPointer<vtkIncrementalOctreePointLocator> kDTree1 = vtkSmartPointer<vtkIncrementalOctreePointLocator>::New();
kDTree1->SetDataSet(input1);
kDTree1->BuildLocator();
double startPos[3] = { 1117.23626, 1113.58595, 1131.53410 };//牙齿模型上的一点的位置
double endPos[3] = { 1117.77440, 1113.27432, 1129.65420 };//牙齿模型上的一点的位置
int startId = kDTree1->FindClosestPoint(startPos);
int endId = kDTree1->FindClosestPoint(endPos);
vtkSmartPointer<vtkDijkstraGraphGeodesicPath> dijkstra =
vtkSmartPointer<vtkDijkstraGraphGeodesicPath>::New();
dijkstra->SetInputData(reader1->GetOutput());
dijkstra->SetStartVertex(startId);
dijkstra->SetEndVertex(endId);
dijkstra->Update();
vtkSmartPointer<vtkPolyDataMapper> pathMapper =
vtkSmartPointer<vtkPolyDataMapper>::New();
pathMapper->SetInputData(dijkstra->GetOutput());
vtkSmartPointer<vtkActor> pathActor =
vtkSmartPointer<vtkActor>::New();
pathActor->SetMapper(pathMapper);
pathActor->GetProperty()->SetColor(1, 0, 0);
pathActor->GetProperty()->SetLineWidth(4);
vtkSmartPointer<vtkPolyDataMapper> mapper =
vtkSmartPointer<vtkPolyDataMapper>::New();
mapper->SetInputData(reader1->GetOutput());
vtkSmartPointer<vtkActor> actor =
vtkSmartPointer<vtkActor>::New();
actor->SetMapper(mapper);
vtkSmartPointer<vtkRenderer> renderer =
vtkSmartPointer<vtkRenderer>::New();
renderer->AddActor(actor);
renderer->AddActor(pathActor);
renderer->SetBackground(1.0, 1.0, 1.0);
vtkSmartPointer<vtkRenderWindow> renderWindow =
vtkSmartPointer<vtkRenderWindow>::New();
renderWindow->AddRenderer(renderer);
renderWindow->SetSize(640, 480);
renderWindow->Render();
renderWindow->SetWindowName("PolyDataGeodesic");
vtkSmartPointer<vtkRenderWindowInteractor> renderWindowInteractor =
vtkSmartPointer<vtkRenderWindowInteractor>::New();
renderWindowInteractor->SetRenderWindow(renderWindow);
renderWindow->Render();
renderWindowInteractor->Start();
return EXIT_SUCCESS;
}