VTK  9.0.1
vtkAMRBox.h
Go to the documentation of this file.
1 /*=========================================================================
2 
3  Program: Visualization Toolkit
4  Module: vtkAMRBox.h
5 
6  Copyright (c) Ken Martin, Will Schroeder, Bill Lorensen
7  All rights reserved.
8  See Copyright.txt or http://www.kitware.com/Copyright.htm for details.
9 
10  This software is distributed WITHOUT ANY WARRANTY; without even
11  the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
12  PURPOSE. See the above copyright notice for more information.
13 
14 =========================================================================*/
26 #ifndef vtkAMRBox_h
27 #define vtkAMRBox_h
28 
29 #include "vtkCommonDataModelModule.h" // For export macro
30 #include "vtkObject.h"
31 #include "vtkStructuredData.h" // For VTK_XYZ_GRID definition
32 
33 class VTKCOMMONDATAMODEL_EXPORT vtkAMRBox
34 {
35 public:
39  vtkAMRBox();
40 
44  vtkAMRBox(const vtkAMRBox& other);
45 
49  vtkAMRBox(int ilo, int jlo, int klo, int ihi, int jhi, int khi);
50 
55  vtkAMRBox(const double* origin, const int* dimensions, const double* spacing,
56  const double* globalOrigin, int gridDescription = VTK_XYZ_GRID);
57 
61  vtkAMRBox(const int lo[3], const int hi[3]);
62 
63  vtkAMRBox(const int dims[6]);
64 
68  vtkAMRBox& operator=(const vtkAMRBox& other);
69 
70  virtual ~vtkAMRBox() {}
71 
73 
76  void Invalidate()
77  {
78  this->LoCorner[0] = this->LoCorner[1] = this->LoCorner[2] = 0;
79  this->HiCorner[0] = this->HiCorner[1] = this->HiCorner[2] = -2;
80  }
82 
86  bool EmptyDimension(int i) const { return HiCorner[i] <= LoCorner[i] - 1; }
87 
91  void SetDimensions(int ilo, int jlo, int klo, int ihi, int jhi, int khi, int desc = VTK_XYZ_GRID);
92 
96  void SetDimensions(const int lo[3], const int hi[3], int desc = VTK_XYZ_GRID);
97 
101  void SetDimensions(const int dims[6], int desc = VTK_XYZ_GRID);
102 
106  void GetDimensions(int lo[3], int hi[3]) const;
107 
111  void GetDimensions(int dims[6]) const;
112 
114 
117  vtkIdType GetNumberOfCells() const;
118  void GetNumberOfCells(int num[3]) const;
120 
122 
126  void GetNumberOfNodes(int ext[3]) const;
127  vtkIdType GetNumberOfNodes() const;
129 
135  int ComputeDimension() const;
136 
140  const int* GetLoCorner() const { return this->LoCorner; }
141  const int* GetHiCorner() const { return this->HiCorner; }
142 
148  void GetValidHiCorner(int hi[3]) const;
149 
150  bool Empty() const { return this->IsInvalid(); }
151 
155  bool IsInvalid() const
156  {
157  return ((this->HiCorner[0] < this->LoCorner[0] - 1) ||
158  (this->HiCorner[1] < this->LoCorner[1] - 1) || (this->HiCorner[2] < this->LoCorner[2] - 1));
159  }
160 
166  bool operator==(const vtkAMRBox& other) const;
167 
173  bool operator!=(const vtkAMRBox& other) const { return (!(*this == other)); }
174 
178  ostream& Print(ostream& os) const;
179 
181 
192  void Serialize(unsigned char*& buffer, vtkIdType& bytesize);
193  void Serialize(int* buffer) const;
195 
202  void Deserialize(unsigned char* buffer, const vtkIdType& bytesize);
203 
210  bool DoesBoxIntersectAlongDimension(const vtkAMRBox& other, const int q) const;
211 
212  bool DoesIntersect(const vtkAMRBox& other) const;
213 
217  void Coarsen(int r);
218 
222  void Refine(int r);
223 
225 
228  void Grow(int byN);
229  void Shrink(int byN);
231 
233 
236  void Shift(int i, int j, int k);
237  void Shift(const int I[3]);
239 
245  bool Intersect(const vtkAMRBox& other);
246 
248 
251  bool Contains(int i, int j, int k) const;
252  bool Contains(const int I[3]) const;
254 
258  bool Contains(const vtkAMRBox&) const;
259 
265  void GetGhostVector(int r, int nghost[6]) const;
266 
271  void RemoveGhosts(int r);
272 
273 public:
279  static vtkIdType GetBytesize() { return 6 * sizeof(int); }
280 
284  static int GetCellLinearIndex(
285  const vtkAMRBox& box, const int i, const int j, const int k, int imageDimension[3]);
286 
290  static void GetBounds(
291  const vtkAMRBox& box, const double origin[3], const double spacing[3], double bounds[6]);
292 
297  static void GetBoxOrigin(
298  const vtkAMRBox& box, const double X0[3], const double spacing[3], double x0[3]);
299 
304  static bool HasPoint(const vtkAMRBox& box, const double origin[3], const double spacing[3],
305  double x, double y, double z);
306 
310  static int ComputeStructuredCoordinates(const vtkAMRBox& box, const double dataOrigin[3],
311  const double h[3], const double x[3], int ijk[3], double pcoords[3]);
312 
313 protected:
317  void Initialize();
318 
325  bool IntersectBoxAlongDimension(const vtkAMRBox& other, const int q);
326 
327 private:
328  int LoCorner[3]; // lo corner cell id.
329  int HiCorner[3]; // hi corner cell id.
330 
332 
337  void BuildAMRBox(
338  const int ilo, const int jlo, const int klo, const int ihi, const int jhi, const int khi);
340 };
341 
342 //*****************************************************************************
344 
348 template <typename T>
349 void FillRegion(T* pArray, const vtkAMRBox& arrayRegion, const vtkAMRBox& destRegion, T fillValue)
350 {
351  // Convert regions to array index space. VTK arrays
352  // always start with 0,0,0.
353  int ofs[3];
354  ofs[0] = -arrayRegion.GetLoCorner()[0];
355  ofs[1] = -arrayRegion.GetLoCorner()[1];
356  ofs[2] = -arrayRegion.GetLoCorner()[2];
357  vtkAMRBox arrayDims(arrayRegion);
358  arrayDims.Shift(ofs);
359  vtkAMRBox destDims(destRegion);
360  destDims.Shift(ofs);
361  // Quick sanity check.
362  if (!arrayRegion.Contains(destRegion))
363  {
364  vtkGenericWarningMacro(<< "ERROR: Array must enclose the destination region. "
365  << "Aborting the fill.");
366  }
367  // Get the bounds of the indices we fill.
368  const int* destLo = destDims.GetLoCorner();
369  int destHi[3];
370  destDims.GetValidHiCorner(destHi);
371  // Get the array dimensions.
372  int arrayHi[3];
373  arrayDims.GetNumberOfCells(arrayHi);
374  // Fill.
375  for (int k = destLo[2]; k <= destHi[2]; ++k)
376  {
377  vtkIdType kOfs = k * arrayHi[0] * arrayHi[1];
378  for (int j = destLo[1]; j <= destHi[1]; ++j)
379  {
380  vtkIdType idx = kOfs + j * arrayHi[0] + destLo[0];
381  for (int i = destLo[0]; i <= destHi[0]; ++i)
382  {
383  pArray[idx] = fillValue;
384  ++idx;
385  }
386  }
387  }
389 }
390 
391 #endif
392 // VTK-HeaderTest-Exclude: vtkAMRBox.h
bool EmptyDimension(int i) const
Whether dimension i is empty, e.g.
Definition: vtkAMRBox.h:86
const int * GetLoCorner() const
Get the low corner index.
Definition: vtkAMRBox.h:140
bool Empty() const
Definition: vtkAMRBox.h:150
bool Contains(int i, int j, int k) const
Test to see if a given cell index is inside this box.
Encloses a rectangular region of voxel like cells.
Definition: vtkAMRBox.h:33
bool IsInvalid() const
Check to see if the AMR box instance is invalid.
Definition: vtkAMRBox.h:155
void FillRegion(T *pArray, const vtkAMRBox &arrayRegion, const vtkAMRBox &destRegion, T fillValue)
Fill the region of "pArray" enclosed by "destRegion" with "fillValue" "pArray" is defined on "arrayRe...
Definition: vtkAMRBox.h:349
void Print(const std::vector< T > &input, const std::string &name)
Print a vector with an associated name.
int vtkIdType
Definition: vtkType.h:338
void Shift(int i, int j, int k)
Shifts the box in index space.
vtkIdType GetNumberOfCells() const
Gets the number of cells enclosed by the box.
void GetValidHiCorner(int hi[3]) const
Return a high corner.
const int * GetHiCorner() const
Definition: vtkAMRBox.h:141
bool operator!=(const vtkAMRBox &other) const
Test if this box is NOT equal with the box instance on the rhs.
Definition: vtkAMRBox.h:173
virtual ~vtkAMRBox()
Definition: vtkAMRBox.h:70
#define VTK_XYZ_GRID
static vtkIdType GetBytesize()
Returns the number of bytes allocated by this instance.
Definition: vtkAMRBox.h:279
VTKCOMMONCORE_EXPORT bool operator==(const vtkUnicodeString &lhs, const vtkUnicodeString &rhs)
void Invalidate()
Set the box to be invalid;.
Definition: vtkAMRBox.h:76