You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

142 lines
3.4 KiB
C++

/*=========================================================================
Program: Visualization Toolkit
Module: vtkHyperTreeGridScales.h
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.
=========================================================================*/
/**
* @class vtkHyperTreeGridScales
* @brief A specifalized type of vtkHyperTreeGrid for the case
* when root cells have uniform sizes in each direction *
*
* @sa
* vtkHyperTree vtkHyperTreeGrid vtkRectilinearGrid
*
* @par Thanks:
* This class was written by Jacques-Bernard Lekien (CEA)
* This work was supported by Commissariat a l'Energie Atomique
* CEA, DAM, DIF, F-91297 Arpajon, France.
*/
#ifndef vtkHyperTreeGridScales_h
#define vtkHyperTreeGridScales_h
#include <vector> // For std::vector
class vtkHyperTreeGridScales
{
public:
/**
* JB Construit cette classe a partir du scale de la maille
* d'origine d'un HyperTree et du subdivision factor
*/
vtkHyperTreeGridScales(double branchfactor, const double scale[3])
: BranchFactor(branchfactor)
, CurrentFailLevel(1)
, CellScales(scale, scale + 3)
{
}
~vtkHyperTreeGridScales() = default;
/**
* JB Retourne le scale des mailles du niveau demande
*/
double GetBranchFactor() const { return this->BranchFactor; }
/**
* JB Retourne le scale des mailles du niveau demande
*/
double* GetScale(unsigned int level) const
{
this->Update(level);
return this->CellScales.data() + 3 * level;
}
/**
* JB
*/
double GetScaleX(unsigned int level) const
{
this->Update(level);
return this->CellScales[3 * level + 0];
}
/**
* JB
*/
double GetScaleY(unsigned int level) const
{
this->Update(level);
return this->CellScales[3 * level + 1];
}
/**
* JB
*/
double GetScaleZ(unsigned int level) const
{
this->Update(level);
return this->CellScales[3 * level + 2];
}
/**
* JB Retourne le scale des mailles du niveau demande
*/
void GetScale(unsigned int level, double scale[3]) const
{
this->Update(level);
memcpy(scale, this->CellScales.data() + 3 * level, 3 * sizeof(double));
}
/**
* JB
*/
unsigned int GetCurrentFailLevel() const { return this->CurrentFailLevel; }
private:
/**
* JB Update the cell scales table afin de repondre que la
* table puisse retourner la taille de la maille pour ce niveau
* demande
*/
void Update(unsigned int level) const
{
if (level < this->CurrentFailLevel)
{
return;
}
this->CurrentFailLevel = level + 1;
this->CellScales.resize(3 * this->CurrentFailLevel);
auto current = this->CellScales.begin() + 3 * (this->CurrentFailLevel - 1);
auto previous = current - 3;
auto end = this->CellScales.end();
for (; current != end; ++current, ++previous)
{
*current = *previous / this->BranchFactor;
}
}
/**
* The subdivision factor in the grid refinement scheme
*/
const double BranchFactor;
/**
* The cache cell scales table
*/
mutable unsigned int CurrentFailLevel;
mutable std::vector<double> CellScales;
};
#endif
// VTK-HeaderTest-Exclude: vtkHyperTreeGridScales.h