VTK  9.0.2
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:
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 
118  void GetNumberOfCells(int num[3]) const;
120 
122 
126  void GetNumberOfNodes(int ext[3]) 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
Encloses a rectangular region of voxel like cells.
Definition: vtkAMRBox.h:34
bool Contains(const vtkAMRBox &) const
Test to see if a given box is inside this box.
bool IntersectBoxAlongDimension(const vtkAMRBox &other, const int q)
Intersects this instance of vtkAMRbox with box passed through the argument list along the given dimen...
vtkAMRBox(const int dims[6])
vtkAMRBox & operator=(const vtkAMRBox &other)
Copy the other box to this box.
vtkAMRBox(const vtkAMRBox &other)
Copy construct this box from another.
void Invalidate()
Set the box to be invalid;.
Definition: vtkAMRBox.h:76
void Serialize(int *buffer) const
void Grow(int byN)
Grows the box in all directions.
int ComputeDimension() const
Determines the dimension of the AMR box given the box indices.
void Shift(const int I[3])
void Refine(int r)
Refine the box.
bool Contains(const int I[3]) const
static vtkIdType GetBytesize()
Returns the number of bytes allocated by this instance.
Definition: vtkAMRBox.h:279
static int GetCellLinearIndex(const vtkAMRBox &box, const int i, const int j, const int k, int imageDimension[3])
Returns the linear index of the given cell structured coordinates.
bool operator==(const vtkAMRBox &other) const
Test if this box is equal with the box instance on the rhs.
void GetValidHiCorner(int hi[3]) const
Return a high corner.
ostream & Print(ostream &os) const
Send the box to a stream.
const int * GetLoCorner() const
Get the low corner index.
Definition: vtkAMRBox.h:140
void Serialize(unsigned char *&buffer, vtkIdType &bytesize)
Serializes this object instance into a byte-stream.
void SetDimensions(const int lo[3], const int hi[3], int desc=VTK_XYZ_GRID)
Set the dimensions of the box.
bool EmptyDimension(int i) const
Whether dimension i is empty, e.g.
Definition: vtkAMRBox.h:86
static void GetBounds(const vtkAMRBox &box, const double origin[3], const double spacing[3], double bounds[6])
Get the bounds of this box.
vtkAMRBox(int ilo, int jlo, int klo, int ihi, int jhi, int khi)
Construct a specific 3D box.
bool DoesIntersect(const vtkAMRBox &other) const
void Shift(int i, int j, int k)
Shifts the box in index space.
void GetDimensions(int lo[3], int hi[3]) const
Get the dimensions of this box.
virtual ~vtkAMRBox()
Definition: vtkAMRBox.h:70
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.
void Deserialize(unsigned char *buffer, const vtkIdType &bytesize)
Deserializes this object instance from the given byte-stream.
static bool HasPoint(const vtkAMRBox &box, const double origin[3], const double spacing[3], double x, double y, double z)
Checks if the point is inside this AMRBox instance.
void Coarsen(int r)
Coarsen the box.
void Initialize()
Initializes this box instance.
vtkAMRBox(const int lo[3], const int hi[3])
Construct a specific box.
bool Intersect(const vtkAMRBox &other)
Intersect this box with another box in place.
vtkAMRBox()
Construct the empty box.
void RemoveGhosts(int r)
Given an AMR box and the refinement ratio, r, this shrinks the AMRBox.
void GetNumberOfNodes(int ext[3]) const
Gets the number of nodes required to construct a physical representation of the box.
static int ComputeStructuredCoordinates(const vtkAMRBox &box, const double dataOrigin[3], const double h[3], const double x[3], int ijk[3], double pcoords[3])
Compute structured coordinates.
void GetDimensions(int dims[6]) const
Get the dimensions of this box.
bool operator!=(const vtkAMRBox &other) const
Test if this box is NOT equal with the box instance on the rhs.
Definition: vtkAMRBox.h:173
static void GetBoxOrigin(const vtkAMRBox &box, const double X0[3], const double spacing[3], double x0[3])
Get the world space origin of this box.
vtkIdType GetNumberOfNodes() const
void SetDimensions(int ilo, int jlo, int klo, int ihi, int jhi, int khi, int desc=VTK_XYZ_GRID)
Set the dimensions of the box.
void SetDimensions(const int dims[6], int desc=VTK_XYZ_GRID)
Set the dimensions of the box.
void GetNumberOfCells(int num[3]) const
vtkIdType GetNumberOfCells() const
Gets the number of cells enclosed by the box.
const int * GetHiCorner() const
Definition: vtkAMRBox.h:141
bool DoesBoxIntersectAlongDimension(const vtkAMRBox &other, const int q) const
Checks if this instance of vtkAMRBox intersects with the box passed through the argument list along t...
vtkAMRBox(const double *origin, const int *dimensions, const double *spacing, const double *globalOrigin, int gridDescription=VTK_XYZ_GRID)
Construct an AMR box from the description a vtkUniformGrid Note that the dimensions specify the node ...
bool IsInvalid() const
Check to see if the AMR box instance is invalid.
Definition: vtkAMRBox.h:155
void Shrink(int byN)
void GetGhostVector(int r, int nghost[6]) const
Given an AMR box and the refinement ratio, r, this method computes the number of ghost layers in each...
vtkFrustumSelector is a vtkSelector that selects elements based on whether they are inside or interse...
@ spacing
Definition: vtkX3D.h:487
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
#define VTK_XYZ_GRID
int vtkIdType
Definition: vtkType.h:338