VTK  9.1.0
vtkHigherOrderWedge.h
Go to the documentation of this file.
1 /*=========================================================================
2 
3  Program: Visualization Toolkit
4  Module: vtkHigherOrderWedge.h
5 
6  Copyright (c) Ken Martin, Will Schroeder, Bill Lorensen
7  All rights reserved.
8  See Copyright.txt or http://www.kitware.com/Copyright.htm for details.
9 
10  This software is distributed WITHOUT ANY WARRANTY; without even
11  the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
12  PURPOSE. See the above copyright notice for more information.
13 
14 =========================================================================*/
34 #ifndef vtkHigherOrderWedge_h
35 #define vtkHigherOrderWedge_h
36 
37 #include <functional> //For std::function
38 
39 #include "vtkCellType.h" // For GetCellType.
40 #include "vtkCommonDataModelModule.h" // For export macro
41 #include "vtkDeprecation.h" // For deprecation macros
42 #include "vtkNew.h" // For member variable.
43 #include "vtkNonLinearCell.h"
44 #include "vtkSmartPointer.h" // For member variable.
45 
46 class vtkCellData;
47 class vtkDoubleArray;
48 class vtkWedge;
49 class vtkIdList;
50 class vtkPointData;
51 class vtkPoints;
52 class vtkVector3d;
53 class vtkVector3i;
58 
59 class VTKCOMMONDATAMODEL_EXPORT vtkHigherOrderWedge : public vtkNonLinearCell
60 {
61 public:
63  void PrintSelf(ostream& os, vtkIndent indent) override;
64 
65  int GetCellType() override = 0;
66  int GetCellDimension() override { return 3; }
67  int RequiresInitialization() override { return 1; }
68  int GetNumberOfEdges() override { return 9; }
69  int GetNumberOfFaces() override { return 5; }
70  vtkCell* GetEdge(int edgeId) override = 0;
71  void SetEdgeIdsAndPoints(int edgeId,
72  const std::function<void(const vtkIdType&)>& set_number_of_ids_and_points,
73  const std::function<void(const vtkIdType&, const vtkIdType&)>& set_ids_and_points);
74  vtkCell* GetFace(int faceId) override = 0;
75 
76  void Initialize() override;
77 
78  int CellBoundary(int subId, const double pcoords[3], vtkIdList* pts) override;
79  int EvaluatePosition(const double x[3], double closestPoint[3], int& subId, double pcoords[3],
80  double& dist2, double weights[]) override;
81  void EvaluateLocation(int& subId, const double pcoords[3], double x[3], double* weights) override;
82  void Contour(double value, vtkDataArray* cellScalars, vtkIncrementalPointLocator* locator,
83  vtkCellArray* verts, vtkCellArray* lines, vtkCellArray* polys, vtkPointData* inPd,
84  vtkPointData* outPd, vtkCellData* inCd, vtkIdType cellId, vtkCellData* outCd) override;
85  void Clip(double value, vtkDataArray* cellScalars, vtkIncrementalPointLocator* locator,
86  vtkCellArray* polys, vtkPointData* inPd, vtkPointData* outPd, vtkCellData* inCd,
87  vtkIdType cellId, vtkCellData* outCd, int insideOut) override;
88  int IntersectWithLine(const double p1[3], const double p2[3], double tol, double& t, double x[3],
89  double pcoords[3], int& subId) override;
90  int Triangulate(int index, vtkIdList* ptIds, vtkPoints* pts) override;
92  int subId, const double pcoords[3], const double* values, int dim, double* derivs) override;
94  double* GetParametricCoords() override;
95  int GetParametricCenter(double center[3]) override;
96 
97  double GetParametricDistance(const double pcoords[3]) override;
98 
99  virtual void SetOrderFromCellData(
100  vtkCellData* cell_data, const vtkIdType numPts, const vtkIdType cell_id);
101  virtual void SetUniformOrderFromNumPoints(const vtkIdType numPts);
102  virtual void SetOrder(const int s, const int t, const int u, const vtkIdType numPts);
103  virtual const int* GetOrder();
104  virtual int GetOrder(int i) { return this->GetOrder()[i]; }
105 
106  void InterpolateFunctions(const double pcoords[3], double* weights) override = 0;
107  void InterpolateDerivs(const double pcoords[3], double* derivs) override = 0;
108 
109  bool SubCellCoordinatesFromId(vtkVector3i& ijk, int subId);
110  bool SubCellCoordinatesFromId(int& i, int& j, int& k, int subId);
111  static int PointIndexFromIJK(int i, int j, int k, const int* order);
112  int PointIndexFromIJK(int i, int j, int k);
113  bool TransformApproxToCellParams(int subCell, double* pcoords);
114  bool TransformFaceToCellParams(int bdyFace, double* pcoords);
115 
116  static int GetNumberOfApproximatingWedges(const int* order);
118  {
120  }
121  VTK_DEPRECATED_IN_9_1_0("renamed to GetBoundaryQuad")
122  virtual vtkHigherOrderQuadrilateral* getBdyQuad();
123  virtual vtkHigherOrderQuadrilateral* GetBoundaryQuad() = 0;
124  VTK_DEPRECATED_IN_9_1_0("renamed to GetBoundaryTri")
125  virtual vtkHigherOrderTriangle* getBdyTri();
126  virtual vtkHigherOrderTriangle* GetBoundaryTri() = 0;
127  VTK_DEPRECATED_IN_9_1_0("renamed to GetEdgeCell")
128  virtual vtkHigherOrderCurve* getEdgeCell();
129  virtual vtkHigherOrderCurve* GetEdgeCell() = 0;
130  VTK_DEPRECATED_IN_9_1_0("renamed to GetInterpolation")
131  virtual vtkHigherOrderInterpolation* getInterp();
132  virtual vtkHigherOrderInterpolation* GetInterpolation() = 0;
133 
134 protected:
136  ~vtkHigherOrderWedge() override;
137 
138  vtkWedge* GetApprox();
139  void PrepareApproxData(
140  vtkPointData* pd, vtkCellData* cd, vtkIdType cellId, vtkDataArray* cellScalars);
141  vtkWedge* GetApproximateWedge(
142  int subId, vtkDataArray* scalarsIn = nullptr, vtkDataArray* scalarsOut = nullptr);
143 
144  void GetTriangularFace(vtkHigherOrderTriangle* result, int faceId,
145  const std::function<void(const vtkIdType&)>& set_number_of_ids_and_points,
146  const std::function<void(const vtkIdType&, const vtkIdType&)>& set_ids_and_points);
147  void GetQuadrilateralFace(vtkHigherOrderQuadrilateral* result, int faceId,
148  const std::function<void(const vtkIdType&)>& set_number_of_ids_and_points,
149  const std::function<void(const vtkIdType&, const vtkIdType&)>& set_ids_and_points);
150 
151  int Order[4];
152  vtkSmartPointer<vtkPoints> PointParametricCoordinates;
156  vtkNew<vtkDoubleArray> CellScalars;
158  vtkNew<vtkPoints> TmpPts;
159  vtkNew<vtkIdList> TmpIds;
160 
161 private:
162  vtkHigherOrderWedge(const vtkHigherOrderWedge&) = delete;
163  void operator=(const vtkHigherOrderWedge&) = delete;
164 };
165 
166 inline int vtkHigherOrderWedge::GetParametricCenter(double center[3])
167 {
168  center[0] = center[1] = 1. / 3.;
169  center[2] = 0.5;
170  return 0;
171 }
172 
173 #endif // vtkHigherOrderWedge_h
object to represent cell connectivity
Definition: vtkCellArray.h:181
represent and manipulate cell attribute data
Definition: vtkCellData.h:33
abstract class to specify cell behavior
Definition: vtkCell.h:58
virtual int GetParametricCenter(double pcoords[3])
Return center of the cell in parametric coordinates.
abstract superclass for arrays of numeric data
Definition: vtkDataArray.h:50
dynamic, self-adjusting array of double
A 2D cell that represents an arbitrary order HigherOrder triangle.
A 3D cell that represents an arbitrary order HigherOrder wedge.
int PointIndexFromIJK(int i, int j, int k)
bool TransformFaceToCellParams(int bdyFace, double *pcoords)
double * GetParametricCoords() override
Return a contiguous array of parametric coordinates of the points defining this cell.
void Contour(double value, vtkDataArray *cellScalars, vtkIncrementalPointLocator *locator, vtkCellArray *verts, vtkCellArray *lines, vtkCellArray *polys, vtkPointData *inPd, vtkPointData *outPd, vtkCellData *inCd, vtkIdType cellId, vtkCellData *outCd) override
Generate contouring primitives.
int CellBoundary(int subId, const double pcoords[3], vtkIdList *pts) override
Given parametric coordinates of a point, return the closest cell boundary, and whether the point is i...
virtual const int * GetOrder()
bool TransformApproxToCellParams(int subCell, double *pcoords)
void PrintSelf(ostream &os, vtkIndent indent) override
Methods invoked by print to print information about the object including superclasses.
bool SubCellCoordinatesFromId(vtkVector3i &ijk, int subId)
vtkCell * GetFace(int faceId) override=0
Return the face cell from the faceId of the cell.
static int GetNumberOfApproximatingWedges(const int *order)
virtual void SetUniformOrderFromNumPoints(const vtkIdType numPts)
void InterpolateDerivs(const double pcoords[3], double *derivs) override=0
int EvaluatePosition(const double x[3], double closestPoint[3], int &subId, double pcoords[3], double &dist2, double weights[]) override
Given a point x[3] return inside(=1), outside(=0) cell, or (-1) computational problem encountered; ev...
void InterpolateFunctions(const double pcoords[3], double *weights) override=0
double GetParametricDistance(const double pcoords[3]) override
Return the distance of the parametric coordinate provided to the cell.
vtkCell * GetEdge(int edgeId) override=0
Return the edge cell from the edgeId of the cell.
virtual int GetOrder(int i)
void Clip(double value, vtkDataArray *cellScalars, vtkIncrementalPointLocator *locator, vtkCellArray *polys, vtkPointData *inPd, vtkPointData *outPd, vtkCellData *inCd, vtkIdType cellId, vtkCellData *outCd, int insideOut) override
Cut (or clip) the cell based on the input cellScalars and the specified value.
static int PointIndexFromIJK(int i, int j, int k, const int *order)
int Triangulate(int index, vtkIdList *ptIds, vtkPoints *pts) override
Generate simplices of proper dimension.
int GetCellDimension() override
Return the topological dimensional of the cell (0,1,2, or 3).
int GetNumberOfEdges() override
Return the number of edges in the cell.
int GetCellType() override=0
Return the type of cell.
virtual void SetOrderFromCellData(vtkCellData *cell_data, const vtkIdType numPts, const vtkIdType cell_id)
int GetNumberOfFaces() override
Return the number of faces in the cell.
void SetEdgeIdsAndPoints(int edgeId, const std::function< void(const vtkIdType &)> &set_number_of_ids_and_points, const std::function< void(const vtkIdType &, const vtkIdType &)> &set_ids_and_points)
bool SubCellCoordinatesFromId(int &i, int &j, int &k, int subId)
virtual void SetOrder(const int s, const int t, const int u, const vtkIdType numPts)
int RequiresInitialization() override
Some cells require initialization prior to access.
int IntersectWithLine(const double p1[3], const double p2[3], double tol, double &t, double x[3], double pcoords[3], int &subId) override
Intersect with a ray.
void Initialize() override
void Derivatives(int subId, const double pcoords[3], const double *values, int dim, double *derivs) override
Compute derivatives given cell subId and parametric coordinates.
void EvaluateLocation(int &subId, const double pcoords[3], double x[3], double *weights) override
Determine global coordinate (x[3]) from subId and parametric coordinates.
list of point or cell ids
Definition: vtkIdList.h:31
Abstract class in support of both point location and point insertion.
a simple class to control print indentation
Definition: vtkIndent.h:34
Allocate and hold a VTK object.
Definition: vtkNew.h:56
abstract superclass for non-linear cells
represent and manipulate point attribute data
Definition: vtkPointData.h:33
represent and manipulate 3D points
Definition: vtkPoints.h:34
Hold a reference to a vtkObjectBase instance.
a 3D cell that represents a linear wedge
Definition: vtkWedge.h:44
@ order
Definition: vtkX3D.h:446
@ function
Definition: vtkX3D.h:255
@ value
Definition: vtkX3D.h:226
@ center
Definition: vtkX3D.h:236
@ index
Definition: vtkX3D.h:252
#define VTK_DEPRECATED_IN_9_1_0(reason)
int vtkIdType
Definition: vtkType.h:332