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.
149 lines
4.3 KiB
C
149 lines
4.3 KiB
C
3 weeks ago
|
/*=========================================================================
|
||
|
|
||
|
Program: Visualization Toolkit
|
||
|
Module: vtkImagePointIterator.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 vtkImagePointIterator
|
||
|
* @brief iterate over all data points in an image.
|
||
|
*
|
||
|
* This class will iterate over an image. For each position, it provides
|
||
|
* the (x,y,z) position, the (I,J,K) index, and the point Id. If a stencil
|
||
|
* is provided, then it also reports, for each point, whether the point is
|
||
|
* inside the stencil.
|
||
|
* <p>The iterator can go through the image point-by-point or span-by-span.
|
||
|
* The Next() method advances to the next point, while the NextSpan() method
|
||
|
* skips to the beginning of the next span, where a span is defined as a
|
||
|
* start position and point count within an image row.
|
||
|
* @sa
|
||
|
* vtkImageData vtkImageStencilData vtkImageProgressIterator
|
||
|
*/
|
||
|
|
||
|
#ifndef vtkImagePointIterator_h
|
||
|
#define vtkImagePointIterator_h
|
||
|
|
||
|
#include "vtkImagePointDataIterator.h"
|
||
|
|
||
|
class VTKIMAGINGCORE_EXPORT vtkImagePointIterator : public vtkImagePointDataIterator
|
||
|
{
|
||
|
public:
|
||
|
/**
|
||
|
* Default constructor, its use must be followed by Initialize().
|
||
|
*/
|
||
|
vtkImagePointIterator();
|
||
|
|
||
|
/**
|
||
|
* 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, then progress events will
|
||
|
* provided by the algorithm if threadId is zero.
|
||
|
*/
|
||
|
vtkImagePointIterator(vtkImageData* image, const int extent[6] = nullptr,
|
||
|
vtkImageStencilData* stencil = nullptr, vtkAlgorithm* algorithm = nullptr, int threadId = 0);
|
||
|
|
||
|
/**
|
||
|
* Initialize an iterator. See constructor for more details.
|
||
|
*/
|
||
|
void Initialize(vtkImageData* image, const int extent[6] = nullptr,
|
||
|
vtkImageStencilData* stencil = nullptr, vtkAlgorithm* algorithm = nullptr, 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()
|
||
|
{
|
||
|
this->vtkImagePointDataIterator::NextSpan();
|
||
|
this->UpdatePosition();
|
||
|
}
|
||
|
//@}
|
||
|
|
||
|
//@{
|
||
|
/**
|
||
|
* Move to the next position (rather than directly to the next span).
|
||
|
* This will automatically advance to the next span if the end of the
|
||
|
* current span is reached.
|
||
|
*/
|
||
|
void Next()
|
||
|
{
|
||
|
if (++(this->Id) == this->SpanEnd)
|
||
|
{
|
||
|
this->NextSpan();
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
this->Index[0]++;
|
||
|
this->Position[0] = this->Origin[0] + this->Index[0] * this->Spacing[0];
|
||
|
}
|
||
|
}
|
||
|
//@}
|
||
|
|
||
|
/**
|
||
|
* Test if the iterator has completed iterating over the entire extent.
|
||
|
*/
|
||
|
bool IsAtEnd() { return this->vtkImagePointDataIterator::IsAtEnd(); }
|
||
|
|
||
|
/**
|
||
|
* Get the current position.
|
||
|
*/
|
||
|
double* GetPosition() VTK_SIZEHINT(3) { return this->Position; }
|
||
|
|
||
|
//@{
|
||
|
/**
|
||
|
* Get the current position and place it in the provided array.
|
||
|
*/
|
||
|
void GetPosition(double x[3])
|
||
|
{
|
||
|
x[0] = this->Position[0];
|
||
|
x[1] = this->Position[1];
|
||
|
x[2] = this->Position[2];
|
||
|
}
|
||
|
//@}
|
||
|
|
||
|
//@{
|
||
|
/**
|
||
|
* Get the current position and place it in the provided array.
|
||
|
*/
|
||
|
void GetPosition(float x[3])
|
||
|
{
|
||
|
x[0] = this->Position[0];
|
||
|
x[1] = this->Position[1];
|
||
|
x[2] = this->Position[2];
|
||
|
}
|
||
|
//@}
|
||
|
|
||
|
protected:
|
||
|
//@{
|
||
|
/**
|
||
|
* Helper method to update the position coordinate from the index.
|
||
|
*/
|
||
|
void UpdatePosition()
|
||
|
{
|
||
|
this->Position[0] = this->Origin[0] + this->Index[0] * this->Spacing[0];
|
||
|
this->Position[1] = this->Origin[1] + this->Index[1] * this->Spacing[1];
|
||
|
this->Position[2] = this->Origin[2] + this->Index[2] * this->Spacing[2];
|
||
|
}
|
||
|
//@}
|
||
|
|
||
|
double Origin[3];
|
||
|
double Spacing[3];
|
||
|
double Position[3];
|
||
|
};
|
||
|
|
||
|
#endif
|
||
|
// VTK-HeaderTest-Exclude: vtkImagePointIterator.h
|