Okay, I&#39;m in the home stretch here... I&#39;ve changed the code slightly to output a XMLImageData file and take an input surface.  CMake runs fine on it, but it dies in the make process with this error:<br><br>CMakeFiles/SurfaceToImage.dir/SurfaceToImage.cxx.o: In function `vtkSmartPointer&lt;vtkPolyDataToImageStencil&gt;::New()&#39;:<br>
/usr/local/include/vtk-5.7/vtkSmartPointer.h:113: undefined reference to `vtkPolyDataToImageStencil::New()&#39;<br><br>The smart pointer line is fundamentally no different than any other line of code.  ???  Here&#39;s my code:<br>
____________________________________________________________________________________________________________________<br>#include &lt;vtkSmartPointer.h&gt;<br>#include &lt;vtkPolyData.h&gt;<br>#include &lt;vtkImageData.h&gt;<br>
#include &lt;vtkPolyDataReader.h&gt;<br>#include &lt;vtkXMLImageDataWriter.h&gt;<br>#include &lt;vtkPolyDataToImageStencil.h&gt;<br>#include &lt;vtkImageStencil.h&gt;<br>#include &lt;vtkPointData.h&gt;<br> <br>/**<br> * This program generates a sphere (closed surface, vtkPolyData) and converts it into volume<br>
 * representation (vtkImageData) where the foreground voxels are 1 and the background voxels are<br> * 0. Internally vtkPolyDataToImageStencil is utilized. The resultant image is saved to disk <br> * in XML image data format.<br>
 */<br>int main (int argc, char *argv[])<br>{ <br>  if( argc &lt; 3 )<br>  {<br>    std::cerr &lt;&lt; &quot;Usage: &quot; &lt;&lt; argv[0];<br>    std::cerr &lt;&lt; &quot; inputImageFile outputImageFile &quot; &lt;&lt; std::endl;  <br>
    return EXIT_FAILURE;<br>  }<br><br>  vtkSmartPointer&lt;vtkPolyDataReader&gt; surfaceSource = vtkSmartPointer&lt;vtkPolyDataReader&gt;::New();<br>  surfaceSource-&gt;SetFileName( argv[1] );<br>  vtkSmartPointer&lt;vtkPolyData&gt; pd = surfaceSource-&gt;GetOutput();<br>
  surfaceSource-&gt;Update();<br> <br>  vtkSmartPointer&lt;vtkImageData&gt; whiteImage = vtkSmartPointer&lt;vtkImageData&gt;::New();    <br>  double bounds[6];<br>  pd-&gt;GetBounds(bounds);<br>  double spacing[3]; // desired volume spacing<br>
  spacing[0] = 0.5;<br>  spacing[1] = 0.5;<br>  spacing[2] = 0.5;<br>  whiteImage-&gt;SetSpacing(spacing);<br> <br>  // compute dimensions<br>  int dim[3];<br>  for (int i = 0; i &lt; 3; i++)<br>  {<br>    dim[i] = static_cast&lt;int&gt;(ceil((bounds[i * 2 + 1] - bounds[i * 2]) / spacing[i]));<br>
  }<br>  whiteImage-&gt;SetDimensions(dim);<br>  whiteImage-&gt;SetExtent(0, dim[0] - 1, 0, dim[1] - 1, 0, dim[2] - 1);<br> <br>  double origin[3];<br>  // NOTE: I am not sure whether or not we had to add some offset!<br>
  origin[0] = bounds[0];// + spacing[0] / 2;<br>  origin[1] = bounds[2];// + spacing[1] / 2;<br>  origin[2] = bounds[4];// + spacing[2] / 2;<br>  whiteImage-&gt;SetOrigin(origin);<br> <br>  whiteImage-&gt;SetScalarTypeToUnsignedChar();<br>
  whiteImage-&gt;AllocateScalars();<br> <br>  // fill the image with foreground voxels:<br>  unsigned char inval = 255;<br>  unsigned char outval = 0;<br>  vtkIdType count = whiteImage-&gt;GetNumberOfPoints();<br>  for (vtkIdType i = 0; i &lt; count; ++i)<br>
  {<br>    whiteImage-&gt;GetPointData()-&gt;GetScalars()-&gt;SetTuple1(i, inval);<br>  }<br> <br>  // polygonal data --&gt; image stencil:<br>  vtkSmartPointer&lt;vtkPolyDataToImageStencil&gt; pol2stenc = vtkSmartPointer&lt;vtkPolyDataToImageStencil&gt;::New(); //&lt;---- This is the &#39;problem&#39;???<br>
  pol2stenc-&gt;SetInput(pd);<br>  pol2stenc-&gt;SetOutputOrigin(origin);<br>  pol2stenc-&gt;SetOutputSpacing(spacing);<br>  pol2stenc-&gt;SetOutputWholeExtent(whiteImage-&gt;GetExtent());<br>  pol2stenc-&gt;Update();<br>
 <br>  // cut the corresponding white image and set the background:<br>  vtkSmartPointer&lt;vtkImageStencil&gt; imgstenc = vtkSmartPointer&lt;vtkImageStencil&gt;::New();<br>  imgstenc-&gt;SetInput(whiteImage);<br>  imgstenc-&gt;SetStencil(pol2stenc-&gt;GetOutput());<br>
  imgstenc-&gt;ReverseStencilOff();<br>  imgstenc-&gt;SetBackgroundValue(outval);<br>  imgstenc-&gt;Update();<br> <br>  vtkSmartPointer&lt;vtkXMLImageDataWriter&gt; writer = vtkSmartPointer&lt;vtkXMLImageDataWriter&gt;::New();<br>
  writer-&gt;SetFileName( argv[2] ); //&quot;SphereVolume.mhd&quot;);<br>  writer-&gt;SetInput(imgstenc-&gt;GetOutput());<br>  writer-&gt;Write();  <br> <br>  return EXIT_SUCCESS;<br>}<br>____________________________________________________________________________________________________________________<br>
<br><br><br><div class="gmail_quote">On Tue, Apr 20, 2010 at 6:37 AM, David Doria <span dir="ltr">&lt;<a href="mailto:daviddoria%2Bvtk@gmail.com">daviddoria+vtk@gmail.com</a>&gt;</span> wrote:<br><blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;">
<div class="gmail_quote"><div class="im">On Tue, Apr 20, 2010 at 3:34 AM, Lars Friedrich Lars <span dir="ltr">&lt;<a href="mailto:lars-friedrich@gmx.net" target="_blank">lars-friedrich@gmx.net</a>&gt;</span> wrote:<br><blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;">

Hello David Welch,<br>
<br>
referring to your original question &quot;how to voxelize a simple surface&quot; I added a VTK wiki example:<br>
<br>
<a href="http://www.cmake.org/Wiki/VTK/Examples/PolyDataToImageData" target="_blank">http://www.cmake.org/Wiki/VTK/Examples/PolyDataToImageData</a><br>
<br>
It shows how we could incorporate vtkPolyDataToImageStencil into voxelizing a *closed* surface.<br>
<br>
Please NOTE: as I wrote on the example page I&#39;m not sure about the image origin. The visual agreement in the sphere-image-overlay (paraview) is not perfect and I&#39;m not sure whether or not we had to introduce some spacing-dependent image origin offset to compensate that. If you use that code and find out something in this direction it would be great if you contributed it to that example!<br>


<br>
HTH,<br>
<br>
lars<br><br></blockquote><div class="gmail_quote"><br></div></div>David W -</div><div class="gmail_quote"><br></div><div class="gmail_quote">Yes, the normals are definitely necessary. With a mesh, you can simply run vtkPolyDataNormals. With a point set, you&#39;d have to use my vtkPointSetNormalEstimation and vtkPointSetNormalOrientation filters (part of the same surface reconstruction journal submission). Unfortunately I don&#39;t know what it means by the missing ImageData element.</div>

<div class="gmail_quote"><br></div><div class="gmail_quote">Lars -</div><div class="gmail_quote"><br>Looks great, thanks! Hopefully David W will play around with it and solve the mystery of the origin problem.</div><div class="gmail_quote">

<br clear="all">Thanks,<br><font color="#888888"><br><div>David </div></font></div>
</blockquote></div><br><br clear="all"><br>-- <br>David Welch<br>Graduate Student<br>Dept. of Biomedical Engineering<br>University of Iowa<br>Lab: (319) 335-5279<br>