vtkCell.h 11.6 KB
Newer Older
Will Schroeder's avatar
Will Schroeder committed
1
2
/*=========================================================================

Ken Martin's avatar
Ken Martin committed
3
  Program:   Visualization Toolkit
Ken Martin's avatar
Ken Martin committed
4
  Module:    vtkCell.h
Will Schroeder's avatar
Will Schroeder committed
5
6
7
8
  Language:  C++
  Date:      $Date$
  Version:   $Revision$

Ken Martin's avatar
Ken Martin committed
9

Ken Martin's avatar
Ken Martin committed
10
Copyright (c) 1993-1998 Ken Martin, Will Schroeder, Bill Lorensen.
Ken Martin's avatar
Ken Martin committed
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37

This software is copyrighted by Ken Martin, Will Schroeder and Bill Lorensen.
The following terms apply to all files associated with the software unless
explicitly disclaimed in individual files. This copyright specifically does
not apply to the related textbook "The Visualization Toolkit" ISBN
013199837-4 published by Prentice Hall which is covered by its own copyright.

The authors hereby grant permission to use, copy, and distribute this
software and its documentation for any purpose, provided that existing
copyright notices are retained in all copies and that this notice is included
verbatim in any distributions. Additionally, the authors grant permission to
modify this software and its documentation for any purpose, provided that
such modifications are not distributed without the explicit consent of the
authors and that existing copyright notices are retained in all copies. Some
of the algorithms implemented by this software are patented, observe all
applicable patent law.

IN NO EVENT SHALL THE AUTHORS OR DISTRIBUTORS BE LIABLE TO ANY PARTY FOR
DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES ARISING OUT
OF THE USE OF THIS SOFTWARE, ITS DOCUMENTATION, OR ANY DERIVATIVES THEREOF,
EVEN IF THE AUTHORS HAVE BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

THE AUTHORS AND DISTRIBUTORS SPECIFICALLY DISCLAIM ANY WARRANTIES, INCLUDING,
BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A
PARTICULAR PURPOSE, AND NON-INFRINGEMENT.  THIS SOFTWARE IS PROVIDED ON AN
"AS IS" BASIS, AND THE AUTHORS AND DISTRIBUTORS HAVE NO OBLIGATION TO PROVIDE
MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
Will Schroeder's avatar
Will Schroeder committed
38
39
40


=========================================================================*/
Ken Martin's avatar
Ken Martin committed
41
// .NAME vtkCell - abstract class to specify cell behavior
Will Schroeder's avatar
Will Schroeder committed
42
// .SECTION Description
Ken Martin's avatar
Ken Martin committed
43
// vtkCell is an abstract class that specifies the interfaces for data cells.
Will Schroeder's avatar
Will Schroeder committed
44
// Data cells are simple topological elements like points, lines, polygons, 
45
// and tetrahedra of which visualization datasets are composed. In some 
Will Schroeder's avatar
Will Schroeder committed
46
// cases visualization datasets may explicitly represent cells (e.g., 
Ken Martin's avatar
Ken Martin committed
47
48
// vtkPolyData, vtkUnstructuredGrid), and in some cases, the datasets are 
// implicitly composed of cells (e.g., vtkStructuredPoints).
49
// .SECTION Caveats
Will Schroeder's avatar
Will Schroeder committed
50
51
52
// The #define VTK_CELL_SIZE is a parameter used to construct cells and provide
// a general guideline for controlling object execution. This parameter is 
// not a hard boundary: you can create cells with more points.
Will Schroeder's avatar
Will Schroeder committed
53

54
55
56
57
// .SECTION See Also
// vtkHexahedron vtkLine vtkPixel vtkPolyLine vtkPolyVertex
// vtkPolygon vtkQuad vtkTetra vtkTriangle 
// vtkTriangleStrip vtkVertex vtkVoxel
Ken Martin's avatar
Ken Martin committed
58
59
#ifndef __vtkCell_h
#define __vtkCell_h
Will Schroeder's avatar
Will Schroeder committed
60

Will Schroeder's avatar
Will Schroeder committed
61
#define VTK_CELL_SIZE 512
Will Schroeder's avatar
Will Schroeder committed
62
#define VTK_TOL 1.e-05 // Tolerance for geometric calculation
63

