VTK  9.4.20251007
vtkStructuredData.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
19
20#ifndef vtkStructuredData_h
21#define vtkStructuredData_h
22
23#include "vtkCommonDataModelModule.h" // For export macro
24#include "vtkObject.h"
25#include "vtkSmartPointer.h" // For vtkSmartPointer
26
27VTK_ABI_NAMESPACE_BEGIN
28class vtkDataArray;
29class vtkIdList;
30class vtkPoints;
33
34template <typename T>
36template <typename Type>
38template <typename Type>
40
41#define VTK_UNCHANGED 0
42#define VTK_SINGLE_POINT 1
43#define VTK_X_LINE 2
44#define VTK_Y_LINE 3
45#define VTK_Z_LINE 4
46#define VTK_XY_PLANE 5
47#define VTK_YZ_PLANE 6
48#define VTK_XZ_PLANE 7
49#define VTK_XYZ_GRID 8
50#define VTK_EMPTY 9
51
52class VTKCOMMONDATAMODEL_EXPORT vtkStructuredData : public vtkObject
53{
54public:
56 void PrintSelf(ostream& os, vtkIndent indent) override;
57
59
66 static int SetDimensions(VTK_FUTURE_CONST int inDim[3], int dim[3]);
67 static int SetExtent(VTK_FUTURE_CONST int inExt[6], int ext[6]);
69
71
75 static int GetDataDescription(int dims[3]);
76 static int GetDataDescriptionFromExtent(int ext[6]);
78
80
83 static int GetDataDimension(int dataDescription);
84 static int GetDataDimension(int ext[6]);
86
92 static vtkIdType GetNumberOfPoints(const int ext[6], int dataDescription = VTK_EMPTY);
93
99 static vtkIdType GetNumberOfCells(const int ext[6], int dataDescription = VTK_EMPTY);
100
107 const int pntExtent[6], int cellExtent[6], int dataDescription = VTK_EMPTY);
108
113 static void GetDimensionsFromExtent(
114 const int ext[6], int dims[3], int dataDescription = VTK_EMPTY);
115
119 static bool IsPointVisible(vtkIdType cellId, vtkUnsignedCharArray* ghosts);
120
124 static bool IsCellVisible(vtkIdType cellId, VTK_FUTURE_CONST int dimensions[3],
125 int dataDescription, vtkUnsignedCharArray* cellGhostArray,
126 vtkUnsignedCharArray* pointGhostArray = nullptr);
127
134 static void GetCellDimensionsFromExtent(
135 const int ext[6], int celldims[3], int dataDescription = VTK_EMPTY);
136
142 static void GetCellDimensionsFromPointDimensions(const int pntdims[3], int cellDims[3]);
143
151 const int ijk[3], const int ext[6], int lijk[3], int dataDescription = VTK_EMPTY);
152
159 const int lijk[3], const int ext[6], int ijk[3], int dataDescription = VTK_EMPTY);
160
164 static void GetCellPoints(vtkIdType cellId, vtkIdList* ptIds, int dataDescription, int dim[3]);
165
169 static void GetPointCells(vtkIdType ptId, vtkIdList* cellIds, VTK_FUTURE_CONST int dim[3]);
170
175 static void GetCellNeighbors(vtkIdType cellId, vtkIdList* ptIds, vtkIdList* cellIds, int dim[3]);
176 static void GetCellNeighbors(
177 vtkIdType cellId, vtkIdList* ptIds, vtkIdList* cellIds, int dim[3], int seedLoc[3]);
178
185 const int extent[6], const int ijk[3], int dataDescription = VTK_EMPTY);
186
193 const int extent[6], const int ijk[3], int dataDescription = VTK_EMPTY);
194
202 const int dim[3], const int ijk[3], int dataDescription = VTK_EMPTY);
203
211 const int dim[3], const int ijk[3], int dataDescription = VTK_EMPTY);
212
220 vtkIdType cellIdx, const int ext[6], int ijk[3], int dataDescription = VTK_EMPTY);
221
227 static void ComputeCellStructuredCoords(
228 vtkIdType cellId, const int dim[3], int ijk[3], int dataDescription = VTK_EMPTY);
229
234 static void ComputeCellStructuredMinMaxCoords(vtkIdType cellId, const int dim[3], int ijkMin[3],
235 int ijkMax[3], int dataDescription = VTK_EMPTY);
236
243 vtkIdType ptId, const int ext[6], int ijk[3], int dataDescription = VTK_EMPTY);
244
251 vtkIdType ptId, const int dim[3], int ijk[3], int dataDescription = VTK_EMPTY);
252
257 int extent[6], bool usePixelVoxelOrientation);
258
264 vtkDataArray* zCoords, int extent[6], double dirMatrix[9]);
265
270 int extent[6], bool usePixelVoxelOrientation);
271
272protected:
273 vtkStructuredData() = default;
274 ~vtkStructuredData() override = default;
275
283 static vtkIdType GetLinearIndex(const int i, const int j, const int k, const int N1, const int N2)
284 {
285 return ((static_cast<vtkIdType>(k) * N2 + j) * N1 + i);
286 }
287
289
296 const vtkIdType idx, const int N1, const int N2, int& i, int& j, int& k)
297 {
298 vtkIdType N12 = N1 * N2;
299 k = static_cast<int>(idx / N12);
300 j = static_cast<int>((idx - k * N12) / N1);
301 i = static_cast<int>(idx - k * N12 - j * N1);
302 }
303
304
305 // Want to avoid importing <algorithm> in the header...
306 template <typename T>
307 static T Max(const T& a, const T& b)
308 {
309 return (a > b) ? a : b;
310 }
311
312private:
313 vtkStructuredData(const vtkStructuredData&) = delete;
314 void operator=(const vtkStructuredData&) = delete;
315};
316
317//------------------------------------------------------------------------------
318inline void vtkStructuredData::GetCellDimensionsFromExtent(const int ext[6], int celldims[3], int)
319{
320 celldims[0] = vtkStructuredData::Max(ext[1] - ext[0], 0);
321 celldims[1] = vtkStructuredData::Max(ext[3] - ext[2], 0);
322 celldims[2] = vtkStructuredData::Max(ext[5] - ext[4], 0);
323}
324
325//------------------------------------------------------------------------------
326inline vtkIdType vtkStructuredData::ComputePointId(const int dims[3], const int ijk[3], int)
327{
328 return vtkStructuredData::GetLinearIndex(ijk[0], ijk[1], ijk[2], dims[0], dims[1]);
329}
330
331//------------------------------------------------------------------------------
332inline vtkIdType vtkStructuredData::ComputeCellId(const int dims[3], const int ijk[3], int)
333{
334 return vtkStructuredData::GetLinearIndex(ijk[0], ijk[1], ijk[2],
335 vtkStructuredData::Max(dims[0] - 1, 1), vtkStructuredData::Max(dims[1] - 1, 1));
336}
337
338//------------------------------------------------------------------------------
340{
341 return static_cast<vtkIdType>(ext[1] - ext[0] + 1) * static_cast<vtkIdType>(ext[3] - ext[2] + 1) *
342 static_cast<vtkIdType>(ext[5] - ext[4] + 1);
343}
344
345//------------------------------------------------------------------------------
347{
348 int dims[3];
350
351 // if any of the dimensions is 0, then there are no cells
352 const int cellDims[3] = { dims[0] != 0 ? vtkStructuredData::Max(dims[0] - 1, 1) : 0,
353 dims[1] != 0 ? vtkStructuredData::Max(dims[1] - 1, 1) : 0,
354 dims[2] != 0 ? vtkStructuredData::Max(dims[2] - 1, 1) : 0 };
355
356 // Note, when we compute the result below, we statically cast to vtkIdType to
357 // ensure the compiler will generate a 32x32=64 instruction.
358 return static_cast<vtkIdType>(cellDims[0]) * static_cast<vtkIdType>(cellDims[1]) *
359 static_cast<vtkIdType>(cellDims[2]);
360}
361
362//------------------------------------------------------------------------------
364 const int nodeExtent[6], int cellExtent[6], int)
365{
366 cellExtent[0] = nodeExtent[0];
367 cellExtent[2] = nodeExtent[2];
368 cellExtent[4] = nodeExtent[4];
369
370 cellExtent[1] = vtkStructuredData::Max(nodeExtent[0], nodeExtent[1] - 1);
371 cellExtent[3] = vtkStructuredData::Max(nodeExtent[2], nodeExtent[3] - 1);
372 cellExtent[5] = vtkStructuredData::Max(nodeExtent[4], nodeExtent[5] - 1);
373}
374
375//------------------------------------------------------------------------------
376inline void vtkStructuredData::GetDimensionsFromExtent(const int ext[6], int dims[3], int)
377{
378 dims[0] = ext[1] - ext[0] + 1;
379 dims[1] = ext[3] - ext[2] + 1;
380 dims[2] = ext[5] - ext[4] + 1;
381}
382
383//------------------------------------------------------------------------------
385 const int nodeDims[3], int cellDims[3])
386{
387 cellDims[0] = vtkStructuredData::Max(nodeDims[0] - 1, 0);
388 cellDims[1] = vtkStructuredData::Max(nodeDims[1] - 1, 0);
389 cellDims[2] = vtkStructuredData::Max(nodeDims[2] - 1, 0);
390}
391
392//------------------------------------------------------------------------------
394 const int ijk[3], const int ext[6], int lijk[3], int)
395{
396 lijk[0] = ijk[0] - ext[0];
397 lijk[1] = ijk[1] - ext[2];
398 lijk[2] = ijk[2] - ext[4];
399}
400
401//------------------------------------------------------------------------------
403 const int lijk[3], const int ext[6], int ijk[3], int)
404{
405 ijk[0] = ext[0] + lijk[0];
406 ijk[1] = ext[2] + lijk[1];
407 ijk[2] = ext[4] + lijk[2];
408}
409
410//------------------------------------------------------------------------------
412 const int extent[6], const int ijk[3], int)
413{
414 int dims[3];
416
417 int lijk[3];
419
420 return vtkStructuredData::ComputePointId(dims, lijk);
421}
422
423//------------------------------------------------------------------------------
425 const int extent[6], const int ijk[3], int)
426{
427 int nodeDims[3];
429
430 int lijk[3];
432
433 return vtkStructuredData::ComputeCellId(nodeDims, lijk);
434}
435
436//------------------------------------------------------------------------------
438 vtkIdType cellId, const int dims[3], int ijk[3], int)
439{
441 cellId, dims[0] - 1, dims[1] - 1, ijk[0], ijk[1], ijk[2]);
442}
443
444//------------------------------------------------------------------------------
446 vtkIdType cellIdx, const int ext[6], int ijk[3], int)
447{
448 int nodeDims[3];
450
451 int lijk[3];
452 vtkStructuredData::ComputeCellStructuredCoords(cellIdx, nodeDims, lijk);
453
455}
456
457//------------------------------------------------------------------------------
459 vtkIdType ptId, const int dim[3], int ijk[3], int)
460{
461 vtkStructuredData::GetStructuredCoordinates(ptId, dim[0], dim[1], ijk[0], ijk[1], ijk[2]);
462}
463
464//------------------------------------------------------------------------------
466 vtkIdType ptId, const int ext[6], int ijk[3], int)
467{
468 int nodeDims[3];
470
471 int lijk[3];
473
475}
476
477VTK_ABI_NAMESPACE_END
478#endif
list of point or cell ids
Definition vtkIdList.h:24
A read only array class that wraps an implicit function from integers to any value type supported by ...
a simple class to control print indentation
Definition vtkIndent.h:29
represent and manipulate 3D points
Definition vtkPoints.h:30
Hold a reference to a vtkObjectBase instance.
implicit object to represent cell connectivity
Singleton class for topologically regular data.
static void ComputePointStructuredCoordsForExtent(vtkIdType ptId, const int ext[6], int ijk[3], int dataDescription=VTK_EMPTY)
Given a pointId and the grid extent ext, get the structured coordinates (i-j-k).
static void GetCellDimensionsFromExtent(const int ext[6], int celldims[3], int dataDescription=VTK_EMPTY)
Returns the cell dimensions, i.e., the number of cells along the i,j,k for the grid with the given gr...
static int GetDataDescription(int dims[3])
Returns the data description given the dimensions (eg.
static int GetDataDimension(int ext[6])
Return the topological dimension of the data (e.g., 0, 1, 2, or 3D).
static void GetStructuredCoordinates(const vtkIdType idx, const int N1, const int N2, int &i, int &j, int &k)
Returns the structured coordinates (i,j,k) for the given linear index of a grid with N1 and N2 dimens...
static vtkIdType ComputePointIdForExtent(const int extent[6], const int ijk[3], int dataDescription=VTK_EMPTY)
Given a location in structured coordinates (i-j-k), and the extent of the structured dataset,...
static int GetDataDescriptionFromExtent(int ext[6])
Returns the data description given the dimensions (eg.
static vtkSmartPointer< vtkStructuredCellArray > GetCellArray(int extent[6], bool usePixelVoxelOrientation)
Get the implicit cell array for structured data.
static void GetLocalStructuredCoordinates(const int ijk[3], const int ext[6], int lijk[3], int dataDescription=VTK_EMPTY)
Given the global structured coordinates for a point or cell, ijk, w.r.t.
static void GetDimensionsFromExtent(const int ext[6], int dims[3], int dataDescription=VTK_EMPTY)
Computes the structured grid dimensions based on the given extent.
static void GetCellNeighbors(vtkIdType cellId, vtkIdList *ptIds, vtkIdList *cellIds, int dim[3], int seedLoc[3])
static void GetCellPoints(vtkIdType cellId, vtkIdList *ptIds, int dataDescription, int dim[3])
Get the points defining a cell.
static bool IsPointVisible(vtkIdType cellId, vtkUnsignedCharArray *ghosts)
Return non-zero value if specified point is visible.
static void GetCellExtentFromPointExtent(const int pntExtent[6], int cellExtent[6], int dataDescription=VTK_EMPTY)
Given the point extent of a grid, this method computes the corresponding cell extent for the grid.
static void ComputeCellStructuredMinMaxCoords(vtkIdType cellId, const int dim[3], int ijkMin[3], int ijkMax[3], int dataDescription=VTK_EMPTY)
Given a cellId and grid dimensions 'dim', get the min and max structured coordinates (i-j-k).
static vtkIdType GetNumberOfCells(const int ext[6], int dataDescription=VTK_EMPTY)
Given the grid extent, this method returns the total number of cells within the extent.
vtkStructuredData()=default
static int SetExtent(VTK_FUTURE_CONST int inExt[6], int ext[6])
Specify the dimensions of a regular, rectangular dataset.
static void ComputeCellStructuredCoords(vtkIdType cellId, const int dim[3], int ijk[3], int dataDescription=VTK_EMPTY)
Given a cellId and grid dimensions 'dim', get the structured coordinates (i-j-k).
static void ComputeCellStructuredCoordsForExtent(vtkIdType cellIdx, const int ext[6], int ijk[3], int dataDescription=VTK_EMPTY)
Given the global grid extent and the linear index of a cell within the grid extent,...
static int GetDataDimension(int dataDescription)
Return the topological dimension of the data (e.g., 0, 1, 2, or 3D).
static VTK_WRAPEXCLUDE vtkSmartPointer< vtkConstantArray< int > > GetCellTypesArray(int extent[6], bool usePixelVoxelOrientation)
Get the implicit cell array types for structured data.
static vtkSmartPointer< vtkPoints > GetPoints(vtkDataArray *xCoords, vtkDataArray *yCoords, vtkDataArray *zCoords, int extent[6], double dirMatrix[9])
Given 3 arrays describing the xCoords, yCoords, and zCoords, the extent, and the direction matrix,...
void PrintSelf(ostream &os, vtkIndent indent) override
Methods invoked by print to print information about the object including superclasses.
~vtkStructuredData() override=default
static void GetCellDimensionsFromPointDimensions(const int pntdims[3], int cellDims[3])
Given the dimensions of the grid, in pntdims, this method returns the corresponding cell dimensions f...
static void GetCellNeighbors(vtkIdType cellId, vtkIdList *ptIds, vtkIdList *cellIds, int dim[3])
Get the cells using the points ptIds, exclusive of the cell cellId.
static int SetDimensions(VTK_FUTURE_CONST int inDim[3], int dim[3])
Specify the dimensions of a regular, rectangular dataset.
static vtkIdType ComputeCellIdForExtent(const int extent[6], const int ijk[3], int dataDescription=VTK_EMPTY)
Given a location in structured coordinates (i-j-k), and the extent of the structured dataset,...
static vtkIdType GetLinearIndex(const int i, const int j, const int k, const int N1, const int N2)
Computes the linear index for the given i-j-k structured of a grid with of N1 and N2 dimensions along...
static void ComputePointStructuredCoords(vtkIdType ptId, const int dim[3], int ijk[3], int dataDescription=VTK_EMPTY)
Given a pointId and grid dimensions 'dim', get the structured coordinates (i-j-k).
static vtkIdType ComputePointId(const int dim[3], const int ijk[3], int dataDescription=VTK_EMPTY)
Given a location in structured coordinates (i-j-k), and the dimensions of the structured dataset,...
static bool IsCellVisible(vtkIdType cellId, VTK_FUTURE_CONST int dimensions[3], int dataDescription, vtkUnsignedCharArray *cellGhostArray, vtkUnsignedCharArray *pointGhostArray=nullptr)
Return non-zero value if specified cell is visible.
static void GetPointCells(vtkIdType ptId, vtkIdList *cellIds, VTK_FUTURE_CONST int dim[3])
Get the cells using a point.
static void GetGlobalStructuredCoordinates(const int lijk[3], const int ext[6], int ijk[3], int dataDescription=VTK_EMPTY)
Given local structured coordinates, and the corresponding global sub-grid extent, this method compute...
static T Max(const T &a, const T &b)
static vtkIdType GetNumberOfPoints(const int ext[6], int dataDescription=VTK_EMPTY)
Given the grid extent, this method returns the total number of points within the extent.
static vtkIdType ComputeCellId(const int dim[3], const int ijk[3], int dataDescription=VTK_EMPTY)
Given a location in structured coordinates (i-j-k), and the dimensions of the structured dataset,...
dynamic, self-adjusting array of unsigned char
A utility structure serving as a backend for constant implicit arrays.
#define vtkDataArray
vtkImplicitArray< vtkConstantImplicitBackend< T > > vtkConstantArray
A utility alias for wrapping constant functions in implicit arrays.
#define VTK_EMPTY
int vtkIdType
Definition vtkType.h:315
#define VTK_WRAPEXCLUDE