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.

203 lines
7.0 KiB
C++

/*=========================================================================
Program: Visualization Toolkit
Module: vtkStaticCleanPolyData.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 vtkStaticCleanPolyData
* @brief merge duplicate points, and/or remove unused points and/or remove degenerate cells
*
* vtkStaticCleanPolyData is a filter that takes polygonal data as input and
* generates polygonal data as output. vtkStaticCleanPolyData will merge
* duplicate points (within specified tolerance), and if enabled, transform
* degenerate cells into appropriate forms (for example, a triangle is
* converted into a line if two points of triangle are merged).
*
* Conversion of degenerate cells is controlled by the flags
* ConvertLinesToPoints, ConvertPolysToLines, ConvertStripsToPolys which act
* cumulatively such that a degenerate strip may become a poly.
* The full set is
* Line with 1 points -> Vert (if ConvertLinesToPoints)
* Poly with 2 points -> Line (if ConvertPolysToLines)
* Poly with 1 points -> Vert (if ConvertPolysToLines && ConvertLinesToPoints)
* Strp with 3 points -> Poly (if ConvertStripsToPolys)
* Strp with 2 points -> Line (if ConvertStripsToPolys && ConvertPolysToLines)
* Strp with 1 points -> Vert (if ConvertStripsToPolys && ConvertPolysToLines
* && ConvertLinesToPoints)
*
* Internally this class uses vtkStaticPointLocator, which is a threaded, and
* much faster locator than the incremental locators that vtkCleanPolyData
* uses. Note because of these and other differences, the output of this
* filter may be different than vtkCleanPolyData.
*
* Note that if you want to remove points that aren't used by any cells
* (i.e., disable point merging), then use vtkCleanPolyData.
*
* @warning
* Merging points can alter topology, including introducing non-manifold
* forms. The tolerance should be chosen carefully to avoid these problems.
* Large tolerances (of size > locator bin width) may generate poor results.
*
* @warning
* Merging close points with tolerance >0.0 is inherently an unstable problem
* because the results are order dependent (e.g., the order in which points
* are processed). When parallel computing, the order of processing points is
* unpredictable, hence the results may vary between runs.
*
* @warning
* If you wish to operate on a set of coordinates that has no cells, you must
* add a vtkPolyVertex cell with all of the points to the PolyData (or use a
* vtkVertexGlyphFilter) before using the vtkStaticCleanPolyData filter.
*
* @warning
* This class has been threaded with vtkSMPTools. Using TBB or other
* non-sequential type (set in the CMake variable
* VTK_SMP_IMPLEMENTATION_TYPE) may improve performance significantly.
*
* @sa
* vtkCleanPolyData
*/
#ifndef vtkStaticCleanPolyData_h
#define vtkStaticCleanPolyData_h
#include "vtkFiltersCoreModule.h" // For export macro
#include "vtkPolyDataAlgorithm.h"
class vtkStaticPointLocator;
class VTKFILTERSCORE_EXPORT vtkStaticCleanPolyData : public vtkPolyDataAlgorithm
{
public:
//@{
/**
* Standard methods to instantiate, print, and provide type information.
*/
static vtkStaticCleanPolyData* New();
void PrintSelf(ostream& os, vtkIndent indent) override;
vtkTypeMacro(vtkStaticCleanPolyData, vtkPolyDataAlgorithm);
//@}
//@{
/**
* By default ToleranceIsAbsolute is false and Tolerance is
* a fraction of Bounding box diagonal, if true, AbsoluteTolerance is
* used when adding points to locator (merging)
*/
vtkSetMacro(ToleranceIsAbsolute, vtkTypeBool);
vtkBooleanMacro(ToleranceIsAbsolute, vtkTypeBool);
vtkGetMacro(ToleranceIsAbsolute, vtkTypeBool);
//@}
//@{
/**
* Specify tolerance in terms of fraction of bounding box length. Default
* is 0.0. This takes effect only if ToleranceIsAbsolute is false.
*/
vtkSetClampMacro(Tolerance, double, 0.0, 1.0);
vtkGetMacro(Tolerance, double);
//@}
//@{
/**
* Specify tolerance in absolute terms. Default is 1.0.
*/
vtkSetClampMacro(AbsoluteTolerance, double, 0.0, VTK_DOUBLE_MAX);
vtkGetMacro(AbsoluteTolerance, double);
//@}
//@{
/**
* Turn on/off conversion of degenerate lines to points. Default is On.
*/
vtkSetMacro(ConvertLinesToPoints, vtkTypeBool);
vtkBooleanMacro(ConvertLinesToPoints, vtkTypeBool);
vtkGetMacro(ConvertLinesToPoints, vtkTypeBool);
//@}
//@{
/**
* Turn on/off conversion of degenerate polys to lines. Default is On.
*/
vtkSetMacro(ConvertPolysToLines, vtkTypeBool);
vtkBooleanMacro(ConvertPolysToLines, vtkTypeBool);
vtkGetMacro(ConvertPolysToLines, vtkTypeBool);
//@}
//@{
/**
* Turn on/off conversion of degenerate strips to polys. Default is On.
*/
vtkSetMacro(ConvertStripsToPolys, vtkTypeBool);
vtkBooleanMacro(ConvertStripsToPolys, vtkTypeBool);
vtkGetMacro(ConvertStripsToPolys, vtkTypeBool);
//@}
// This filter is difficult to stream.
// To get invariant results, the whole input must be processed at once.
// This flag allows the user to select whether strict piece invariance
// is required. By default it is on. When off, the filter can stream,
// but results may change.
vtkSetMacro(PieceInvariant, vtkTypeBool);
vtkGetMacro(PieceInvariant, vtkTypeBool);
vtkBooleanMacro(PieceInvariant, vtkTypeBool);
//@{
/**
* Set/get the desired precision for the output types. See the documentation
* for the vtkAlgorithm::DesiredOutputPrecision enum for an explanation of
* the available precision settings.
*/
vtkSetMacro(OutputPointsPrecision, int);
vtkGetMacro(OutputPointsPrecision, int);
//@}
//@{
/**
* Retrieve the internal locator to manually configure it, for example
* specifying the number of points per bucket. This method is generally
* used for debugging or testing purposes.
*/
vtkStaticPointLocator* GetLocator() { return this->Locator; }
//@}
/**
* Get the MTime of this object also considering the locator.
*/
vtkMTimeType GetMTime() override;
protected:
vtkStaticCleanPolyData();
~vtkStaticCleanPolyData() override;
// Usual data generation method
int RequestData(vtkInformation*, vtkInformationVector**, vtkInformationVector*) override;
int RequestUpdateExtent(vtkInformation*, vtkInformationVector**, vtkInformationVector*) override;
double Tolerance;
double AbsoluteTolerance;
vtkTypeBool ConvertLinesToPoints;
vtkTypeBool ConvertPolysToLines;
vtkTypeBool ConvertStripsToPolys;
vtkTypeBool ToleranceIsAbsolute;
vtkStaticPointLocator* Locator;
vtkTypeBool PieceInvariant;
int OutputPointsPrecision;
private:
vtkStaticCleanPolyData(const vtkStaticCleanPolyData&) = delete;
void operator=(const vtkStaticCleanPolyData&) = delete;
};
#endif