00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00035 #ifndef __vtkAMRBox_h
00036 #define __vtkAMRBox_h
00037
00038 #include "vtkObject.h"
00039 #include "vtkType.h"
00040 #include <vtkstd/vector>
00041
00042 class VTK_FILTERING_EXPORT vtkAMRBox
00043 {
00044 public:
00046 vtkAMRBox(int dim=3);
00047
00049
00050 vtkAMRBox(
00051 int ilo,int jlo,int klo,
00052 int ihi,int jhi,int khi);
00054
00056
00057 vtkAMRBox(
00058 int ilo,int jlo,
00059 int ihi,int jhi);
00061
00063
00064 vtkAMRBox(int dim, const int lo[3], const int hi[3]);
00065 vtkAMRBox(const int lo[3], const int hi[3]);
00067
00069
00070 vtkAMRBox(int dim, const int dims[6]);
00071 vtkAMRBox(const int dims[6]);
00073
00075 vtkAMRBox(const vtkAMRBox &other);
00076
00078 vtkAMRBox &operator=(const vtkAMRBox &other);
00079
00081 void Invalidate();
00082
00084
00085 int GetDimensionality() const { return this->Dimension; }
00086 void SetDimensionality(int dim);
00088
00090
00091 void SetDimensions(
00092 int ilo, int jlo, int klo,
00093 int ihi, int jhi, int khi);
00095
00097 void SetDimensions(const int lo[3], const int hi[3]);
00098
00100 void SetDimensions(const int dims[6]);
00101
00103 void GetDimensions(int lo[3], int hi[3]) const;
00104
00106 void GetDimensions(int dims[6]) const;
00107
00109
00110 void GetLoCorner(int lo[3]) const;
00111 const int *GetLoCorner() const { return this->LoCorner; }
00113
00115
00116 void GetHiCorner(int hi[3]) const;
00117 const int *GetHiCorner() const { return this->HiCorner; }
00119
00121
00122 void GetNumberOfCells(int ext[3]) const;
00123 vtkIdType GetNumberOfCells() const;
00125
00127
00129 void GetNumberOfNodes(int ext[3]) const;
00130 vtkIdType GetNumberOfNodes() const;
00132
00134
00136 const double *GetGridSpacing() const { return this->DX; }
00137 void GetGridSpacing(double dX[3]) const;
00138 void SetGridSpacing(double dx);
00139 void SetGridSpacing(const double dX[3]);
00140 void SetGridSpacing(double dx, double dy, double dz);
00142
00144
00148 const double *GetDataSetOrigin() const { return this->X0; }
00149 void GetDataSetOrigin(double X0[3]) const;
00150 void SetDataSetOrigin(const double X0[3]);
00151 void SetDataSetOrigin(double x0, double y0, double z0);
00153
00159 void GetBoxOrigin(double x0[3]) const;
00160
00162 void Grow(int byN);
00163
00165 void Shrink(int byN);
00166
00168
00169 void Shift(int i, int j);
00170 void Shift(int i, int j, int k);
00171 void Shift(const int I[3]);
00173
00175 bool Empty() const;
00176
00178 bool operator==(const vtkAMRBox &other);
00179
00181 void operator&=(const vtkAMRBox &rhs);
00182
00184
00185 bool Contains(int i,int j,int k) const;
00186 bool Contains(const int I[3]) const;
00188
00190 bool Contains(const vtkAMRBox &other) const;
00191
00193 void Refine(int r);
00194
00196 void Coarsen(int r);
00197
00199 ostream &Print(ostream &os) const;
00200
00201
00202
00203
00204 VTK_LEGACY(int DoesContainCell(int i, int j, int k));
00205
00206
00207 VTK_LEGACY(int DoesContainBox(vtkAMRBox const & box) const);
00208
00209
00210 public:
00212
00216 int LoCorner[3];
00217 int HiCorner[3];
00219
00220 private:
00221 int Dimension;
00222 double X0[3];
00223 double DX[3];
00224 };
00225
00226
00227
00228
00229 template<int dimension>
00230 struct vtkAMRBoxInitializeHelp;
00231 template<int dimension>
00232 void vtkAMRBoxInitialize(
00233 int *LoCorner,
00234 int *HiCorner,
00235 const int *loCorner,
00236 const int *hiCorner,
00237 vtkAMRBoxInitializeHelp<dimension>* = 0)
00238 {
00239 for(int i=0; i<dimension; ++i)
00240 {
00241 LoCorner[i] = loCorner[i];
00242 HiCorner[i] = hiCorner[i];
00243 }
00244 for(int i=dimension; i<(3-dimension); ++i)
00245 {
00246 LoCorner[i] = 0;
00247 HiCorner[i] = 0;
00248 }
00249 }
00250
00251
00253
00255 template <typename T>
00256 void FillRegion(
00257 T *pArray,
00258 const vtkAMRBox &arrayRegion,
00259 const vtkAMRBox &destRegion,
00260 T fillValue)
00261 {
00262
00263
00264 int ofs[3];
00265 arrayRegion.GetLoCorner(ofs);
00266 ofs[0]=-ofs[0];
00267 ofs[1]=-ofs[1];
00268 ofs[2]=-ofs[2];
00269 vtkAMRBox arrayDims(arrayRegion);
00270 arrayDims.Shift(ofs);
00271 vtkAMRBox destDims(destRegion);
00272 destDims.Shift(ofs);
00273
00274 if (!arrayRegion.Contains(destRegion))
00275 {
00276 vtkGenericWarningMacro(
00277 << "ERROR: Array must enclose the destination region. "
00278 << "Aborting the fill.");
00279 }
00280
00281 int destLo[3];
00282 destDims.GetLoCorner(destLo);
00283 int destHi[3];
00284 destDims.GetHiCorner(destHi);
00285
00286 int arrayHi[3];
00287 arrayDims.GetNumberOfCells(arrayHi);
00288
00289 for (int k=destLo[2]; k<=destHi[2]; ++k)
00290 {
00291 vtkIdType kOfs=k*arrayHi[0]*arrayHi[1];
00292 for (int j=destLo[1]; j<=destHi[1]; ++j)
00293 {
00294 vtkIdType idx=kOfs+j*arrayHi[0]+destLo[0];
00295 for (int i=destLo[0]; i<=destHi[0]; ++i)
00296 {
00297 pArray[idx]=fillValue;
00298 ++idx;
00299 }
00300 }
00301 }
00302 }
00304
00308 void Split(const int N[3], const int minSide[3], vtkstd::vector<vtkAMRBox> &decomp);
00309
00313 void Split(const int minSide[3], vtkstd::vector<vtkAMRBox> &decomp);
00314
00315 #endif