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.
nmWTAI-Platform/3rd/VTK7.1/include/vtkImagePointDataIterator.h

203 lines
6.0 KiB
C++

/*=========================================================================
Program: Visualization Toolkit
Module: vtkImagePointDataIterator.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 vtkImagePointDataIterator
* @brief iterate over point data in an image.
*
* This class will iterate over an image. For each position, it will
* provide the (I,J,K) index, the point Id, and if a stencil is supplied,
* it will report whether the point is inside or outside of the stencil.
* <p>For efficiency, this class iterates over spans rather than points.
* Each span is one image row or partial row, defined by a start position
* and a size. Within a span, only the X index and the point Id will change.
* The vtkImagePointDataIterator and related iterators are the preferred
* method of iterating over image data within the VTK image filters.
* @sa
* vtkImageData vtkImageStencilData vtkImageProgressIterator
*/
#ifndef vtkImagePointDataIterator_h
#define vtkImagePointDataIterator_h
#include "vtkSystemIncludes.h"
#include "vtkImagingCoreModule.h" // for export macro
class vtkDataArray;
class vtkImageData;
class vtkImageStencilData;
class vtkAlgorithm;
class VTKIMAGINGCORE_EXPORT vtkImagePointDataIterator
{
public:
/**
* Default constructor, its use must be followed by Initialize().
*/
vtkImagePointDataIterator();
/**
* Create an iterator for the given image, with several options.
* If a stencil is provided, then the iterator's IsInStencil() method
* reports whether each span is inside the stencil. If an extent is
* provided, it iterates over the extent and ignores the rest of the
* image (the provided extent must be within the image extent). If
* a pointer to the algorithm is provided and threadId is set to zero,
* then progress events will provided for the algorithm.
*/
vtkImagePointDataIterator(vtkImageData *image,
const int extent[6] = 0,
vtkImageStencilData *stencil=0,
vtkAlgorithm *algorithm=0,
int threadId=0)
{
this->Initialize(image, extent, stencil, algorithm, threadId);
}
/**
* Initialize an iterator. See constructor for more details.
*/
void Initialize(vtkImageData *image, const int extent[6] = 0,
vtkImageStencilData *stencil=0,
vtkAlgorithm *algorithm=0, int threadId=0);
/**
* Move the iterator to the beginning of the next span.
* A span is a contiguous region of the image over which nothing but
* the point Id and the X index changes.
*/
void NextSpan();
/**
* Test if the iterator has completed iterating over the entire extent.
*/
bool IsAtEnd()
{
return (this->Id == this->End);
}
/**
* Check if the iterator is within the region specified by the stencil.
* This is updated when NextSpan() is called.
*/
bool IsInStencil()
{
return this->InStencil;
}
//@{
/**
* Get the index at the beginning of the current span.
*/
void GetIndex(int result[3])
{
result[0] = this->Index[0];
result[1] = this->Index[1];
result[2] = this->Index[2];
}
//@}
/**
* Get the index at the beginning of the current span.
*/
const int *GetIndex()
{
return this->Index;
}
/**
* Get the point Id at the beginning of the current span.
*/
vtkIdType GetId()
{
return this->Id;
}
/**
* Get the end of the span.
*/
vtkIdType SpanEndId()
{
return this->SpanEnd;
}
/**
* Get a void pointer and pixel increment for the given point Id.
* The pixel increment is the number of scalar components.
*/
static void *GetVoidPointer(vtkImageData *image,
vtkIdType i=0,
int *pixelIncrement=0);
/**
* Get a void pointer and pixel increment for the given point Id.
* The array must be the same size as the image. The pixel increment
* that is returned will be the number of components for the array.
*/
static void *GetVoidPointer(vtkDataArray *array,
vtkIdType i=0,
int *pixelIncrement=0);
protected:
/**
* Set all the state variables for the stencil span that includes idX.
*/
void SetSpanState(int idX);
/**
* Report the progress and do an abort check, for compatibility with
* existing image filters. If an algorithm was provided to the constructor,
* then this is called every time that one row of the image is completed.
*/
void ReportProgress();
vtkIdType Id; // the current point Id
vtkIdType SpanEnd; // end of current span
vtkIdType RowEnd; // end of current row
vtkIdType SliceEnd; // end of current slice
vtkIdType End; // end of data
// Increments
vtkIdType RowIncrement; // to same position in next row
vtkIdType SliceIncrement; // to same position in next slice
vtkIdType RowEndIncrement; // from end of row to start of next row
vtkIdType SliceEndIncrement; // from end of slice to start of next slice
// The extent, adjusted for the stencil
int Extent[6];
// Index-related items
int Index[3];
int StartY;
// Stencil-related items
bool HasStencil;
bool InStencil;
int SpanSliceEndIncrement;
int SpanSliceIncrement;
int SpanIndex;
int *SpanCountPointer;
int **SpanListPointer;
// Progress-related items
vtkAlgorithm *Algorithm;
vtkIdType Count;
vtkIdType Target;
int ThreadId;
};
#endif
// VTK-HeaderTest-Exclude: vtkImagePointDataIterator.h