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.
181 lines
5.1 KiB
C++
181 lines
5.1 KiB
C++
/*=========================================================================
|
|
|
|
Program: Visualization Toolkit
|
|
Module: vtkStructuredExtent.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 vtkStructuredExtent
|
|
* @brief helper class to aid working with structured
|
|
* extents.
|
|
*
|
|
*
|
|
* vtkStructuredExtent is an helper class that helps in arithmetic with
|
|
* structured extents. It defines a bunch of static methods (most of which are
|
|
* inlined) to aid in dealing with extents.
|
|
*/
|
|
|
|
#ifndef vtkStructuredExtent_h
|
|
#define vtkStructuredExtent_h
|
|
|
|
#include "vtkCommonDataModelModule.h" // For export macro
|
|
#include "vtkObject.h"
|
|
|
|
class VTKCOMMONDATAMODEL_EXPORT vtkStructuredExtent : public vtkObject
|
|
{
|
|
public:
|
|
static vtkStructuredExtent* New();
|
|
vtkTypeMacro(vtkStructuredExtent, vtkObject);
|
|
void PrintSelf(ostream& os, vtkIndent indent) override;
|
|
|
|
/**
|
|
* Clamps \c ext to fit in \c wholeExt.
|
|
*/
|
|
static void Clamp(int ext[6], const int wholeExt[]);
|
|
|
|
/**
|
|
* Returns true if \c ext is fits within \c wholeExt with at least 1 dimension
|
|
* smaller than the \c wholeExt.
|
|
*/
|
|
static bool StrictlySmaller(const int ext[6], const int wholeExt[6]);
|
|
|
|
/**
|
|
* Returns if \c ext fits within \c wholeExt. Unlike StrictlySmaller, this
|
|
* method returns true even if \c ext == \c wholeExt.
|
|
*/
|
|
static bool Smaller(const int ext[6], const int wholeExt[6]);
|
|
|
|
/**
|
|
* Grows the \c ext on each side by the given \c count.
|
|
*/
|
|
static void Grow(int ext[6], int count);
|
|
|
|
/**
|
|
* Grows the \c ext on each side by the given \c count
|
|
* while keeping it limited to the \c wholeExt.
|
|
*/
|
|
static void Grow(int ext[6], int count, int wholeExt[6]);
|
|
|
|
/**
|
|
* Makes \c ext relative to \c wholeExt.
|
|
*/
|
|
static void Transform(int ext[6], int wholeExt[6]);
|
|
|
|
/**
|
|
* Given the extents, computes the dimensions.
|
|
*/
|
|
static void GetDimensions(const int ext[6], int dims[3]);
|
|
|
|
protected:
|
|
vtkStructuredExtent();
|
|
~vtkStructuredExtent() override;
|
|
|
|
private:
|
|
vtkStructuredExtent(const vtkStructuredExtent&) = delete;
|
|
void operator=(const vtkStructuredExtent&) = delete;
|
|
};
|
|
|
|
//----------------------------------------------------------------------------
|
|
inline void vtkStructuredExtent::Clamp(int ext[6], const int wholeExt[6])
|
|
{
|
|
ext[0] = (ext[0] < wholeExt[0]) ? wholeExt[0] : ext[0];
|
|
ext[1] = (ext[1] > wholeExt[1]) ? wholeExt[1] : ext[1];
|
|
|
|
ext[2] = (ext[2] < wholeExt[2]) ? wholeExt[2] : ext[2];
|
|
ext[3] = (ext[3] > wholeExt[3]) ? wholeExt[3] : ext[3];
|
|
|
|
ext[4] = (ext[4] < wholeExt[4]) ? wholeExt[4] : ext[4];
|
|
ext[5] = (ext[5] > wholeExt[5]) ? wholeExt[5] : ext[5];
|
|
}
|
|
|
|
//----------------------------------------------------------------------------
|
|
inline bool vtkStructuredExtent::Smaller(const int ext[6], const int wholeExt[6])
|
|
{
|
|
if (ext[0] < wholeExt[0] || ext[0] > wholeExt[0 + 1] || ext[0 + 1] < wholeExt[0] ||
|
|
ext[0 + 1] > wholeExt[0 + 1])
|
|
{
|
|
return false;
|
|
}
|
|
|
|
if (ext[2] < wholeExt[2] || ext[2] > wholeExt[2 + 1] || ext[2 + 1] < wholeExt[2] ||
|
|
ext[2 + 1] > wholeExt[2 + 1])
|
|
{
|
|
return false;
|
|
}
|
|
|
|
if (ext[4] < wholeExt[4] || ext[4] > wholeExt[4 + 1] || ext[4 + 1] < wholeExt[4] ||
|
|
ext[4 + 1] > wholeExt[4 + 1])
|
|
{
|
|
return false;
|
|
}
|
|
|
|
return true;
|
|
}
|
|
|
|
//----------------------------------------------------------------------------
|
|
inline bool vtkStructuredExtent::StrictlySmaller(const int ext[6], const int wholeExt[6])
|
|
{
|
|
if (!vtkStructuredExtent::Smaller(ext, wholeExt))
|
|
{
|
|
return false;
|
|
}
|
|
|
|
if (ext[0] > wholeExt[0] || ext[1] < wholeExt[1] || ext[2] > wholeExt[2] ||
|
|
ext[3] < wholeExt[3] || ext[4] > wholeExt[4] || ext[5] < wholeExt[5])
|
|
{
|
|
return true;
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
//----------------------------------------------------------------------------
|
|
inline void vtkStructuredExtent::Grow(int ext[6], int count)
|
|
{
|
|
ext[0] -= count;
|
|
ext[2] -= count;
|
|
ext[4] -= count;
|
|
|
|
ext[1] += count;
|
|
ext[3] += count;
|
|
ext[5] += count;
|
|
}
|
|
|
|
//----------------------------------------------------------------------------
|
|
inline void vtkStructuredExtent::Grow(int ext[6], int count, int wholeExt[6])
|
|
{
|
|
vtkStructuredExtent::Grow(ext, count);
|
|
vtkStructuredExtent::Clamp(ext, wholeExt);
|
|
}
|
|
|
|
//----------------------------------------------------------------------------
|
|
inline void vtkStructuredExtent::Transform(int ext[6], int wholeExt[6])
|
|
{
|
|
ext[0] -= wholeExt[0];
|
|
ext[1] -= wholeExt[0];
|
|
|
|
ext[2] -= wholeExt[2];
|
|
ext[3] -= wholeExt[2];
|
|
|
|
ext[4] -= wholeExt[4];
|
|
ext[5] -= wholeExt[4];
|
|
}
|
|
|
|
//----------------------------------------------------------------------------
|
|
inline void vtkStructuredExtent::GetDimensions(const int ext[6], int dims[3])
|
|
{
|
|
dims[0] = ext[1] - ext[0] + 1;
|
|
dims[1] = ext[3] - ext[2] + 1;
|
|
dims[2] = ext[5] - ext[4] + 1;
|
|
}
|
|
|
|
#endif
|