VTK  9.0.20210616
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() = default;
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
vtkAMRBox
Encloses a rectangular region of voxel like cells.
Definition: vtkAMRBox.h:34
vtkAMRBox::Coarsen
void Coarsen(int r)
Coarsen the box.
vtkAMRBox::Intersect
bool Intersect(const vtkAMRBox &other)
Intersect this box with another box in place.
vtkAMRBox::Contains
bool Contains(const int I[3]) const
Test to see if a given cell index is inside this box.
vtkAMRBox::SetDimensions
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.
vtkAMRBox::Print
ostream & Print(ostream &os) const
Send the box to a stream.
vtkAMRBox::DoesBoxIntersectAlongDimension
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...
vtkIdType
int vtkIdType
Definition: vtkType.h:332
vtkAMRBox::GetBounds
static void GetBounds(const vtkAMRBox &box, const double origin[3], const double spacing[3], double bounds[6])
Get the bounds of this box.
vtkAMRBox::Deserialize
void Deserialize(unsigned char *buffer, const vtkIdType &bytesize)
Deserializes this object instance from the given byte-stream.
vtkAMRBox::Shift
void Shift(const int I[3])
Shifts the box in index space.
vtkAMRBox::EmptyDimension
bool EmptyDimension(int i) const
Whether dimension i is empty, e.g.
Definition: vtkAMRBox.h:86
vtkAMRBox::Grow
void Grow(int byN)
Grows the box in all directions.
vtkAMRBox::vtkAMRBox
vtkAMRBox()
Construct the empty box.
vtkAMRBox::vtkAMRBox
vtkAMRBox(int ilo, int jlo, int klo, int ihi, int jhi, int khi)
Construct a specific 3D box.
vtkAMRBox::Serialize
void Serialize(int *buffer) const
Serializes this object instance into a byte-stream.
vtkAMRBox::GetHiCorner
const int * GetHiCorner() const
Definition: vtkAMRBox.h:141
vtkAMRBox::vtkAMRBox
vtkAMRBox(const int lo[3], const int hi[3])
Construct a specific box.
FillRegion
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
vtkAMRBox::GetLoCorner
const int * GetLoCorner() const
Get the low corner index.
Definition: vtkAMRBox.h:140
vtkAMRBox::Empty
bool Empty() const
Definition: vtkAMRBox.h:150
vtkAMRBox::GetNumberOfNodes
void GetNumberOfNodes(int ext[3]) const
Gets the number of nodes required to construct a physical representation of the box.
vtkAMRBox::GetNumberOfNodes
vtkIdType GetNumberOfNodes() const
Gets the number of nodes required to construct a physical representation of the box.
vtkAMRBox::vtkAMRBox
vtkAMRBox(const int dims[6])
vtkAMRBox::vtkAMRBox
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 ...
vtkAMRBox::Shift
void Shift(int i, int j, int k)
Shifts the box in index space.
vtkAMRBox::Contains
bool Contains(const vtkAMRBox &) const
Test to see if a given box is inside this box.
vtkStructuredData.h
vtkAMRBox::operator==
bool operator==(const vtkAMRBox &other) const
Test if this box is equal with the box instance on the rhs.
vtkAMRBox::SetDimensions
void SetDimensions(const int dims[6], int desc=VTK_XYZ_GRID)
Set the dimensions of the box.
vtkAMRBox::Contains
bool Contains(int i, int j, int k) const
Test to see if a given cell index is inside this box.
vtkAMRBox::GetNumberOfCells
vtkIdType GetNumberOfCells() const
Gets the number of cells enclosed by the box.
VTK_XYZ_GRID
#define VTK_XYZ_GRID
Definition: vtkStructuredData.h:46
vtkAMRBox::GetDimensions
void GetDimensions(int lo[3], int hi[3]) const
Get the dimensions of this box.
vtkAMRBox::GetBytesize
static vtkIdType GetBytesize()
Returns the number of bytes allocated by this instance.
Definition: vtkAMRBox.h:279
vtkAMRBox::vtkAMRBox
vtkAMRBox(const vtkAMRBox &other)
Copy construct this box from another.
vtkAMRBox::RemoveGhosts
void RemoveGhosts(int r)
Given an AMR box and the refinement ratio, r, this shrinks the AMRBox.
vtkAMRBox::GetBoxOrigin
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.
vtkAMRBox::GetDimensions
void GetDimensions(int dims[6]) const
Get the dimensions of this box.
vtkAMRBox::Shrink
void Shrink(int byN)
Grows the box in all directions.
vtkAMRBox::Refine
void Refine(int r)
Refine the box.
vtkObject.h
vtkX3D::spacing
@ spacing
Definition: vtkX3D.h:487
vtkAMRBox::GetValidHiCorner
void GetValidHiCorner(int hi[3]) const
Return a high corner.
vtkAMRBox::IsInvalid
bool IsInvalid() const
Check to see if the AMR box instance is invalid.
Definition: vtkAMRBox.h:155
vtkAMRBox::Invalidate
void Invalidate()
Set the box to be invalid;.
Definition: vtkAMRBox.h:76
vtkAMRBox::DoesIntersect
bool DoesIntersect(const vtkAMRBox &other) const
vtkAMRBox::ComputeDimension
int ComputeDimension() const
Determines the dimension of the AMR box given the box indices.
vtkAMRBox::Serialize
void Serialize(unsigned char *&buffer, vtkIdType &bytesize)
Serializes this object instance into a byte-stream.
vtkAMRBox::GetNumberOfCells
void GetNumberOfCells(int num[3]) const
Gets the number of cells enclosed by the box.
vtkAMRBox::Initialize
void Initialize()
Initializes this box instance.
vtkAMRBox::~vtkAMRBox
virtual ~vtkAMRBox()=default
vtkAMRBox::operator=
vtkAMRBox & operator=(const vtkAMRBox &other)
Copy the other box to this box.
vtkAMRBox::HasPoint
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.
vtkAMRBox::SetDimensions
void SetDimensions(const int lo[3], const int hi[3], int desc=VTK_XYZ_GRID)
Set the dimensions of the box.
vtkAMRBox::operator!=
bool operator!=(const vtkAMRBox &other) const
Test if this box is NOT equal with the box instance on the rhs.
Definition: vtkAMRBox.h:173
h
vtkFrustumSelector is a vtkSelector that selects elements based on whether they are inside or interse...
vtkAMRBox::IntersectBoxAlongDimension
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::GetCellLinearIndex
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.
vtkAMRBox::ComputeStructuredCoordinates
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.
vtkAMRBox::GetGhostVector
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...