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.
243 lines
9.5 KiB
C++
243 lines
9.5 KiB
C++
/*=========================================================================
|
|
|
|
Program: Visualization Toolkit
|
|
Module: vtkCellValidator.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 vtkCellValidator
|
|
* @brief validates cells in a dataset
|
|
*
|
|
*
|
|
* vtkCellValidator accepts as input a dataset and adds integral cell data
|
|
* to it corresponding to the "validity" of each cell. The validity field
|
|
* encodes a bitfield for identifying problems that prevent a cell from standard
|
|
* use, including:
|
|
*
|
|
* WrongNumberOfPoints: filters assume that a cell has access to the
|
|
* appropriate number of points that comprise it. This
|
|
* assumption is often tacit, resulting in unexpected
|
|
* behavior when the condition is not met. This check
|
|
* simply confirms that the cell has the minimum number
|
|
* of points needed to describe it.
|
|
*
|
|
* IntersectingEdges: cells that incorrectly describe the order of their
|
|
* points often manifest with intersecting edges or
|
|
* intersecting faces. Given a tolerance, this check
|
|
* ensures that two edges from a two-dimensional cell
|
|
* are separated by at least the tolerance (discounting
|
|
* end-to-end connections).
|
|
*
|
|
* IntersectingFaces: cells that incorrectly describe the order of their
|
|
* points often manifest with intersecting edges or
|
|
* intersecting faces. Given a tolerance, this check
|
|
* ensures that two faces from a three-dimensional cell
|
|
* do not intersect.
|
|
*
|
|
* NoncontiguousEdges: another symptom of incorrect point ordering within a
|
|
* cell is the presence of noncontiguous edges where
|
|
* contiguous edges are otherwise expected. Given a
|
|
* tolerance, this check ensures that edges around the
|
|
* perimeter of a two-dimensional cell are contiguous.
|
|
*
|
|
* Nonconvex: many algorithms implicitly require that all input three-
|
|
* dimensional cells be convex. This check uses the generic
|
|
* convexity checkers implemented in vtkPolygon and vtkPolyhedron
|
|
* to test this requirement.
|
|
*
|
|
* FacesAreOrientedIncorrectly: All three-dimensional cells have an implicit
|
|
* expectation for the orientation of their
|
|
* faces. While the convention is unfortunately
|
|
* inconsistent across cell types, it is usually
|
|
* required that cell faces point outward. This
|
|
* check tests that the faces of a cell point in
|
|
* the direction required by the cell type,
|
|
* taking into account the cell types with
|
|
* nonstandard orientation requirements.
|
|
*
|
|
*
|
|
* @sa
|
|
* vtkCellQuality
|
|
*/
|
|
|
|
#ifndef vtkCellValidator_h
|
|
#define vtkCellValidator_h
|
|
|
|
#include "vtkDataSetAlgorithm.h"
|
|
#include "vtkFiltersGeneralModule.h" // For export macro
|
|
|
|
class vtkCell;
|
|
class vtkGenericCell;
|
|
class vtkEmptyCell;
|
|
class vtkVertex;
|
|
class vtkPolyVertex;
|
|
class vtkLine;
|
|
class vtkPolyLine;
|
|
class vtkTriangle;
|
|
class vtkTriangleStrip;
|
|
class vtkPolygon;
|
|
class vtkPixel;
|
|
class vtkQuad;
|
|
class vtkTetra;
|
|
class vtkVoxel;
|
|
class vtkHexahedron;
|
|
class vtkWedge;
|
|
class vtkPyramid;
|
|
class vtkPentagonalPrism;
|
|
class vtkHexagonalPrism;
|
|
class vtkQuadraticEdge;
|
|
class vtkQuadraticTriangle;
|
|
class vtkQuadraticQuad;
|
|
class vtkQuadraticPolygon;
|
|
class vtkQuadraticTetra;
|
|
class vtkQuadraticHexahedron;
|
|
class vtkQuadraticWedge;
|
|
class vtkQuadraticPyramid;
|
|
class vtkBiQuadraticQuad;
|
|
class vtkTriQuadraticHexahedron;
|
|
class vtkQuadraticLinearQuad;
|
|
class vtkQuadraticLinearWedge;
|
|
class vtkBiQuadraticQuadraticWedge;
|
|
class vtkBiQuadraticQuadraticHexahedron;
|
|
class vtkBiQuadraticTriangle;
|
|
class vtkCubicLine;
|
|
class vtkConvexPointSet;
|
|
class vtkPolyhedron;
|
|
class vtkLagrangeCurve;
|
|
class vtkLagrangeTriangle;
|
|
class vtkLagrangeQuadrilateral;
|
|
class vtkLagrangeTetra;
|
|
class vtkLagrangeHexahedron;
|
|
class vtkLagrangeWedge;
|
|
class vtkBezierCurve;
|
|
class vtkBezierTriangle;
|
|
class vtkBezierQuadrilateral;
|
|
class vtkBezierTetra;
|
|
class vtkBezierHexahedron;
|
|
class vtkBezierWedge;
|
|
|
|
class VTKFILTERSGENERAL_EXPORT vtkCellValidator : public vtkDataSetAlgorithm
|
|
{
|
|
public:
|
|
vtkTypeMacro(vtkCellValidator, vtkDataSetAlgorithm);
|
|
void PrintSelf(ostream& os, vtkIndent indent) override;
|
|
|
|
// Description:
|
|
// Construct to compute the validity of cells.
|
|
static vtkCellValidator* New();
|
|
|
|
enum State : short
|
|
{
|
|
Valid = 0x0,
|
|
WrongNumberOfPoints = 0x01,
|
|
IntersectingEdges = 0x02,
|
|
IntersectingFaces = 0x04,
|
|
NoncontiguousEdges = 0x08,
|
|
Nonconvex = 0x10,
|
|
FacesAreOrientedIncorrectly = 0x20,
|
|
};
|
|
|
|
friend inline State operator&(State a, State b)
|
|
{
|
|
return static_cast<State>(static_cast<short>(a) & static_cast<short>(b));
|
|
}
|
|
friend inline State operator|(State a, State b)
|
|
{
|
|
return static_cast<State>(static_cast<short>(a) | static_cast<short>(b));
|
|
}
|
|
friend inline State& operator&=(State& a, State b) { return a = a & b; }
|
|
|
|
friend inline State& operator|=(State& a, State b) { return a = a | b; }
|
|
|
|
static void PrintState(State state, ostream& os, vtkIndent indent);
|
|
|
|
static State Check(vtkGenericCell*, double tolerance);
|
|
static State Check(vtkCell*, double tolerance);
|
|
|
|
static State Check(vtkEmptyCell*, double tolerance);
|
|
static State Check(vtkVertex*, double tolerance);
|
|
static State Check(vtkPolyVertex*, double tolerance);
|
|
static State Check(vtkLine*, double tolerance);
|
|
static State Check(vtkPolyLine*, double tolerance);
|
|
static State Check(vtkTriangle*, double tolerance);
|
|
static State Check(vtkTriangleStrip*, double tolerance);
|
|
static State Check(vtkPolygon*, double tolerance);
|
|
static State Check(vtkPixel*, double tolerance);
|
|
static State Check(vtkQuad*, double tolerance);
|
|
static State Check(vtkTetra*, double tolerance);
|
|
static State Check(vtkVoxel*, double tolerance);
|
|
static State Check(vtkHexahedron*, double tolerance);
|
|
static State Check(vtkWedge*, double tolerance);
|
|
static State Check(vtkPyramid*, double tolerance);
|
|
static State Check(vtkPentagonalPrism*, double tolerance);
|
|
static State Check(vtkHexagonalPrism*, double tolerance);
|
|
static State Check(vtkQuadraticEdge*, double tolerance);
|
|
static State Check(vtkQuadraticTriangle*, double tolerance);
|
|
static State Check(vtkQuadraticQuad*, double tolerance);
|
|
static State Check(vtkQuadraticPolygon*, double tolerance);
|
|
static State Check(vtkQuadraticTetra*, double tolerance);
|
|
static State Check(vtkQuadraticHexahedron*, double tolerance);
|
|
static State Check(vtkQuadraticWedge*, double tolerance);
|
|
static State Check(vtkQuadraticPyramid*, double tolerance);
|
|
static State Check(vtkBiQuadraticQuad*, double tolerance);
|
|
static State Check(vtkTriQuadraticHexahedron*, double tolerance);
|
|
static State Check(vtkQuadraticLinearQuad*, double tolerance);
|
|
static State Check(vtkQuadraticLinearWedge*, double tolerance);
|
|
static State Check(vtkBiQuadraticQuadraticWedge*, double tolerance);
|
|
static State Check(vtkBiQuadraticQuadraticHexahedron*, double tolerance);
|
|
static State Check(vtkBiQuadraticTriangle*, double tolerance);
|
|
static State Check(vtkCubicLine*, double tolerance);
|
|
static State Check(vtkConvexPointSet*, double tolerance);
|
|
static State Check(vtkPolyhedron*, double tolerance);
|
|
static State Check(vtkLagrangeCurve*, double tolerance);
|
|
static State Check(vtkLagrangeTriangle*, double tolerance);
|
|
static State Check(vtkLagrangeQuadrilateral*, double tolerance);
|
|
static State Check(vtkLagrangeTetra*, double tolerance);
|
|
static State Check(vtkLagrangeHexahedron*, double tolerance);
|
|
static State Check(vtkLagrangeWedge*, double tolerance);
|
|
static State Check(vtkBezierCurve*, double tolerance);
|
|
static State Check(vtkBezierTriangle*, double tolerance);
|
|
static State Check(vtkBezierQuadrilateral*, double tolerance);
|
|
static State Check(vtkBezierTetra*, double tolerance);
|
|
static State Check(vtkBezierHexahedron*, double tolerance);
|
|
static State Check(vtkBezierWedge*, double tolerance);
|
|
|
|
//@{
|
|
/**
|
|
* Set/Get the tolerance. This value is used as an epsilon for floating point
|
|
* equality checks throughout the cell checking process. The default value is
|
|
* FLT_EPSILON.
|
|
*/
|
|
vtkSetClampMacro(Tolerance, double, 0.0, VTK_DOUBLE_MAX);
|
|
vtkGetMacro(Tolerance, double);
|
|
//@}
|
|
|
|
protected:
|
|
vtkCellValidator();
|
|
~vtkCellValidator() override {}
|
|
|
|
double Tolerance;
|
|
|
|
int RequestData(vtkInformation*, vtkInformationVector**, vtkInformationVector*) override;
|
|
|
|
static bool NoIntersectingEdges(vtkCell* cell, double tolerance);
|
|
static bool NoIntersectingFaces(vtkCell* cell, double tolerance);
|
|
static bool ContiguousEdges(vtkCell* twoDimensionalCell, double tolerance);
|
|
static bool Convex(vtkCell* cell, double tolerance);
|
|
static bool FacesAreOrientedCorrectly(vtkCell* threeDimensionalCell, double tolerance);
|
|
|
|
private:
|
|
vtkCellValidator(const vtkCellValidator&) = delete;
|
|
void operator=(const vtkCellValidator&) = delete;
|
|
};
|
|
|
|
#endif
|