[vtkusers] vtkPolyDataToImageStencil
Nil Goyette
nil.goyette at imeka.ca
Thu Apr 30 13:54:02 EDT 2015
Hi David,
Haha, wow, I was totally not understanding this method! It does make
sense now. Thank you :)
One last question, just to be sure, what does the y and z parameters
become? Here's the complete method, for clarity and for the next vtk users:
bool GetNext(int& x1, int& x2, int& y, int& z)
{
int maxX, maxY, maxZ, dump;
m_ImageStencilData->GetExtent(dump, maxX, dump, maxY, dump, maxZ);
bool gotExtent = false;
while (!gotExtent)
{
gotExtent = m_ImageStencilData->GetNextExtent(
x1, x2, 0, maxX, m_Y, m_Z, m_Iter) > 0;
if (!gotExtent) { m_Iter = 0; ++m_Y; }
if (m_Y > maxY) { m_Y = 0; ++m_Z; }
if (m_Z > maxZ) { m_Z = 0; return false; }
}
y = m_Y; z = m_Z;// *y and z ???*
return true;
}
Nil
Le 2015-04-30 12:55, David Gobbi a écrit :
> On Thu, Apr 30, 2015 at 9:53 AM, David Gobbi <david.gobbi at gmail.com
> <mailto:david.gobbi at gmail.com>> wrote:
>
> Hi Nil,
>
> I wrote a stencil iterator that provides the x, y, and z indices
> (not in VTK yet). It still requires an image to iterate over, but
> it might be worth a glance:
> https://github.com/dgobbi/AIRS/blob/master/ImageSegmentation/vtkImageRegionIterator.h
>
> In order for your GetNext() function to work as an iterator
> function, it should not have any loops, just conditionals:
>
> if ->GetNextExtent() returns zero, it should reset m_Iter to zero
> and increment m_Y
> if m_Y > maxY, it should reset m_Y to zero and increment m_Z
> if m_Z > maxZ, it should reset m_Z to zero and return false
>
>
> I realized that it isn't quite as simple as what I wrote. Everything
> has to be in a loop, because it has to keep trying until it gets a
> valid extent:
>
> bool gotExtent = false;
> while (!gotExtent)
> {
> gotExtent = m_ImageStencilData->GetNextExtent()
> if gotExtent is zero, it should reset m_Iter to zero and increment m_Y
> if m_Y > maxY, it should reset m_Y to zero and increment m_Z
> if m_Z > maxZ, it should reset m_Z to zero and return false
> }
>
> No guarantees, of course, since it's completely untested pseudocode.
>
> - David
>
>
> On Thu, Apr 30, 2015 at 8:54 AM, Nil Goyette <nil.goyette at imeka.ca
> <mailto:nil.goyette at imeka.ca>> wrote:
>
> Hi all,
>
> I'm using vtkPolyDataToImageStencil to get all voxels index
> inside of a surface. If I understand correctly, I have only
> two choices here:
> - vtkImageStencil to create a new image
> - vtkImageStencilIterator to iterate on the values (of another
> image)
> The problem is, I have a different goal in mind. I need the
> index of all voxels inside a surface.
>
> I read the vtkPolyDataToImageStencil code and tried to create
> my own "iterator" but there's probably something I don't
> understand; GetNextExtent always return 0.
> bool GetNext(int& x1, int& x2, int& y, int& z)
> {
> // m_Y, m_Z and m_Iter == 0
> int maxX, maxY, maxZ, dump;
> m_ImageStencilData->GetExtent(dump, maxX, dump, maxY, dump, maxZ);
> maxX *= 2; maxY *= 2; maxZ *= 2;
>
> for ( ; m_Z <= maxZ; ++m_Z)
> {
> for ( ; m_Y <= maxY; ++m_Y)
> {
> if (m_ImageStencilData->GetNextExtent(x1, x2, 0, maxX,
> m_Y, m_Z, m_Iter))
> {
> y = m_Y; z = m_Z;
> return true;
> }
> }
> }
> return false;
> }
>
> Is there a way to access all inside-voxels hidden in the
> vtkPolyDataToImageStencil? By index or by index range, it's
> not important. I just want to know to access them without
> useless work (like creating an image) because it's gonna be
> called often; it needs to be fast. Thank you for your time.
>
> Nil
>
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://public.kitware.com/pipermail/vtkusers/attachments/20150430/2d0107e2/attachment.html>
More information about the vtkusers
mailing list