VTK  9.6.20260314
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
81
82#ifndef vtkStructuredData_h
83#define vtkStructuredData_h
84
85#include "vtkCommonDataModelModule.h" // For export macro
86#include "vtkDeprecation.h" // For VTK_DEPRECATED_IN_9_6_0
87#include "vtkObject.h"
88#include "vtkSmartPointer.h" // For vtkSmartPointer
89
90VTK_ABI_NAMESPACE_BEGIN
91class vtkDataArray;
92class vtkIdList;
93class vtkPoints;
96template <typename T>
98
99class VTKCOMMONDATAMODEL_EXPORT vtkStructuredData : public vtkObject
100{
101public:
103 void PrintSelf(ostream& os, vtkIndent indent) override;
104
111 {
112 VTK_STRUCTURED_INVALID = -1, // An invalid/unset/unitialized grid
114 0, // Used by vtkStructuredData API to signify that the type of the grid was not changed
115 VTK_STRUCTURED_SINGLE_POINT = 1, // A single point, 0D
116 VTK_STRUCTURED_X_LINE = 2, // X aligned line, 1D
117 VTK_STRUCTURED_Y_LINE = 3, // Y aligned line, 1D
118 VTK_STRUCTURED_Z_LINE = 4, // Z aligned line, 1D
119 VTK_STRUCTURED_XY_PLANE = 5, // XY aligned plane, 2D
120 VTK_STRUCTURED_YZ_PLANE = 6, // XY aligned plane, 2D
121 VTK_STRUCTURED_XZ_PLANE = 7, // XY aligned plane, 2D
122 VTK_STRUCTURED_XYZ_GRID = 8, // XYZ grid, 3D
123 VTK_STRUCTURED_EMPTY = 9 // An empty grid
124 };
125
127
134 static int SetDimensions(VTK_FUTURE_CONST int inDim[3], int dim[3]);
135 static int SetExtent(VTK_FUTURE_CONST int inExt[6], int ext[6]);
137
139
143 static int GetDataDescription(int dims[3]);
144 static int GetDataDescriptionFromExtent(int ext[6]);
146
148
151 static int GetDataDimension(int dataDescription);
152 static int GetDataDimension(int ext[6]);
154
161 const int ext[6], int dataDescription = vtkStructuredData::VTK_STRUCTURED_EMPTY);
162
169 const int ext[6], int dataDescription = vtkStructuredData::VTK_STRUCTURED_EMPTY);
170
176 static void GetCellExtentFromPointExtent(const int pntExtent[6], int cellExtent[6],
177 int dataDescription = vtkStructuredData::VTK_STRUCTURED_EMPTY);
178
183 static inline void GetDimensionsFromExtent(
184 const int ext[6], int dims[3], int dataDescription = vtkStructuredData::VTK_STRUCTURED_EMPTY);
185
189 static bool IsPointVisible(vtkIdType cellId, vtkUnsignedCharArray* ghosts);
190
194 static bool IsCellVisible(vtkIdType cellId, VTK_FUTURE_CONST int dimensions[3],
195 int dataDescription, vtkUnsignedCharArray* cellGhostArray,
196 vtkUnsignedCharArray* pointGhostArray = nullptr);
197
204 static void GetCellDimensionsFromExtent(const int ext[6], int celldims[3],
205 int dataDescription = vtkStructuredData::VTK_STRUCTURED_EMPTY);
206
212 static void GetCellDimensionsFromPointDimensions(const int pntdims[3], int cellDims[3]);
213
220 static void GetLocalStructuredCoordinates(const int ijk[3], const int ext[6], int lijk[3],
221 int dataDescription = vtkStructuredData::VTK_STRUCTURED_EMPTY);
222
228 static void GetGlobalStructuredCoordinates(const int lijk[3], const int ext[6], int ijk[3],
229 int dataDescription = vtkStructuredData::VTK_STRUCTURED_EMPTY);
230
235 static void GetCellPoints(vtkIdType cellId, vtkIdList* ptIds, int dataDescription, int dim[3]);
236
240 static void GetPointCells(vtkIdType ptId, vtkIdList* cellIds, VTK_FUTURE_CONST int dim[3]);
241
246 static void GetCellNeighbors(vtkIdType cellId, vtkIdList* ptIds, vtkIdList* cellIds, int dim[3]);
247 static void GetCellNeighbors(
248 vtkIdType cellId, vtkIdList* ptIds, vtkIdList* cellIds, int dim[3], int seedLoc[3]);
249
255 static vtkIdType ComputePointIdForExtent(const int extent[6], const int ijk[3],
256 int dataDescription = vtkStructuredData::VTK_STRUCTURED_EMPTY);
257
263 static vtkIdType ComputeCellIdForExtent(const int extent[6], const int ijk[3],
264 int dataDescription = vtkStructuredData::VTK_STRUCTURED_EMPTY);
265
272 static vtkIdType ComputePointId(const int dim[3], const int ijk[3],
273 int dataDescription = vtkStructuredData::VTK_STRUCTURED_EMPTY);
274
281 static vtkIdType ComputeCellId(const int dim[3], const int ijk[3],
282 int dataDescription = vtkStructuredData::VTK_STRUCTURED_EMPTY);
283
290 static void ComputeCellStructuredCoordsForExtent(vtkIdType cellIdx, const int ext[6], int ijk[3],
291 int dataDescription = vtkStructuredData::VTK_STRUCTURED_EMPTY);
292
298 static void ComputeCellStructuredCoords(vtkIdType cellId, const int dim[3], int ijk[3],
299 int dataDescription = vtkStructuredData::VTK_STRUCTURED_EMPTY);
300
305 static void ComputeCellStructuredMinMaxCoords(vtkIdType cellId, const int dim[3], int ijkMin[3],
306 int ijkMax[3], int dataDescription = vtkStructuredData::VTK_STRUCTURED_EMPTY);
307
313 static void ComputePointStructuredCoordsForExtent(vtkIdType ptId, const int ext[6], int ijk[3],
314 int dataDescription = vtkStructuredData::VTK_STRUCTURED_EMPTY);
315
321 static void ComputePointStructuredCoords(vtkIdType ptId, const int dim[3], int ijk[3],
322 int dataDescription = vtkStructuredData::VTK_STRUCTURED_EMPTY);
323
328 int extent[6], bool usePixelVoxelOrientation);
329
335 vtkDataArray* zCoords, int extent[6], double dirMatrix[9]);
336
338
342 int extent[6], bool usePixelVoxelOrientation);
344 "Use vtkSmartPointer<vtkConstantArray<unsigned char>> GetCellTypes(extent, "
345 "usePixelVoxelOrientation) instead")
347 int extent[6], bool usePixelVoxelOrientation);
349
350protected:
351 vtkStructuredData() = default;
352 ~vtkStructuredData() override = default;
353
361 static vtkIdType GetLinearIndex(const int i, const int j, const int k, const int N1, const int N2)
362 {
363 return ((static_cast<vtkIdType>(k) * N2 + j) * N1 + i);
364 }
365
367
374 const vtkIdType idx, const int N1, const int N2, int& i, int& j, int& k)
375 {
376 vtkIdType N12 = N1 * N2;
377 k = static_cast<int>(idx / N12);
378 j = static_cast<int>((idx - k * N12) / N1);
379 i = static_cast<int>(idx - k * N12 - j * N1);
380 }
381
382
383 // Want to avoid importing <algorithm> in the header...
384 template <typename T>
385 static T Max(const T& a, const T& b)
386 {
387 return (a > b) ? a : b;
388 }
389
390private:
391 vtkStructuredData(const vtkStructuredData&) = delete;
392 void operator=(const vtkStructuredData&) = delete;
393};
394
395//------------------------------------------------------------------------------
396inline void vtkStructuredData::GetCellDimensionsFromExtent(const int ext[6], int celldims[3], int)
397{
398 celldims[0] = vtkStructuredData::Max(ext[1] - ext[0], 0);
399 celldims[1] = vtkStructuredData::Max(ext[3] - ext[2], 0);
400 celldims[2] = vtkStructuredData::Max(ext[5] - ext[4], 0);
401}
402
403//------------------------------------------------------------------------------
404inline vtkIdType vtkStructuredData::ComputePointId(const int dims[3], const int ijk[3], int)
405{
406 return vtkStructuredData::GetLinearIndex(ijk[0], ijk[1], ijk[2], dims[0], dims[1]);
407}
408
409//------------------------------------------------------------------------------
410inline vtkIdType vtkStructuredData::ComputeCellId(const int dims[3], const int ijk[3], int)
411{
412 return vtkStructuredData::GetLinearIndex(ijk[0], ijk[1], ijk[2],
413 vtkStructuredData::Max(dims[0] - 1, 1), vtkStructuredData::Max(dims[1] - 1, 1));
414}
415
416//------------------------------------------------------------------------------
418{
419 return static_cast<vtkIdType>(ext[1] - ext[0] + 1) * static_cast<vtkIdType>(ext[3] - ext[2] + 1) *
420 static_cast<vtkIdType>(ext[5] - ext[4] + 1);
421}
422
423//------------------------------------------------------------------------------
425{
426 int dims[3];
428
429 // if any of the dimensions is 0, then there are no cells
430 const int cellDims[3] = { dims[0] != 0 ? vtkStructuredData::Max(dims[0] - 1, 1) : 0,
431 dims[1] != 0 ? vtkStructuredData::Max(dims[1] - 1, 1) : 0,
432 dims[2] != 0 ? vtkStructuredData::Max(dims[2] - 1, 1) : 0 };
433
434 // Note, when we compute the result below, we statically cast to vtkIdType to
435 // ensure the compiler will generate a 32x32=64 instruction.
436 return static_cast<vtkIdType>(cellDims[0]) * static_cast<vtkIdType>(cellDims[1]) *
437 static_cast<vtkIdType>(cellDims[2]);
438}
439
440//------------------------------------------------------------------------------
442 const int nodeExtent[6], int cellExtent[6], int)
443{
444 cellExtent[0] = nodeExtent[0];
445 cellExtent[2] = nodeExtent[2];
446 cellExtent[4] = nodeExtent[4];
447
448 cellExtent[1] = vtkStructuredData::Max(nodeExtent[0], nodeExtent[1] - 1);
449 cellExtent[3] = vtkStructuredData::Max(nodeExtent[2], nodeExtent[3] - 1);
450 cellExtent[5] = vtkStructuredData::Max(nodeExtent[4], nodeExtent[5] - 1);
451}
452
453//------------------------------------------------------------------------------
454void vtkStructuredData::GetDimensionsFromExtent(const int ext[6], int dims[3], int)
455{
456 dims[0] = ext[1] - ext[0] + 1;
457 dims[1] = ext[3] - ext[2] + 1;
458 dims[2] = ext[5] - ext[4] + 1;
459}
460
461//------------------------------------------------------------------------------
463 const int nodeDims[3], int cellDims[3])
464{
465 cellDims[0] = vtkStructuredData::Max(nodeDims[0] - 1, 0);
466 cellDims[1] = vtkStructuredData::Max(nodeDims[1] - 1, 0);
467 cellDims[2] = vtkStructuredData::Max(nodeDims[2] - 1, 0);
468}
469
470//------------------------------------------------------------------------------
472 const int ijk[3], const int ext[6], int lijk[3], int)
473{
474 lijk[0] = ijk[0] - ext[0];
475 lijk[1] = ijk[1] - ext[2];
476 lijk[2] = ijk[2] - ext[4];
477}
478
479//------------------------------------------------------------------------------
481 const int lijk[3], const int ext[6], int ijk[3], int)
482{
483 ijk[0] = ext[0] + lijk[0];
484 ijk[1] = ext[2] + lijk[1];
485 ijk[2] = ext[4] + lijk[2];
486}
487
488//------------------------------------------------------------------------------
490 const int extent[6], const int ijk[3], int)
491{
492 int dims[3];
494
495 int lijk[3];
497
498 return vtkStructuredData::ComputePointId(dims, lijk);
499}
500
501//------------------------------------------------------------------------------
503 const int extent[6], const int ijk[3], int)
504{
505 int nodeDims[3];
507
508 int lijk[3];
510
511 return vtkStructuredData::ComputeCellId(nodeDims, lijk);
512}
513
514//------------------------------------------------------------------------------
516 vtkIdType cellId, const int dims[3], int ijk[3], int)
517{
519 cellId, dims[0] - 1, dims[1] - 1, ijk[0], ijk[1], ijk[2]);
520}
521
522//------------------------------------------------------------------------------
524 vtkIdType cellIdx, const int ext[6], int ijk[3], int)
525{
526 int nodeDims[3];
528
529 int lijk[3];
530 vtkStructuredData::ComputeCellStructuredCoords(cellIdx, nodeDims, lijk);
531
533}
534
535//------------------------------------------------------------------------------
537 vtkIdType ptId, const int dim[3], int ijk[3], int)
538{
539 vtkStructuredData::GetStructuredCoordinates(ptId, dim[0], dim[1], ijk[0], ijk[1], ijk[2]);
540}
541
542//------------------------------------------------------------------------------
544 vtkIdType ptId, const int ext[6], int ijk[3], int)
545{
546 int nodeDims[3];
548
549 int lijk[3];
551
553}
554
555VTK_ABI_NAMESPACE_END
556#endif
A utility array for wrapping constant functions in implicit arrays.
list of point or cell ids
Definition vtkIdList.h:135
a simple class to control print indentation
Definition vtkIndent.h:108
represent and manipulate 3D points
Definition vtkPoints.h:140
Hold a reference to a vtkObjectBase instance.
implicit object to represent cell connectivity
Singleton class for topologically regular data.
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 GetCellDimensionsFromExtent(const int ext[6], int celldims[3], int dataDescription=vtkStructuredData::VTK_STRUCTURED_EMPTY)
Returns the cell dimensions, i.e., the number of cells along the i,j,k for the grid with the given gr...
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=vtkStructuredData::VTK_STRUCTURED_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 vtkIdType GetNumberOfCells(const int ext[6], int dataDescription=vtkStructuredData::VTK_STRUCTURED_EMPTY)
Given the grid extent, this method returns the total number of cells within the 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 vtkIdType ComputeCellIdForExtent(const int extent[6], const int ijk[3], int dataDescription=vtkStructuredData::VTK_STRUCTURED_EMPTY)
Given a location in structured coordinates (i-j-k), and the extent of the structured dataset,...
vtkStructuredData()=default
static int SetExtent(VTK_FUTURE_CONST int inExt[6], int ext[6])
Specify the dimensions of a regular, rectangular dataset.
static void GetGlobalStructuredCoordinates(const int lijk[3], const int ext[6], int ijk[3], int dataDescription=vtkStructuredData::VTK_STRUCTURED_EMPTY)
Given local structured coordinates, and the corresponding global sub-grid extent, this method compute...
static void ComputePointStructuredCoords(vtkIdType ptId, const int dim[3], int ijk[3], int dataDescription=vtkStructuredData::VTK_STRUCTURED_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=vtkStructuredData::VTK_STRUCTURED_EMPTY)
Given a location in structured coordinates (i-j-k), and the dimensions of the structured dataset,...
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 VTK_WRAPEXCLUDE vtkSmartPointer< vtkConstantArray< unsigned char > > GetCellTypes(int extent[6], bool usePixelVoxelOrientation)
Get the implicit cell array types for structured data.
static void ComputeCellStructuredMinMaxCoords(vtkIdType cellId, const int dim[3], int ijkMin[3], int ijkMax[3], int dataDescription=vtkStructuredData::VTK_STRUCTURED_EMPTY)
Given a cellId and grid dimensions 'dim', get the min and max structured coordinates (i-j-k).
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.
static void ComputeCellStructuredCoords(vtkIdType cellId, const int dim[3], int ijk[3], int dataDescription=vtkStructuredData::VTK_STRUCTURED_EMPTY)
Given a cellId and grid dimensions 'dim', get the structured coordinates (i-j-k).
static void GetLocalStructuredCoordinates(const int ijk[3], const int ext[6], int lijk[3], int dataDescription=vtkStructuredData::VTK_STRUCTURED_EMPTY)
Given the global structured coordinates for a point or cell, ijk, w.r.t.
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 GetDimensionsFromExtent(const int ext[6], int dims[3], int dataDescription=vtkStructuredData::VTK_STRUCTURED_EMPTY)
Computes the structured grid dimensions based on the given extent.
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 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 ComputeCellStructuredCoordsForExtent(vtkIdType cellIdx, const int ext[6], int ijk[3], int dataDescription=vtkStructuredData::VTK_STRUCTURED_EMPTY)
Given the global grid extent and the linear index of a cell within the grid extent,...
static vtkIdType GetNumberOfPoints(const int ext[6], int dataDescription=vtkStructuredData::VTK_STRUCTURED_EMPTY)
Given the grid extent, this method returns the total number of points within the extent.
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 vtkIdType ComputeCellId(const int dim[3], const int ijk[3], int dataDescription=vtkStructuredData::VTK_STRUCTURED_EMPTY)
Given a location in structured coordinates (i-j-k), and the dimensions of the structured dataset,...
static void ComputePointStructuredCoordsForExtent(vtkIdType ptId, const int ext[6], int ijk[3], int dataDescription=vtkStructuredData::VTK_STRUCTURED_EMPTY)
Given a pointId and the grid extent ext, get the structured coordinates (i-j-k).
static void GetPointCells(vtkIdType ptId, vtkIdList *cellIds, VTK_FUTURE_CONST int dim[3])
Get the cells using a point.
static T Max(const T &a, const T &b)
static void GetCellExtentFromPointExtent(const int pntExtent[6], int cellExtent[6], int dataDescription=vtkStructuredData::VTK_STRUCTURED_EMPTY)
Given the point extent of a grid, this method computes the corresponding cell extent for the grid.
vtkStructuredDataType
An enum to describe the different types of vtkStructuredData XXX: This should be an enum class,...
dynamic, self-adjusting array of unsigned char
#define vtkDataArray
#define VTK_DEPRECATED_IN_9_6_0(reason)
int vtkIdType
Definition vtkType.h:363
#define VTK_WRAPEXCLUDE