1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111
|
/*=========================================================================
Program: Visualization Toolkit
Module: $RCSfile: vtkAMRBox.h,v $
Copyright (c) Ken Martin, Will Schroeder, Bill Lorensen
All rights reserved.
See Copyright.txt or http://www.kitware.com/Copyright.htm for details.
This software is distributed WITHOUT ANY WARRANTY; without even
the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
PURPOSE. See the above copyright notice for more information.
=========================================================================*/
// .NAME vtkAMRBox - represents a 3D uniform region in space
// .SECTION Description
// vtkAMRBox is similar to Chombo's Box. It represents a 3D
// region by storing indices for two corners (LoCorner, HiCorner).
// A few utility methods are provided.
#ifndef __vtkAMRBox_h
#define __vtkAMRBox_h
#include "vtkObject.h"
class VTK_FILTERING_EXPORT vtkAMRBox
{
public:
// public for quick access
int LoCorner[3];
int HiCorner[3];
vtkAMRBox()
{
for(int i=0; i<3; i++)
{
this->LoCorner[i] = this->HiCorner[i] = 0;
}
}
vtkAMRBox(int dimensionality, int* loCorner, int* hiCorner)
{
this->LoCorner[2] = this->HiCorner[2] = 0;
memcpy(this->LoCorner, loCorner, dimensionality*sizeof(int));
memcpy(this->HiCorner, hiCorner, dimensionality*sizeof(int));
}
// Description:
// Returns the number of cells (aka elements, zones etc.) in
// the given region (for the specified refinement, see Coarsen()
// and Refine() ).
vtkIdType GetNumberOfCells()
{
vtkIdType numCells=1;
for(int i=0; i<3; i++)
{
numCells *= HiCorner[i] - LoCorner[i] + 1;
}
return numCells;
}
// Description:
// Modify LoCorner and HiCorner by coarsening with the given
// refinement ratio.
void Coarsen(int refinement)
{
for (int i=0; i<3; i++)
{
this->LoCorner[i] =
( this->LoCorner[i] < 0 ?
-abs(this->LoCorner[i]+1)/refinement - 1 :
this->LoCorner[i]/refinement );
this->HiCorner[i] =
( this->HiCorner[i] < 0 ?
-abs(this->HiCorner[i]+1)/refinement - 1 :
this->HiCorner[i]/refinement );
}
}
// Description:
// Modify LoCorner and HiCorner by refining with the given
// refinement ratio.
void Refine(int refinement)
{
for (int i=0; i<3; i++)
{
this->LoCorner[i] = this->LoCorner[i]*refinement;
this->HiCorner[i] = this->HiCorner[i]*refinement;
}
}
// Description:
// Returns non-zero if the box contains the cell with
// given indices.
int DoesContainCell(int i, int j, int k)
{
return
i >= this->LoCorner[0] && i <= this->HiCorner[0] &&
j >= this->LoCorner[1] && j <= this->HiCorner[1] &&
k >= this->LoCorner[2] && k <= this->HiCorner[2];
}
};
#endif
|