00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00023 #ifndef __vtkAMRBox_h
00024 #define __vtkAMRBox_h
00025
00026 #include "vtkObject.h"
00027
00028 #include <assert.h>
00029
00030 template<int dimension>
00031 struct vtkAMRBoxInitializeHelp;
00032
00033
00034 template<int dimension>
00035 void vtkAMRBoxInitialize(int *LoCorner, int *HiCorner,
00036 const int *loCorner, const int *hiCorner,
00037 vtkAMRBoxInitializeHelp<dimension>* = 0)
00038 {
00039 for(int i=0; i<dimension; ++i)
00040 {
00041 LoCorner[i] = loCorner[i];
00042 HiCorner[i] = hiCorner[i];
00043 }
00044 for(int i=dimension; i<(3-dimension); ++i)
00045 {
00046 LoCorner[i] = 0;
00047 HiCorner[i] = 0;
00048 }
00049 }
00050
00051 class VTK_FILTERING_EXPORT vtkAMRBox
00052 {
00053 public:
00054
00055
00057
00062 int LoCorner[3];
00063 int HiCorner[3];
00065
00067
00068 vtkAMRBox()
00069 {
00070 vtkAMRBoxInitialize<0>(this->LoCorner, this->HiCorner, 0, 0);
00071 }
00073
00075
00076 vtkAMRBox(int dimensionality, const int* loCorner, const int* hiCorner)
00077 {
00078 switch(dimensionality)
00079 {
00080 case 2:
00081 vtkAMRBoxInitialize<2>(this->LoCorner, this->HiCorner,
00082 loCorner, hiCorner);
00083 break;
00084 case 3:
00085 vtkAMRBoxInitialize<3>(this->LoCorner, this->HiCorner,
00086 loCorner, hiCorner);
00087 break;
00088 default:
00089 vtkGenericWarningMacro( "Wrong dimensionality" );
00090 }
00091 }
00093
00095
00097 vtkIdType GetNumberOfCells()
00098 {
00099 vtkIdType numCells=1;
00100 for(int i=0; i<3; i++)
00101 {
00102 numCells *= HiCorner[i] - LoCorner[i] + 1;
00103 }
00104 return numCells;
00105 }
00107
00109
00111 void Coarsen(int refinement)
00112 {
00113 assert("pre: valid_refinement" && refinement>=2);
00115
00116 for (int i=0; i<3; i++)
00117 {
00118 this->LoCorner[i] =
00119 ( this->LoCorner[i] < 0 ?
00120 -abs(this->LoCorner[i]+1)/refinement - 1 :
00121 this->LoCorner[i]/refinement );
00122 this->HiCorner[i] =
00123 ( this->HiCorner[i] < 0 ?
00124 -abs(this->HiCorner[i]+1)/refinement - 1 :
00125 this->HiCorner[i]/refinement );
00126 }
00127 }
00128
00130
00132 void Refine(int refinement)
00133 {
00134 assert("pre: valid_refinement" && refinement>=2);
00136
00137 for (int i=0; i<3; i++)
00138 {
00139 this->LoCorner[i] = this->LoCorner[i]*refinement;
00140 this->HiCorner[i] = (this->HiCorner[i]+1)*refinement-1;
00141 }
00142 }
00143
00145
00146 int DoesContainCell(int i, int j, int k)
00147 {
00148 return
00149 i >= this->LoCorner[0] && i <= this->HiCorner[0] &&
00150 j >= this->LoCorner[1] && j <= this->HiCorner[1] &&
00151 k >= this->LoCorner[2] && k <= this->HiCorner[2];
00152 }
00154
00156
00157 int DoesContainBox(vtkAMRBox const & box) const
00158 {
00159
00160 return box.LoCorner[0] >= this->LoCorner[0]
00161 && box.LoCorner[1] >= this->LoCorner[1]
00162 && box.LoCorner[2] >= this->LoCorner[2]
00163 && box.HiCorner[0] <= this->HiCorner[0]
00164 && box.HiCorner[1] <= this->HiCorner[1]
00165 && box.HiCorner[2] <= this->HiCorner[2];
00166 }
00168
00170
00171 void Print(ostream &os)
00172 {
00173 os << "LoCorner: " << this->LoCorner[0] << "," << this->LoCorner[1]
00174 << "," << this->LoCorner[2] << "\n";
00175 os << "HiCorner: " << this->HiCorner[0] << "," << this->HiCorner[1]
00176 << "," << this->HiCorner[2] << "\n";
00177 }
00179
00181
00182 bool IsHiCorner(const int pos[3]) const
00183 {
00184 return this->HiCorner[0] == pos[0]
00185 && this->HiCorner[1] == pos[1]
00186 && this->HiCorner[2] == pos[2];
00187 }
00189
00191
00192 bool IsLoCorner(const int pos[3]) const
00193 {
00194 return this->LoCorner[0] == pos[0]
00195 && this->LoCorner[1] == pos[1]
00196 && this->LoCorner[2] == pos[2];
00197 }
00199 };
00200
00201 #endif