VTK  9.7.20260805
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
22
23#ifndef vtkStructuredData_h
24#define vtkStructuredData_h
25
26#include "vtkCommonDataModelModule.h" // For export macro
27#include "vtkObject.h"
28#include "vtkSmartPointer.h" // For vtkSmartPointer
29
30VTK_ABI_NAMESPACE_BEGIN
31class vtkDataArray;
32class vtkIdList;
33class vtkPoints;
36template <typename T>
38
39class VTKCOMMONDATAMODEL_EXPORT vtkStructuredData : public vtkObject
40{
41public:
43 void PrintSelf(ostream& os, vtkIndent indent) override;
44
51 {
52 VTK_STRUCTURED_INVALID = -1, // An invalid/unset/unitialized grid
54 0, // Used by vtkStructuredData API to signify that the type of the grid was not changed
55 VTK_STRUCTURED_SINGLE_POINT = 1, // A single point, 0D
56 VTK_STRUCTURED_X_LINE = 2, // X aligned line, 1D
57 VTK_STRUCTURED_Y_LINE = 3, // Y aligned line, 1D
58 VTK_STRUCTURED_Z_LINE = 4, // Z aligned line, 1D
59 VTK_STRUCTURED_XY_PLANE = 5, // XY aligned plane, 2D
60 VTK_STRUCTURED_YZ_PLANE = 6, // XY aligned plane, 2D
61 VTK_STRUCTURED_XZ_PLANE = 7, // XY aligned plane, 2D
62 VTK_STRUCTURED_XYZ_GRID = 8, // XYZ grid, 3D
63 VTK_STRUCTURED_EMPTY = 9 // An empty grid
64 };
65
67
74 static int SetDimensions(VTK_FUTURE_CONST int inDim[3], int dim[3]);
75 static int SetExtent(VTK_FUTURE_CONST int inExt[6], int ext[6]);
77
79
83 static int GetDataDescription(int dims[3]);
84 static int GetDataDescriptionFromExtent(VTK_FUTURE_CONST int ext[6]);
86
88
91 static int GetDataDimension(int dataDescription);
92 static int GetDataDimension(int ext[6]);
94
101 const int ext[6], int dataDescription = vtkStructuredData::VTK_STRUCTURED_EMPTY);
102
109 const int ext[6], int dataDescription = vtkStructuredData::VTK_STRUCTURED_EMPTY);
110
116 static void GetCellExtentFromPointExtent(const int pntExtent[6], int cellExtent[6],
117 int dataDescription = vtkStructuredData::VTK_STRUCTURED_EMPTY);
118
123 static inline void GetDimensionsFromExtent(
124 const int ext[6], int dims[3], int dataDescription = vtkStructuredData::VTK_STRUCTURED_EMPTY);
125
129 static bool IsPointVisible(vtkIdType cellId, vtkUnsignedCharArray* ghosts);
130
134 static bool IsCellVisible(vtkIdType cellId, VTK_FUTURE_CONST int dimensions[3],
135 int dataDescription, vtkUnsignedCharArray* cellGhostArray,
136 vtkUnsignedCharArray* pointGhostArray = nullptr);
137
144 static void GetCellDimensionsFromExtent(const int ext[6], int celldims[3],
145 int dataDescription = vtkStructuredData::VTK_STRUCTURED_EMPTY);
146
152 static void GetCellDimensionsFromPointDimensions(const int pntdims[3], int cellDims[3]);
153
160 static void GetLocalStructuredCoordinates(const int ijk[3], const int ext[6], int lijk[3],
161 int dataDescription = vtkStructuredData::VTK_STRUCTURED_EMPTY);
162
168 static void GetGlobalStructuredCoordinates(const int lijk[3], const int ext[6], int ijk[3],
169 int dataDescription = vtkStructuredData::VTK_STRUCTURED_EMPTY);
170
175 static void GetCellPoints(vtkIdType cellId, vtkIdList* ptIds, int dataDescription, int dim[3]);
176
180 static void GetPointCells(vtkIdType ptId, vtkIdList* cellIds, VTK_FUTURE_CONST int dim[3]);
181
186 static void GetCellNeighbors(vtkIdType cellId, vtkIdList* ptIds, vtkIdList* cellIds, int dim[3]);
187 static void GetCellNeighbors(
188 vtkIdType cellId, vtkIdList* ptIds, vtkIdList* cellIds, int dim[3], int seedLoc[3]);
189
195 static vtkIdType ComputePointIdForExtent(const int extent[6], const int ijk[3],
196 int dataDescription = vtkStructuredData::VTK_STRUCTURED_EMPTY);
197
203 static vtkIdType ComputeCellIdForExtent(const int extent[6], const int ijk[3],
204 int dataDescription = vtkStructuredData::VTK_STRUCTURED_EMPTY);
205
212 static vtkIdType ComputePointId(const int dim[3], const int ijk[3],
213 int dataDescription = vtkStructuredData::VTK_STRUCTURED_EMPTY);
214
221 static vtkIdType ComputeCellId(const int dim[3], const int ijk[3],
222 int dataDescription = vtkStructuredData::VTK_STRUCTURED_EMPTY);
223
230 static void ComputeCellStructuredCoordsForExtent(vtkIdType cellIdx, const int ext[6], int ijk[3],
231 int dataDescription = vtkStructuredData::VTK_STRUCTURED_EMPTY);
232
238 static void ComputeCellStructuredCoords(vtkIdType cellId, const int dim[3], int ijk[3],
239 int dataDescription = vtkStructuredData::VTK_STRUCTURED_EMPTY);
240
245 static void ComputeCellStructuredMinMaxCoords(vtkIdType cellId, const int dim[3], int ijkMin[3],
246 int ijkMax[3], int dataDescription = vtkStructuredData::VTK_STRUCTURED_EMPTY);
247
253 static void ComputePointStructuredCoordsForExtent(vtkIdType ptId, const int ext[6], int ijk[3],
254 int dataDescription = vtkStructuredData::VTK_STRUCTURED_EMPTY);
255
261 static void ComputePointStructuredCoords(vtkIdType ptId, const int dim[3], int ijk[3],
262 int dataDescription = vtkStructuredData::VTK_STRUCTURED_EMPTY);
263
268 int extent[6], bool usePixelVoxelOrientation);
269
275 vtkDataArray* zCoords, int extent[6], double dirMatrix[9]);
276
281 int extent[6], bool usePixelVoxelOrientation);
282
283protected:
284 vtkStructuredData() = default;
285 ~vtkStructuredData() override = default;
286
294 static vtkIdType GetLinearIndex(const int i, const int j, const int k, const int N1, const int N2)
295 {
296 return ((static_cast<vtkIdType>(k) * N2 + j) * N1 + i);
297 }
298
300
307 const vtkIdType idx, const int N1, const int N2, int& i, int& j, int& k)
308 {
309 vtkIdType N12 = N1 * N2;
310 k = static_cast<int>(idx / N12);
311 j = static_cast<int>((idx - k * N12) / N1);
312 i = static_cast<int>(idx - k * N12 - j * N1);
313 }
314
315
316 // Want to avoid importing <algorithm> in the header...
317 template <typename T>
318 static T Max(const T& a, const T& b)
319 {
320 return (a > b) ? a : b;
321 }
322
323private:
324 vtkStructuredData(const vtkStructuredData&) = delete;
325 void operator=(const vtkStructuredData&) = delete;
326};
327
328//------------------------------------------------------------------------------
329inline void vtkStructuredData::GetCellDimensionsFromExtent(const int ext[6], int celldims[3], int)
330{
331 celldims[0] = vtkStructuredData::Max(ext[1] - ext[0], 0);
332 celldims[1] = vtkStructuredData::Max(ext[3] - ext[2], 0);
333 celldims[2] = vtkStructuredData::Max(ext[5] - ext[4], 0);
334}
335
336//------------------------------------------------------------------------------
337inline vtkIdType vtkStructuredData::ComputePointId(const int dims[3], const int ijk[3], int)
338{
339 return vtkStructuredData::GetLinearIndex(ijk[0], ijk[1], ijk[2], dims[0], dims[1]);
340}
341
342//------------------------------------------------------------------------------
343inline vtkIdType vtkStructuredData::ComputeCellId(const int dims[3], const int ijk[3], int)
344{
345 return vtkStructuredData::GetLinearIndex(ijk[0], ijk[1], ijk[2],
346 vtkStructuredData::Max(dims[0] - 1, 1), vtkStructuredData::Max(dims[1] - 1, 1));
347}
348
349//------------------------------------------------------------------------------
351{
352 return static_cast<vtkIdType>(ext[1] - ext[0] + 1) * static_cast<vtkIdType>(ext[3] - ext[2] + 1) *
353 static_cast<vtkIdType>(ext[5] - ext[4] + 1);
354}
355
356//------------------------------------------------------------------------------
358{
359 int dims[3];
361
362 // if any of the dimensions is 0, then there are no cells
363 const int cellDims[3] = { dims[0] != 0 ? vtkStructuredData::Max(dims[0] - 1, 1) : 0,
364 dims[1] != 0 ? vtkStructuredData::Max(dims[1] - 1, 1) : 0,
365 dims[2] != 0 ? vtkStructuredData::Max(dims[2] - 1, 1) : 0 };
366
367 // Note, when we compute the result below, we statically cast to vtkIdType to
368 // ensure the compiler will generate a 32x32=64 instruction.
369 return static_cast<vtkIdType>(cellDims[0]) * static_cast<vtkIdType>(cellDims[1]) *
370 static_cast<vtkIdType>(cellDims[2]);
371}
372
373//------------------------------------------------------------------------------
375 const int nodeExtent[6], int cellExtent[6], int)
376{
377 cellExtent[0] = nodeExtent[0];
378 cellExtent[2] = nodeExtent[2];
379 cellExtent[4] = nodeExtent[4];
380
381 cellExtent[1] = vtkStructuredData::Max(nodeExtent[0], nodeExtent[1] - 1);
382 cellExtent[3] = vtkStructuredData::Max(nodeExtent[2], nodeExtent[3] - 1);
383 cellExtent[5] = vtkStructuredData::Max(nodeExtent[4], nodeExtent[5] - 1);
384}
385
386//------------------------------------------------------------------------------
387void vtkStructuredData::GetDimensionsFromExtent(const int ext[6], int dims[3], int)
388{
389 dims[0] = ext[1] - ext[0] + 1;
390 dims[1] = ext[3] - ext[2] + 1;
391 dims[2] = ext[5] - ext[4] + 1;
392}
393
394//------------------------------------------------------------------------------
396 const int nodeDims[3], int cellDims[3])
397{
398 cellDims[0] = vtkStructuredData::Max(nodeDims[0] - 1, 0);
399 cellDims[1] = vtkStructuredData::Max(nodeDims[1] - 1, 0);
400 cellDims[2] = vtkStructuredData::Max(nodeDims[2] - 1, 0);
401}
402
403//------------------------------------------------------------------------------
405 const int ijk[3], const int ext[6], int lijk[3], int)
406{
407 lijk[0] = ijk[0] - ext[0];
408 lijk[1] = ijk[1] - ext[2];
409 lijk[2] = ijk[2] - ext[4];
410}
411
412//------------------------------------------------------------------------------
414 const int lijk[3], const int ext[6], int ijk[3], int)
415{
416 ijk[0] = ext[0] + lijk[0];
417 ijk[1] = ext[2] + lijk[1];
418 ijk[2] = ext[4] + lijk[2];
419}
420
421//------------------------------------------------------------------------------
423 const int extent[6], const int ijk[3], int)
424{
425 int dims[3];
427
428 int lijk[3];
430
431 return vtkStructuredData::ComputePointId(dims, lijk);
432}
433
434//------------------------------------------------------------------------------
436 const int extent[6], const int ijk[3], int)
437{
438 int nodeDims[3];
440
441 int lijk[3];
443
444 return vtkStructuredData::ComputeCellId(nodeDims, lijk);
445}
446
447//------------------------------------------------------------------------------
449 vtkIdType cellId, const int dims[3], int ijk[3], int)
450{
452 cellId, dims[0] - 1, dims[1] - 1, ijk[0], ijk[1], ijk[2]);
453}
454
455//------------------------------------------------------------------------------
457 vtkIdType cellIdx, const int ext[6], int ijk[3], int)
458{
459 int nodeDims[3];
461
462 int lijk[3];
463 vtkStructuredData::ComputeCellStructuredCoords(cellIdx, nodeDims, lijk);
464
466}
467
468//------------------------------------------------------------------------------
470 vtkIdType ptId, const int dim[3], int ijk[3], int)
471{
472 vtkStructuredData::GetStructuredCoordinates(ptId, dim[0], dim[1], ijk[0], ijk[1], ijk[2]);
473}
474
475//------------------------------------------------------------------------------
477 vtkIdType ptId, const int ext[6], int ijk[3], int)
478{
479 int nodeDims[3];
481
482 int lijk[3];
484
486}
487
488VTK_ABI_NAMESPACE_END
489#endif
A utility array for wrapping constant functions in implicit arrays.
list of point or cell ids
Definition vtkIdList.h:26
a simple class to control print indentation
Definition vtkIndent.h:29
represent and manipulate 3D points
Definition vtkPoints.h:31
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 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< 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).
~vtkStructuredData() override=default
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 int GetDataDescriptionFromExtent(VTK_FUTURE_CONST int ext[6])
Returns the data description given the dimensions (eg.
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
int vtkIdType
Definition vtkType.h:363
#define VTK_WRAPEXCLUDE