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
165 lines
4.9 KiB
C
3 weeks ago
|
/*=========================================================================
|
||
|
|
||
|
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
|