You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

165 lines
4.9 KiB
C++

/*=========================================================================
Program: Visualization Toolkit
Module: vtkDijkstraGraphGeodesicPath.h
Copyright (c) Ken Martin, Will Schroeder, Bill Lorensen
All rights reserved.
See Copyright.txt or http://www.kitware.com/Copyright.htm for details.
This software is distributed WITHOUT ANY WARRANTY; without even
the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
PURPOSE. See the above copyright notice for more information.
=========================================================================*/
/**
* @class vtkDijkstraGraphGeodesicPath
* @brief Dijkstra algorithm to compute the graph geodesic.
*
* Takes as input a polygonal mesh and performs a single source shortest
* path calculation. Dijkstra's algorithm is used. The implementation is
* similar to the one described in Introduction to Algorithms (Second Edition)
* by Thomas H. Cormen, Charles E. Leiserson, Ronald L. Rivest, and
* Cliff Stein, published by MIT Press and McGraw-Hill. Some minor
* enhancement are added though. All vertices are not pushed on the heap
* at start, instead a front set is maintained. The heap is implemented as
* a binary heap. The output of the filter is a set of lines describing
* the shortest path from StartVertex to EndVertex. If a path cannot be found
* the output will have no lines or points.
*
* @warning
* The input polydata must have only triangle cells.
*
* @par Thanks:
* The class was contributed by Rasmus Paulsen.
* www.imm.dtu.dk/~rrp/VTK . Also thanks to Alexandre Gouaillard and Shoaib
* Ghias for bug fixes and enhancements.
*/
#ifndef vtkDijkstraGraphGeodesicPath_h
#define vtkDijkstraGraphGeodesicPath_h
#include "vtkFiltersModelingModule.h" // For export macro
#include "vtkGraphGeodesicPath.h"
class vtkDijkstraGraphInternals;
class vtkIdList;
class VTKFILTERSMODELING_EXPORT vtkDijkstraGraphGeodesicPath : public vtkGraphGeodesicPath
{
public:
/**
* Instantiate the class
*/
static vtkDijkstraGraphGeodesicPath* New();
//@{
/**
* Standard methods for printing and determining type information.
*/
vtkTypeMacro(vtkDijkstraGraphGeodesicPath, vtkGraphGeodesicPath);
void PrintSelf(ostream& os, vtkIndent indent) override;
//@}
//@{
/**
* The vertex ids (of the input polydata) on the shortest path
*/
vtkGetObjectMacro(IdList, vtkIdList);
//@}
//@{
/**
* Stop when the end vertex is reached
* or calculate shortest path to all vertices
*/
vtkSetMacro(StopWhenEndReached, vtkTypeBool);
vtkGetMacro(StopWhenEndReached, vtkTypeBool);
vtkBooleanMacro(StopWhenEndReached, vtkTypeBool);
//@}
//@{
/**
* Use scalar values in the edge weight (experimental)
*/
vtkSetMacro(UseScalarWeights, vtkTypeBool);
vtkGetMacro(UseScalarWeights, vtkTypeBool);
vtkBooleanMacro(UseScalarWeights, vtkTypeBool);
//@}
//@{
/**
* Use the input point to repel the path by assigning high costs.
*/
vtkSetMacro(RepelPathFromVertices, vtkTypeBool);
vtkGetMacro(RepelPathFromVertices, vtkTypeBool);
vtkBooleanMacro(RepelPathFromVertices, vtkTypeBool);
//@}
//@{
/**
* Specify vtkPoints to use to repel the path from.
*/
virtual void SetRepelVertices(vtkPoints*);
vtkGetObjectMacro(RepelVertices, vtkPoints);
//@}
/**
* Fill the array with the cumulative weights.
*/
virtual void GetCumulativeWeights(vtkDoubleArray* weights);
protected:
vtkDijkstraGraphGeodesicPath();
~vtkDijkstraGraphGeodesicPath() override;
int RequestData(vtkInformation*, vtkInformationVector**, vtkInformationVector*) override;
// Build a graph description of the input.
virtual void BuildAdjacency(vtkDataSet* inData);
vtkTimeStamp AdjacencyBuildTime;
// The fixed cost going from vertex u to v.
virtual double CalculateStaticEdgeCost(vtkDataSet* inData, vtkIdType u, vtkIdType v);
// The cost going from vertex u to v that may depend on one or more vertices
// that precede u.
virtual double CalculateDynamicEdgeCost(vtkDataSet*, vtkIdType, vtkIdType) { return 0.0; }
void Initialize(vtkDataSet* inData);
void Reset();
// Calculate shortest path from vertex startv to vertex endv.
virtual void ShortestPath(vtkDataSet* inData, int startv, int endv);
// Relax edge u,v with weight w.
void Relax(const int& u, const int& v, const double& w);
// Backtrace the shortest path
void TraceShortestPath(
vtkDataSet* inData, vtkPolyData* outPoly, vtkIdType startv, vtkIdType endv);
// The number of vertices.
int NumberOfVertices;
// The vertex ids on the shortest path.
vtkIdList* IdList;
// Internalized STL containers.
vtkDijkstraGraphInternals* Internals;
vtkTypeBool StopWhenEndReached;
vtkTypeBool UseScalarWeights;
vtkTypeBool RepelPathFromVertices;
vtkPoints* RepelVertices;
private:
vtkDijkstraGraphGeodesicPath(const vtkDijkstraGraphGeodesicPath&) = delete;
void operator=(const vtkDijkstraGraphGeodesicPath&) = delete;
};
#endif