VTK  9.7.0
vtkPolyhedron.h
Go to the documentation of this file.
1// SPDX-FileCopyrightText: Copyright (c) Ken Martin, Will Schroeder, Bill Lorensen
2// SPDX-License-Identifier: BSD-3-Clause
127
128#ifndef vtkPolyhedron_h
129#define vtkPolyhedron_h
130
131#include "vtkCell3D.h"
132#include "vtkCellStatus.h" // For enum.
133#include "vtkCommonDataModelModule.h" // For export macro
134#include "vtkDeprecation.h" // VTK_DEPRECATED_IN_9_6_0()
135#include "vtkNew.h" // For vtkNew
136
137VTK_ABI_NAMESPACE_BEGIN
138class vtkIdTypeArray;
139class vtkCellArray;
140class vtkTriangle;
141class vtkQuad;
142class vtkTetra;
143class vtkPolygon;
144class vtkLine;
145class vtkEdgeTable;
146class vtkPolyData;
147class vtkCellLocator;
148class vtkGenericCell;
151
152class VTKCOMMONDATAMODEL_EXPORT vtkPolyhedron : public vtkCell3D
153{
154public:
155 using vtkPointIdMap = std::map<vtkIdType, vtkIdType>;
156
159
161
165 vtkTypeMacro(vtkPolyhedron, vtkCell3D);
166 void PrintSelf(ostream& os, vtkIndent indent) override;
168
170
174 void GetEdgePoints(vtkIdType vtkNotUsed(edgeId), const vtkIdType*& vtkNotUsed(pts)) override
175 {
176 vtkWarningMacro(<< "vtkPolyhedron::GetEdgePoints Not Implemented");
177 }
178 vtkIdType GetFacePoints(vtkIdType faceId, const vtkIdType*& pts) override;
180 vtkIdType vtkNotUsed(edgeId), const vtkIdType*& vtkNotUsed(pts)) override
181 {
182 vtkWarningMacro(<< "vtkPolyhedron::GetEdgeToAdjacentFaces Not Implemented");
183 }
185 vtkIdType vtkNotUsed(faceId), const vtkIdType*& vtkNotUsed(faceIds)) override
186 {
187 vtkWarningMacro(<< "vtkPolyhedron::GetFaceToAdjacentFaces Not Implemented");
188 return 0;
189 }
191 vtkIdType vtkNotUsed(pointId), const vtkIdType*& vtkNotUsed(edgeIds)) override
192 {
193 vtkWarningMacro(<< "vtkPolyhedron::GetPointToIncidentEdges Not Implemented");
194 return 0;
195 }
196 vtkIdType GetPointToIncidentFaces(vtkIdType pointId, const vtkIdType*& faceIds) override;
198 vtkIdType vtkNotUsed(pointId), const vtkIdType*& vtkNotUsed(pts)) override
199 {
200 vtkWarningMacro(<< "vtkPolyhedron::GetPointToOneRingPoints Not Implemented");
201 return 0;
202 }
203 bool GetCentroid(double centroid[3]) const override;
204
212
216 int GetCellType() override { return VTK_POLYHEDRON; }
217
221 int RequiresInitialization() override { return 1; }
222
228 void Initialize() override;
229
231
235 int GetNumberOfEdges() override;
236 vtkCell* GetEdge(int) override;
237 int GetNumberOfFaces() override;
238 vtkCell* GetFace(int faceId) override;
240
246 void Contour(double value, vtkDataArray* scalars, vtkIncrementalPointLocator* locator,
247 vtkCellArray* verts, vtkCellArray* lines, vtkCellArray* polys, vtkPointData* inPd,
248 vtkPointData* outPd, vtkCellData* inCd, vtkIdType cellId, vtkCellData* outCd) override;
249
259 void Clip(double value, vtkDataArray* scalars, vtkIncrementalPointLocator* locator,
260 vtkCellArray* connectivity, vtkPointData* inPd, vtkPointData* outPd, vtkCellData* inCd,
261 vtkIdType cellId, vtkCellData* outCd, int insideOut) override;
262
270 void ClipWithContext(double value, vtkDataArray* scalars, vtkIncrementalPointLocator* locator,
271 vtkCellArray* connectivity, vtkPointData* inPd, vtkPointData* outPd, vtkCellData* inCd,
272 vtkIdType cellId, vtkCellData* outCd, int insideOut, vtkCellArray* outFaces,
273 vtkCellArray* outFaceLocs);
274
279 void ClipWithContext(double value, vtkDataArray* scalars, vtkIncrementalPointLocator* locator,
280 vtkCellArray* connectivity, vtkPointData* inPd, vtkPointData* outPd, vtkCellData* inCd,
281 vtkIdType cellId, vtkCellData* outCd, int insideOut, vtkUnstructuredGrid* outUG);
282
290 int EvaluatePosition(const double x[3], double closestPoint[3], int& subId, double pcoords[3],
291 double& dist2, double weights[]) override;
292
297 void EvaluateLocation(int& subId, const double pcoords[3], double x[3], double* weights) override;
298
305 int IntersectWithLine(const double p1[3], const double p2[3], double tol, double& t, double x[3],
306 double pcoords[3], int& subId) override;
307
323 int TriangulateLocalIds(int index, vtkIdList* ptIds) override;
324
332
340
349 int subId, const double pcoords[3], const double* values, int dim, double* derivs) override;
350
355 int CellBoundary(int subId, const double pcoords[3], vtkIdList* pts) override;
356
361 int GetParametricCenter(double pcoords[3]) override;
362
366 int IsPrimaryCell() VTK_FUTURE_CONST override { return 1; }
367
369
374 void InterpolateFunctions(const double x[3], double* sf) override;
375 void InterpolateDerivs(const double x[3], double* derivs) override;
377
383 int RequiresExplicitFaceRepresentation() VTK_FUTURE_CONST override { return 1; }
384
402 VTK_DEPRECATED_IN_9_6_0("This function is deprecated, use SetCellFaces")
403 void SetFaces(vtkIdType* faces);
404
421 VTK_DEPRECATED_IN_9_6_0("This function is deprecated, use GetCellFaces")
423
432
434
443
450 int IsInside(const double x[3], double tolerance);
451
468 bool IsConvex();
469 Status IsConvex(double planarThreshold);
470
475
479 void ShallowCopy(vtkCell* c) override;
480
484 void DeepCopy(vtkCell* c) override;
485
486protected:
488 ~vtkPolyhedron() override;
489
490 // Internal classes for supporting operations on this cell
496
497 // Filled with the SetFaces method.
498 // These faces are numbered in global id space
500
501 // VTK_DEPRECATED_IN_9_6_0()
502 // Backward compatibility
504
505 // If edges are needed. Note that the edge numbering is in canonical space.
506 int EdgesGenerated = 0; // true/false
507 vtkNew<vtkEdgeTable> EdgeTable; // keep track of all edges
508 vtkNew<vtkIdTypeArray> Edges; // edge pairs kept in this list, in canonical id space
509 vtkNew<vtkIdTypeArray> EdgeFaces; // face pairs that comprise each edge, with the
510 // same ordering as EdgeTable
511 int GenerateEdges(); // method populates the edge table and edge array
512
513 // Numerous methods needs faces to be numbered in the canonical space.
514 // This method uses PointIdMap to fill the Faces member (faces described
515 // with canonical IDs) from the GlobalFaces member (faces described with
516 // global IDs).
518 vtkNew<vtkCellArray> Faces; // These are numbered in canonical id space
519 int FacesGenerated = 0; // True when Faces have been successfully constructed
520
521 // Bounds management
524 void ComputeParametricCoordinate(const double x[3], double pc[3]);
525 void ComputePositionFromParametricCoordinate(const double pc[3], double x[3]);
526
527 // Members for supporting geometric operations
536
537private:
538 vtkPolyhedron(const vtkPolyhedron&) = delete;
539 void operator=(const vtkPolyhedron&) = delete;
540
543
544 // vtkCell has the data members Points (x,y,z coordinates) and PointIds (global cell ids).
545 // These data members are implicitly organized in canonical space, i.e., where the cell
546 // point ids are (0,1,...,npts-1).
547 // The PointIdMap is constructed during the call of the Initialize() method and maps global
548 // point ids to the canonical point ids.
549 vtkPointIdMap PointIdMap;
550
551 void GeneratePointToIncidentFaces();
552
553 // This variant of GenerateEdges() always regenerates edges but also populates
554 // \a unevenCoedges with a map from edge ID to the signed number of mismatched coedges.
555 int GenerateEdges(std::map<vtkIdType, int>& unevenCoedges);
556
557 // Members used in GetPointToIncidentFaces
558 std::vector<std::vector<vtkIdType>> PointToIncidentFaces;
559};
560
561VTK_ABI_NAMESPACE_END
562#endif
object to represent cell connectivity
represent and manipulate cell attribute data
Definition vtkCellData.h:32
octree-based spatial search object to quickly locate cells
keep track of edges (edge is pair of integer id's)
provides thread-safe access to cells
list of point or cell ids
Definition vtkIdList.h:26
dynamic, self-adjusting array of vtkIdType
Abstract class in support of both point location and point insertion.
a simple class to control print indentation
Definition vtkIndent.h:29
cell represents a 1D line
Definition vtkLine.h:23
Allocate and hold a VTK object.
Definition vtkNew.h:59
represent and manipulate point attribute data
concrete dataset represents vertices, lines, polygons, and triangle strips
Definition vtkPolyData.h:72
a cell that represents an n-sided polygon
Definition vtkPolygon.h:40
Isosurface extraction using López polygon tracing algorithm.
vtkNew< vtkLine > Line
vtkIdType GetFacePoints(vtkIdType faceId, const vtkIdType *&pts) override
See vtkCell3D API for description of these methods.
void GetEdgePoints(vtkIdType edgeId, const vtkIdType *&pts) override
See vtkCell3D API for description of these methods.
vtkIdType GetPointToIncidentFaces(vtkIdType pointId, const vtkIdType *&faceIds) override
See vtkCell3D API for description of these methods.
vtkCellArray * GetCellFaces()
Get the faces of the polyhedron.
vtkNew< vtkCellArray > GlobalFaces
int SetCellFaces(vtkCellArray *faces)
Set the faces of the polyhedron.
void SetFaces(vtkIdType *faces)
Set the faces of the polyhedron.
void ShallowCopy(vtkCell *c) override
Shallow copy of a polyhedron.
vtkIdType GetFaceToAdjacentFaces(vtkIdType faceId, const vtkIdType *&faceIds) override
See vtkCell3D API for description of these methods.
int GenerateEdges()
int GetNumberOfFaces() override
A polyhedron is represented internally by a set of polygonal faces.
vtkNew< vtkTetra > Tetra
int EvaluatePosition(const double x[3], double closestPoint[3], int &subId, double pcoords[3], double &dist2, double weights[]) override
Satisfy the vtkCell API.
int IntersectWithLine(const double p1[3], const double p2[3], double tol, double &t, double x[3], double pcoords[3], int &subId) override
Intersect the line (p1,p2) with a given tolerance tol to determine a point of intersection x[3] with ...
vtkCellStatus Status
Adopt vtkCellStatus to describe degenerate polyhedral cells.
vtkNew< vtkTriangle > Triangle
std::map< vtkIdType, vtkIdType > vtkPointIdMap
int TriangulateLocalIds(int index, vtkIdList *ptIds) override
Use vtkOrderedTriangulator to tetrahedralize the polyhedron mesh.
void GenerateFaces()
friend class vtkPolyhedronContour
void ComputeParametricCoordinate(const double x[3], double pc[3])
vtkNew< vtkPolyData > PolyData
int TriangulateFaces(vtkIdList *newFaces)
Triangulate each face of the polyhedron.
void ComputeBounds()
vtkIdType GetPointToIncidentEdges(vtkIdType pointId, const vtkIdType *&edgeIds) override
See vtkCell3D API for description of these methods.
vtkNew< vtkQuad > Quad
vtkNew< vtkGenericCell > Cell
void EvaluateLocation(int &subId, const double pcoords[3], double x[3], double *weights) override
The inverse of EvaluatePosition.
vtkNew< vtkPolygon > Polygon
void InterpolateFunctions(const double x[3], double *sf) override
Compute the interpolation functions/derivatives (aka shape functions/derivatives).
int RequiresExplicitFaceRepresentation() VTK_FUTURE_CONST override
Satisfy the vtkCell API.
void Contour(double value, vtkDataArray *scalars, vtkIncrementalPointLocator *locator, vtkCellArray *verts, vtkCellArray *lines, vtkCellArray *polys, vtkPointData *inPd, vtkPointData *outPd, vtkCellData *inCd, vtkIdType cellId, vtkCellData *outCd) override
Satisfy the vtkCell API.
vtkIdType * GetFaces()
Get the faces of the polyhedron.
int IsInside(const double x[3], double tolerance)
A method particular to vtkPolyhedron.
vtkNew< vtkIdTypeArray > LegacyGlobalFaces
bool GetCentroid(double centroid[3]) const override
See vtkCell3D API for description of these methods.
int GetParametricCenter(double pcoords[3]) override
Return the center of the cell in parametric coordinates.
int TriangulateFaces(vtkCellArray *newFaces)
Triangulate each face of the polyhedron.
void InterpolateDerivs(const double x[3], double *derivs) override
Compute the interpolation functions/derivatives (aka shape functions/derivatives).
bool IsConvex()
Determine whether or not a polyhedron is convex.
int IsPrimaryCell() VTK_FUTURE_CONST override
A polyhedron is a full-fledged primary cell.
vtkNew< vtkIdTypeArray > EdgeFaces
void ConstructPolyData()
void ClipWithContext(double value, vtkDataArray *scalars, vtkIncrementalPointLocator *locator, vtkCellArray *connectivity, vtkPointData *inPd, vtkPointData *outPd, vtkCellData *inCd, vtkIdType cellId, vtkCellData *outCd, int insideOut, vtkCellArray *outFaces, vtkCellArray *outFaceLocs)
Clip this polyhedron and write faces directly into outFaces and outFaceLocs, bypassing the embedded f...
int GetNumberOfEdges() override
A polyhedron is represented internally by a set of polygonal faces.
void PrintSelf(ostream &os, vtkIndent indent) override
Standard new methods.
void GetEdgeToAdjacentFaces(vtkIdType edgeId, const vtkIdType *&pts) override
See vtkCell3D API for description of these methods.
vtkPolyData * GetPolyData()
Construct polydata if no one exist, then return this->PolyData.
vtkNew< vtkCellArray > Faces
vtkIdType GetPointToOneRingPoints(vtkIdType pointId, const vtkIdType *&pts) override
See vtkCell3D API for description of these methods.
vtkCell * GetEdge(int) override
A polyhedron is represented internally by a set of polygonal faces.
void ClipWithContext(double value, vtkDataArray *scalars, vtkIncrementalPointLocator *locator, vtkCellArray *connectivity, vtkPointData *inPd, vtkPointData *outPd, vtkCellData *inCd, vtkIdType cellId, vtkCellData *outCd, int insideOut, vtkUnstructuredGrid *outUG)
Convenience overload of ClipWithContext that extracts outFaces and outFaceLocs from the given output ...
vtkCell * GetFace(int faceId) override
A polyhedron is represented internally by a set of polygonal faces.
void DeepCopy(vtkCell *c) override
Deep copy of a polyhedron.
void ConstructLocator()
void Derivatives(int subId, const double pcoords[3], const double *values, int dim, double *derivs) override
Computes derivatives at the point specified by the parameter coordinate.
vtkNew< vtkIdList > CellIds
int RequiresInitialization() override
This cell requires that it be initialized prior to access.
friend class vtkPolyhedronUtilities
void ComputePositionFromParametricCoordinate(const double pc[3], double x[3])
static vtkPolyhedron * New()
Standard new methods.
vtkNew< vtkCellLocator > CellLocator
double ComputeVolume()
Compute the volume of the polyhedron using the divergence theorem.
int GetCellType() override
See the vtkCell API for descriptions of these methods.
int CellBoundary(int subId, const double pcoords[3], vtkIdList *pts) override
Find the boundary face closest to the point defined by the pcoords[3] and subId of the cell (subId ca...
vtkNew< vtkEdgeTable > EdgeTable
vtkNew< vtkIdTypeArray > Edges
void Clip(double value, vtkDataArray *scalars, vtkIncrementalPointLocator *locator, vtkCellArray *connectivity, vtkPointData *inPd, vtkPointData *outPd, vtkCellData *inCd, vtkIdType cellId, vtkCellData *outCd, int insideOut) override
Satisfy the vtkCell API.
void Initialize() override
The Initialize method builds up internal structures of vtkPolyhedron.
a cell that represents a 2D quadrilateral
Definition vtkQuad.h:28
a 3D cell that represents a tetrahedron
Definition vtkTetra.h:34
a cell that represents a triangle
Definition vtkTriangle.h:28
dataset represents arbitrary combinations of all possible cell types
vtkCellStatus
Diagnostic values indicating how well-specified a cell is.
@ VTK_POLYHEDRON
Definition vtkCellType.h:80
#define vtkDataArray
#define VTK_DEPRECATED_IN_9_6_0(reason)
int vtkIdType
Definition vtkType.h:363