// SPDX-FileCopyrightText: Copyright (c) Ken Martin, Will Schroeder, Bill Lorensen // SPDX-License-Identifier: BSD-3-Clause /** * @class vtkReebGraphVolumeSkeletonFilter * @brief compute a skeletal embedding of the * Reeb graph of a scalar field defined on a tetrahedral mesh * (vtkUnstructuredGrid). * * The filter takes a vtkUnstructuredGrid as an input (port 0), along with a * vtkReebGraph (port 1). * The filter samples each arc of the Reeb graph and embeds the samples on the * barycenter of the corresponding field contour. * The number of (evenly distributed) arc samples can be defined with * SetNumberOfSamples() (default value: 10). * The skeleton can be optionally smoothed with SetNumberOfSmoothingIterations() * (default value: 10). * The filter will first try to pull as a scalar field the vtkDataArray with Id * 'FieldId' of the vtkPolyData, see SetFieldId() (default: 0). The filter will * abort if this field does not exist. * * The filter outputs a vtkTable of points (double[3]). Each column contains the * samples (sorted by function value) of the corresponding arc. The first and * the last entry of the column corresponds to the critical nodes at the * extremity of the arc (each column has NumberOfSamples + 2 entries). * * The skeleton can be rendered by linking the samples with geometrical * primitives (for instance, spheres at critical nodes and cylinders between * intermediary samples, see Graphics/Testing/Cxx/TestReebGraph.cxx). * */ #ifndef vtkReebGraphVolumeSkeletonFilter_h #define vtkReebGraphVolumeSkeletonFilter_h #include "vtkDataObjectAlgorithm.h" #include "vtkFiltersReebGraphModule.h" // For export macro VTK_ABI_NAMESPACE_BEGIN class vtkReebGraph; class vtkTable; class VTKFILTERSREEBGRAPH_EXPORT vtkReebGraphVolumeSkeletonFilter : public vtkDataObjectAlgorithm { public: static vtkReebGraphVolumeSkeletonFilter* New(); vtkTypeMacro(vtkReebGraphVolumeSkeletonFilter, vtkDataObjectAlgorithm); void PrintSelf(ostream& os, vtkIndent indent) override; ///@{ /** * Set the number of samples along each arc of the Reeb graph * Default value: 5 */ vtkSetMacro(NumberOfSamples, int); vtkGetMacro(NumberOfSamples, int); ///@} ///@{ /** * Set the number of optional smoothing iterations * Default value: 30 */ vtkSetMacro(NumberOfSmoothingIterations, int); vtkGetMacro(NumberOfSmoothingIterations, int); ///@} ///@{ /** * Set the scalar field Id * Default value: 0 */ vtkSetMacro(FieldId, vtkIdType); vtkGetMacro(FieldId, vtkIdType); ///@} vtkTable* GetOutput(); protected: vtkReebGraphVolumeSkeletonFilter(); ~vtkReebGraphVolumeSkeletonFilter() override; vtkIdType FieldId; int NumberOfSamples, NumberOfSmoothingIterations; int FillInputPortInformation(int portNumber, vtkInformation*) override; int FillOutputPortInformation(int portNumber, vtkInformation* info) override; int RequestData(vtkInformation* request, vtkInformationVector** inputVector, vtkInformationVector* outputVector) override; private: vtkReebGraphVolumeSkeletonFilter(const vtkReebGraphVolumeSkeletonFilter&) = delete; void operator=(const vtkReebGraphVolumeSkeletonFilter&) = delete; }; VTK_ABI_NAMESPACE_END #endif