Ken Martin's avatar
Ken Martin committed
64
#include "vtkObject.h"
65
66
#include "vtkPoints.h"
#include "vtkScalars.h"
Ken Martin's avatar
Ken Martin committed
67
#include "vtkIdList.h"
68
#include "vtkCellTypes.h"
69
#include "vtkFloatArray.h"
Will Schroeder's avatar
Will Schroeder committed
70

Ken Martin's avatar
Ken Martin committed
71
class vtkCellArray;
72
class vtkPointLocator;
Will Schroeder's avatar
Will Schroeder committed
73
class vtkPointData;
74
class vtkCellData;
Will Schroeder's avatar
Will Schroeder committed
75

Ken Martin's avatar
Ken Martin committed
76
class VTK_EXPORT vtkCell : public vtkObject
Will Schroeder's avatar
Will Schroeder committed
77
78
{
public:
Will Schroeder's avatar
Will Schroeder committed
79
  vtkCell();
Ken Martin's avatar
Ken Martin committed
80
  void Initialize(int npts, int *pts, vtkPoints *p);
81
  const char *GetClassName() {return "vtkCell";};
82
  void PrintSelf(ostream& os, vtkIndent indent);
Will Schroeder's avatar
Will Schroeder committed
83

84
  // Description:
85
86
  // Create concrete copy of this cell. Initially, the copy is made by performing
  // a ShallowCopy() operation.
Ken Martin's avatar
Ken Martin committed
87
  virtual vtkCell *MakeObject() = 0;
Will Schroeder's avatar
Will Schroeder committed
88

89
90
91
92
93
94
95
96
97
98
99
  // Description:
  // Copy this cell by reference counting the internal data structures. 
  // This is safe if you want a "read-only" copy. If you modify the cell
  // you might wish to use DeepCopy().
  virtual void ShallowCopy(vtkCell& c);

  // Description:
  // Copy this cell by completely copying internal data structures. This is
  // slower but safer than ShallowCopy().
  virtual void DeepCopy(vtkCell& c);

Will Schroeder's avatar
Will Schroeder committed
100
101
  // Description:
  // Return the type of cell.
Will Schroeder's avatar
Will Schroeder committed
102
  virtual int GetCellType() = 0;
Will Schroeder's avatar
Will Schroeder committed
103

Will Schroeder's avatar
Will Schroeder committed
104
105
  // Description:
  // Return the topological dimensional of the cell (0,1,2, or 3).
Will Schroeder's avatar
Will Schroeder committed
106
107
  virtual int GetCellDimension() = 0;

108
109
110
111
  // Description:
  // Return the interpolation order of the cell.
  virtual int GetInterpolationOrder() {return 1;}; //usually linear

Will Schroeder's avatar
Will Schroeder committed
112
113
  // Description:
  // Get the point coordinates for the cell.
114
  vtkPoints *GetPoints() {return &this->Points;};
Will Schroeder's avatar
Will Schroeder committed
115

Will Schroeder's avatar
Will Schroeder committed
116
117
  // Description:
  // Return the number of points in the cell.
Will Schroeder's avatar
Will Schroeder committed
118
  int GetNumberOfPoints() {return this->PointIds.GetNumberOfIds();};
Will Schroeder's avatar
Will Schroeder committed
119
120
121

  // Description:
  // Return the number of edges in the cell.
Will Schroeder's avatar
Will Schroeder committed
122
  virtual int GetNumberOfEdges() = 0;
Will Schroeder's avatar
Will Schroeder committed
123
124
125

  // Description:
  // Return the number of faces in the cell.
Will Schroeder's avatar
Will Schroeder committed
126
127
  virtual int GetNumberOfFaces() = 0;

Will Schroeder's avatar
Will Schroeder committed
128
  // Description:
129
  // Return the list of point ids defining the cell.
Ken Martin's avatar
Ken Martin committed
130
  vtkIdList *GetPointIds() {return &this->PointIds;};
Will Schroeder's avatar
Will Schroeder committed
131
132
133

  // Description:
  // For cell point i, return the actual point id.
Will Schroeder's avatar
Will Schroeder committed
134
  int GetPointId(int ptId) {return this->PointIds.GetId(ptId);};
Will Schroeder's avatar
Will Schroeder committed
135
136
137

  // Description:
  // Return the edge cell from the edgeId of the cell.
Ken Martin's avatar
Ken Martin committed
138
  virtual vtkCell *GetEdge(int edgeId) = 0;
Will Schroeder's avatar
Will Schroeder committed
139
140
141

  // Description:
  // Return the face cell from the faceId of the cell.
Ken Martin's avatar
Ken Martin committed
142
  virtual vtkCell *GetFace(int faceId) = 0;
Will Schroeder's avatar
Will Schroeder committed
143

Will Schroeder's avatar
Will Schroeder committed
144
145
146
147
148
149
  // Description:
  // Given parametric coordinates of a point, return the closest cell boundary,
  // and whether the point is inside or outside of the cell. The cell boundary 
  // is defined by a list of points (pts) that specify a face (3D cell), edge 
  // (2D cell), or vertex (1D cell). If the return value of the method is != 0, 
  // then the point is inside the cell.
Ken Martin's avatar
Ken Martin committed
150
  virtual int CellBoundary(int subId, float pcoords[3], vtkIdList& pts) = 0;
Will Schroeder's avatar
Will Schroeder committed
151

Will Schroeder's avatar
Will Schroeder committed
152
153
  // Description:
  // Given a point x[3] return inside(=1) or outside(=0) cell; evaluate 
Will Schroeder's avatar
Will Schroeder committed
154
  // parametric coordinates, sub-cell id (!=0 only if cell is composite),
155
156
  // distance squared of point x[3] to cell (in particular, the sub-cell 
  // indicated), closest point on cell to x[3], and interpolation weights 
Will Schroeder's avatar
Will Schroeder committed
157
158
159
160
161
162
163
164
165
  // in cell. (The number of weights is equal to the number of points
  // defining the cell). Note: on rare occasions a -1 is returned from the 
  // method. This means that numerical error has occurred and all data 
  // returned from this method should be ignored. Also, inside/outside 
  // is determine parametrically. That is, a point is inside if it 
  // satisfies parametric limits. This can cause problems for cells of 
  // topological dimension 2 or less, since a point in 3D can project 
  // onto the cell within parametric limits but be "far" from the cell. 
  // Thus the value dist2 may be checked to determine true in/out.
Will Schroeder's avatar
Will Schroeder committed
166
167
  virtual int EvaluatePosition(float x[3], float closestPoint[3], 
                               int& subId, float pcoords[3], 
Will Schroeder's avatar
Will Schroeder committed
168
                               float& dist2, float *weights) = 0;
169

Will Schroeder's avatar
Will Schroeder committed
170
  // Description:
Will Schroeder's avatar
Will Schroeder committed
171
172
  // Determine global coordinate (x[3]) from subId and parametric coordinates.
  // Also returns interpolation weights. (The number of weights is equal to
173
  // the number of points in the cell.)
Will Schroeder's avatar
Will Schroeder committed
174
  virtual void EvaluateLocation(int& subId, float pcoords[3], 
Will Schroeder's avatar
Will Schroeder committed
175
                                float x[3], float *weights) = 0;
176

Will Schroeder's avatar
Will Schroeder committed
177
  // Description:
Will Schroeder's avatar
Will Schroeder committed
178
179
180
181
182
183
  // Generate contouring primitives. The scalar list cellScalars are
  // scalar values at each cell point. The point locator is essentially a 
  // points list that merges points as they are inserted (i.e., prevents 
  // duplicates). Contouring primitives can be vertices, lines, or
  // polygons. It is possible to interpolate point data along the edge
  // by providing input and output point data - if outPd is NULL, then
184
185
186
187
188
  // no interpolation is performed. Also, if the output cell data is
  // non-NULL, the cell data from the contoured cell is passed to the
  // generated contouring primitives. (Note: the CopyAllocate() method
  // must be invoked on both the output cell and point data. The 
  // cellId refers to the cell from which the cell data is copied.)
189
  virtual void Contour(float value, vtkScalars *cellScalars, 
190
                       vtkPointLocator *locator, vtkCellArray *verts, 
Ken Martin's avatar
Ken Martin committed
191
                       vtkCellArray *lines, vtkCellArray *polys, 
192
193
                       vtkPointData *inPd, vtkPointData *outPd,
                       vtkCellData *inCd, int cellId, vtkCellData *outCd) = 0;
194

195
196
197
  // Description:
  // Cut (or clip) the cell based on the input cellScalars and the
  // specified value. The output of the clip operation will be one or
Will Schroeder's avatar
Will Schroeder committed
198
199
200
  // more cells of the same topological dimension as the original cell. 
  // The flag insideOut controls what part of the cell is considered inside - 
  // normally cell points whose scalar value is greater than "value" are
201
202
203
204
205
  // considered inside. If insideOut is on, this is reversed. Also, if the 
  // output cell data is non-NULL, the cell data from the clipped cell is 
  // passed to the generated contouring primitives. (Note: the CopyAllocate() 
  // method must be invoked on both the output cell and point data. The
  // cellId refers to the cell from which the cell data is copied.)
206
  virtual void Clip(float value, vtkScalars *cellScalars, 
207
                    vtkPointLocator *locator, vtkCellArray *connectivity,
208
209
210
                    vtkPointData *inPd, vtkPointData *outPd,
                    vtkCellData *inCd, int cellId, vtkCellData *outCd, 
                    int insideOut) = 0;
211

212
213
  // Description:
  // Intersect with a ray. Return parametric coordinates (both line and cell)
214
  // and global intersection coordinates, given ray definition and tolerance. 
215
216
217
218
  // The method returns non-zero value if intersection occurs.
  virtual int IntersectWithLine(float p1[3], float p2[3], float tol, float& t,
                                float x[3], float pcoords[3], int& subId) = 0;

219
220
221
222
223
224
225
  // Description:
  // Generate simplices of proper dimension. If cell is 3D, tetrahedron are 
  // generated; if 2D triangles; if 1D lines; if 0D points. The form of the
  // output is a sequence of points, each n+1 points (where n is topological 
  // cell dimension) defining a simplex. The index is a parameter that controls
  // which triangulation to use (if more than one is possible). If numerical
  // degeneracy encountered, 0 is returned, otherwise 1 is returned.
226
  virtual int Triangulate(int index, vtkIdList &ptIds, vtkPoints &pts) = 0;
227
228
229
230

  // Description:
  // Compute derivatives given cell subId and parametric coordinates. The values
  // array is a series of data value(s) at the cell points. There is a one-to-one
Bill Lorensen's avatar
Bill Lorensen committed
231
232
  // correspondence between cell point and data value(s). Dim is the number of 
  // data values per cell point. Derivs are derivatives in the x-y-z coordinate
233
234
235
  // directions for each data value. Thus, if computing derivatives for a 
  // scalar function in a hexahedron, dim=1, 8 values are supplied, and 3 deriv
  // values are returned (i.e., derivatives in x-y-z directions). On the other 
Bill Lorensen's avatar
Bill Lorensen committed
236
237
  // hand, if computing derivatives of velocity (vx,vy,vz) dim=3, 24 values are
  // supplied ((vx,vy,vz)1, (vx,vy,vz)2, ....()8), and 9 deriv values are
238
239
240
241
242
  // returned ((d(vx)/dx),(d(vx)/dy),(d(vx)/dz), (d(vy)/dx),(d(vy)/dy),
  // (d(vy)/dz), (d(vz)/dx),(d(vz)/dy),(d(vz)/dz)).
  virtual void Derivatives(int subId, float pcoords[3], float *values, 
                           int dim, float *derivs) = 0;

Will Schroeder's avatar
Will Schroeder committed
243
  void GetBounds(float bounds[6]);
244
  float *GetBounds();
Will Schroeder's avatar
Will Schroeder committed
245
246
  float GetLength2();

247
  // Quick intersection of cell bounding box.  Returns != 0 for hit.
248
249
  static char HitBBox(float bounds[6], float origin[3], float dir[3], 
                      float coord[3], float& t);
Will Schroeder's avatar
Will Schroeder committed
250

Will Schroeder's avatar
Will Schroeder committed
251
  // left public for quick computational access
252
  vtkPoints Points;
Ken Martin's avatar
Ken Martin committed
253
  vtkIdList PointIds;
Will Schroeder's avatar
Will Schroeder committed
254
255
256
257
258
259

};

#endif