VTK  9.5.20251103
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
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;
96
97template <typename T, int ArrayType>
99template <typename Type>
101template <typename Type>
104
106{
107 VTK_UNCHANGED VTK_DEPRECATED_IN_9_5_0("Use vtkStructuredData::VTK_STRUCTURED_* version instead") =
108 0,
110 "Use vtkStructuredData::VTK_STRUCTURED_* version instead") = 1,
111 VTK_X_LINE VTK_DEPRECATED_IN_9_5_0("Use vtkStructuredData::VTK_STRUCTURED_* version instead") = 2,
112 VTK_Y_LINE VTK_DEPRECATED_IN_9_5_0("Use vtkStructuredData::VTK_STRUCTURED_* version instead") = 3,
113 VTK_Z_LINE VTK_DEPRECATED_IN_9_5_0("Use vtkStructuredData::VTK_STRUCTURED_* version instead") = 4,
114 VTK_XY_PLANE VTK_DEPRECATED_IN_9_5_0("Use vtkStructuredData::VTK_STRUCTURED_* version instead") =
115 5,
116 VTK_YZ_PLANE VTK_DEPRECATED_IN_9_5_0("Use vtkStructuredData::VTK_STRUCTURED_* version instead") =
117 6,
118 VTK_XZ_PLANE VTK_DEPRECATED_IN_9_5_0("Use vtkStructuredData::VTK_STRUCTURED_* version instead") =
119 7,
120 VTK_XYZ_GRID VTK_DEPRECATED_IN_9_5_0("Use vtkStructuredData::VTK_STRUCTURED_* version instead") =
121 8,
122 VTK_EMPTY VTK_DEPRECATED_IN_9_5_0("Use vtkStructuredData::VTK_STRUCTURED_* version instead") = 9
124
125class VTKCOMMONDATAMODEL_EXPORT vtkStructuredData : public vtkObject
126{
127public:
129 void PrintSelf(ostream& os, vtkIndent indent) override;
130
137 {
138 VTK_STRUCTURED_INVALID = -1, // An invalid/unset/unitialized grid
139 VTK_STRUCTURED_UNCHANGED =
140 0, // Used by vtkStructuredData API to signify that the type of the grid was not changed
141 VTK_STRUCTURED_SINGLE_POINT = 1, // A single point, 0D
142 VTK_STRUCTURED_X_LINE = 2, // X aligned line, 1D
143 VTK_STRUCTURED_Y_LINE = 3, // Y aligned line, 1D
144 VTK_STRUCTURED_Z_LINE = 4, // Z aligned line, 1D
145 VTK_STRUCTURED_XY_PLANE = 5, // XY aligned plane, 2D
146 VTK_STRUCTURED_YZ_PLANE = 6, // XY aligned plane, 2D
147 VTK_STRUCTURED_XZ_PLANE = 7, // XY aligned plane, 2D
148 VTK_STRUCTURED_XYZ_GRID = 8, // XYZ grid, 3D
149 VTK_STRUCTURED_EMPTY = 9 // An empty grid
150 };
151
153
160 static int SetDimensions(VTK_FUTURE_CONST int inDim[3], int dim[3]);
161 static int SetExtent(VTK_FUTURE_CONST int inExt[6], int ext[6]);
163
165
169 static int GetDataDescription(int dims[3]);
170 static int GetDataDescriptionFromExtent(int ext[6]);
172
174
177 static int GetDataDimension(int dataDescription);
178 static int GetDataDimension(int ext[6]);
180
186 static vtkIdType GetNumberOfPoints(
187 const int ext[6], int dataDescription = vtkStructuredData::VTK_STRUCTURED_EMPTY);
188
194 static vtkIdType GetNumberOfCells(
195 const int ext[6], int dataDescription = vtkStructuredData::VTK_STRUCTURED_EMPTY);
196
202 static void GetCellExtentFromPointExtent(const int pntExtent[6], int cellExtent[6],
203 int dataDescription = vtkStructuredData::VTK_STRUCTURED_EMPTY);
204
209 static void GetDimensionsFromExtent(
210 const int ext[6], int dims[3], int dataDescription = vtkStructuredData::VTK_STRUCTURED_EMPTY);
211
215 static bool IsPointVisible(vtkIdType cellId, vtkUnsignedCharArray* ghosts);
216
220 static bool IsCellVisible(vtkIdType cellId, VTK_FUTURE_CONST int dimensions[3],
221 int dataDescription, vtkUnsignedCharArray* cellGhostArray,
222 vtkUnsignedCharArray* pointGhostArray = nullptr);
223
230 static void GetCellDimensionsFromExtent(const int ext[6], int celldims[3],
231 int dataDescription = vtkStructuredData::VTK_STRUCTURED_EMPTY);
232
238 static void GetCellDimensionsFromPointDimensions(const int pntdims[3], int cellDims[3]);
239
246 static void GetLocalStructuredCoordinates(const int ijk[3], const int ext[6], int lijk[3],
247 int dataDescription = vtkStructuredData::VTK_STRUCTURED_EMPTY);
248
254 static void GetGlobalStructuredCoordinates(const int lijk[3], const int ext[6], int ijk[3],
255 int dataDescription = vtkStructuredData::VTK_STRUCTURED_EMPTY);
256
261 static void GetCellPoints(vtkIdType cellId, vtkIdList* ptIds, int dataDescription, int dim[3]);
262
266 static void GetPointCells(vtkIdType ptId, vtkIdList* cellIds, VTK_FUTURE_CONST int dim[3]);
267
272 static void GetCellNeighbors(vtkIdType cellId, vtkIdList* ptIds, vtkIdList* cellIds, int dim[3]);
273 static void GetCellNeighbors(
274 vtkIdType cellId, vtkIdList* ptIds, vtkIdList* cellIds, int dim[3], int seedLoc[3]);
275
281 static vtkIdType ComputePointIdForExtent(const int extent[6], const int ijk[3],
282 int dataDescription = vtkStructuredData::VTK_STRUCTURED_EMPTY);
283
289 static vtkIdType ComputeCellIdForExtent(const int extent[6], const int ijk[3],
290 int dataDescription = vtkStructuredData::VTK_STRUCTURED_EMPTY);
291
298 static vtkIdType ComputePointId(const int dim[3], const int ijk[3],
299 int dataDescription = vtkStructuredData::VTK_STRUCTURED_EMPTY);
300
307 static vtkIdType ComputeCellId(const int dim[3], const int ijk[3],
308 int dataDescription = vtkStructuredData::VTK_STRUCTURED_EMPTY);
309
316 static void ComputeCellStructuredCoordsForExtent(vtkIdType cellIdx, const int ext[6], int ijk[3],
317 int dataDescription = vtkStructuredData::VTK_STRUCTURED_EMPTY);
318
324 static void ComputeCellStructuredCoords(vtkIdType cellId, const int dim[3], int ijk[3],
325 int dataDescription = vtkStructuredData::VTK_STRUCTURED_EMPTY);
326
331 static void ComputeCellStructuredMinMaxCoords(vtkIdType cellId, const int dim[3], int ijkMin[3],
332 int ijkMax[3], int dataDescription = vtkStructuredData::VTK_STRUCTURED_EMPTY);
333
339 static void ComputePointStructuredCoordsForExtent(vtkIdType ptId, const int ext[6], int ijk[3],
340 int dataDescription = vtkStructuredData::VTK_STRUCTURED_EMPTY);
341
347 static void ComputePointStructuredCoords(vtkIdType ptId, const int dim[3], int ijk[3],
348 int dataDescription = vtkStructuredData::VTK_STRUCTURED_EMPTY);
349
354 int extent[6], bool usePixelVoxelOrientation);
355
361 vtkDataArray* zCoords, int extent[6], double dirMatrix[9]);
362
364
368 int extent[6], bool usePixelVoxelOrientation);
370 "Use vtkSmartPointer<vtkConstantArray<unsigned char>> GetCellTypes(extent, "
371 "usePixelVoxelOrientation) instead")
372 VTK_WRAPEXCLUDE static vtkSmartPointer<vtkConstantArray<int>> GetCellTypesArray(
373 int extent[6], bool usePixelVoxelOrientation);
375
376protected:
377 vtkStructuredData() = default;
378 ~vtkStructuredData() override = default;
379
387 static vtkIdType GetLinearIndex(const int i, const int j, const int k, const int N1, const int N2)
388 {
389 return ((static_cast<vtkIdType>(k) * N2 + j) * N1 + i);
390 }
391
393
400 const vtkIdType idx, const int N1, const int N2, int& i, int& j, int& k)
401 {
402 vtkIdType N12 = N1 * N2;
403 k = static_cast<int>(idx / N12);
404 j = static_cast<int>((idx - k * N12) / N1);
405 i = static_cast<int>(idx - k * N12 - j * N1);
406 }
408
409 // Want to avoid importing <algorithm> in the header...
410 template <typename T>
411 static T Max(const T& a, const T& b)
412 {
413 return (a > b) ? a : b;
414 }
415
416private:
417 vtkStructuredData(const vtkStructuredData&) = delete;
418 void operator=(const vtkStructuredData&) = delete;
419};
420
421//------------------------------------------------------------------------------
422inline void vtkStructuredData::GetCellDimensionsFromExtent(const int ext[6], int celldims[3], int)
423{
424 celldims[0] = vtkStructuredData::Max(ext[1] - ext[0], 0);
425 celldims[1] = vtkStructuredData::Max(ext[3] - ext[2], 0);
426 celldims[2] = vtkStructuredData::Max(ext[5] - ext[4], 0);
427}
428
429//------------------------------------------------------------------------------
430inline vtkIdType vtkStructuredData::ComputePointId(const int dims[3], const int ijk[3], int)
431{
432 return vtkStructuredData::GetLinearIndex(ijk[0], ijk[1], ijk[2], dims[0], dims[1]);
433}
434
435//------------------------------------------------------------------------------
436inline vtkIdType vtkStructuredData::ComputeCellId(const int dims[3], const int ijk[3], int)
437{
438 return vtkStructuredData::GetLinearIndex(ijk[0], ijk[1], ijk[2],
439 vtkStructuredData::Max(dims[0] - 1, 1), vtkStructuredData::Max(dims[1] - 1, 1));
440}
441
442//------------------------------------------------------------------------------
444{
445 return static_cast<vtkIdType>(ext[1] - ext[0] + 1) * static_cast<vtkIdType>(ext[3] - ext[2] + 1) *
446 static_cast<vtkIdType>(ext[5] - ext[4] + 1);
447}
448
449//------------------------------------------------------------------------------
451{
452 int dims[3];
454
455 // if any of the dimensions is 0, then there are no cells
456 const int cellDims[3] = { dims[0] != 0 ? vtkStructuredData::Max(dims[0] - 1, 1) : 0,
457 dims[1] != 0 ? vtkStructuredData::Max(dims[1] - 1, 1) : 0,
458 dims[2] != 0 ? vtkStructuredData::Max(dims[2] - 1, 1) : 0 };
459
460 // Note, when we compute the result below, we statically cast to vtkIdType to
461 // ensure the compiler will generate a 32x32=64 instruction.
462 return static_cast<vtkIdType>(cellDims[0]) * static_cast<vtkIdType>(cellDims[1]) *
463 static_cast<vtkIdType>(cellDims[2]);
464}
465
466//------------------------------------------------------------------------------
468 const int nodeExtent[6], int cellExtent[6], int)
469{
470 cellExtent[0] = nodeExtent[0];
471 cellExtent[2] = nodeExtent[2];
472 cellExtent[4] = nodeExtent[4];
473
474 cellExtent[1] = vtkStructuredData::Max(nodeExtent[0], nodeExtent[1] - 1);
475 cellExtent[3] = vtkStructuredData::Max(nodeExtent[2], nodeExtent[3] - 1);
476 cellExtent[5] = vtkStructuredData::Max(nodeExtent[4], nodeExtent[5] - 1);
477}
478
479//------------------------------------------------------------------------------
480inline void vtkStructuredData::GetDimensionsFromExtent(const int ext[6], int dims[3], int)
481{
482 dims[0] = ext[1] - ext[0] + 1;
483 dims[1] = ext[3] - ext[2] + 1;
484 dims[2] = ext[5] - ext[4] + 1;
485}
486
487//------------------------------------------------------------------------------
489 const int nodeDims[3], int cellDims[3])
490{
491 cellDims[0] = vtkStructuredData::Max(nodeDims[0] - 1, 0);
492 cellDims[1] = vtkStructuredData::Max(nodeDims[1] - 1, 0);
493 cellDims[2] = vtkStructuredData::Max(nodeDims[2] - 1, 0);
494}
495
496//------------------------------------------------------------------------------
498 const int ijk[3], const int ext[6], int lijk[3], int)
499{
500 lijk[0] = ijk[0] - ext[0];
501 lijk[1] = ijk[1] - ext[2];
502 lijk[2] = ijk[2] - ext[4];
503}
504
505//------------------------------------------------------------------------------
507 const int lijk[3], const int ext[6], int ijk[3], int)
508{
509 ijk[0] = ext[0] + lijk[0];
510 ijk[1] = ext[2] + lijk[1];
511 ijk[2] = ext[4] + lijk[2];
512}
513
514//------------------------------------------------------------------------------
516 const int extent[6], const int ijk[3], int)
517{
518 int dims[3];
520
521 int lijk[3];
523
524 return vtkStructuredData::ComputePointId(dims, lijk);
525}
526
527//------------------------------------------------------------------------------
529 const int extent[6], const int ijk[3], int)
530{
531 int nodeDims[3];
533
534 int lijk[3];
536
537 return vtkStructuredData::ComputeCellId(nodeDims, lijk);
538}
539
540//------------------------------------------------------------------------------
542 vtkIdType cellId, const int dims[3], int ijk[3], int)
543{
545 cellId, dims[0] - 1, dims[1] - 1, ijk[0], ijk[1], ijk[2]);
546}
547
548//------------------------------------------------------------------------------
550 vtkIdType cellIdx, const int ext[6], int ijk[3], int)
551{
552 int nodeDims[3];
554
555 int lijk[3];
556 vtkStructuredData::ComputeCellStructuredCoords(cellIdx, nodeDims, lijk);
557
559}
560
561//------------------------------------------------------------------------------
563 vtkIdType ptId, const int dim[3], int ijk[3], int)
564{
565 vtkStructuredData::GetStructuredCoordinates(ptId, dim[0], dim[1], ijk[0], ijk[1], ijk[2]);
566}
567
568//------------------------------------------------------------------------------
570 vtkIdType ptId, const int ext[6], int ijk[3], int)
571{
572 int nodeDims[3];
574
575 int lijk[3];
577
579}
580
581VTK_ABI_NAMESPACE_END
582#endif
abstract superclass for arrays of numeric data
list of point or cell ids
Definition vtkIdList.h:133
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:108
abstract base class for most VTK objects
Definition vtkObject.h:162
represent and manipulate 3D points
Definition vtkPoints.h:139
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,...
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< 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
A utility structure serving as a backend for constant implicit arrays.
#define VTK_DEPRECATED_IN_9_6_0(reason)
#define VTK_DEPRECATED_IN_9_5_0(reason)
vtkStructuredDataType
@ VTK_YZ_PLANE
@ VTK_XYZ_GRID
@ VTK_XY_PLANE
@ VTK_Y_LINE
@ VTK_Z_LINE
@ VTK_XZ_PLANE
@ VTK_X_LINE
@ VTK_SINGLE_POINT
@ VTK_EMPTY
@ VTK_UNCHANGED
int vtkIdType
Definition vtkType.h:367
@ VTK_CONSTANT_ARRAY
Definition vtkType.h:93
#define VTK_WRAPEXCLUDE