<div class="gmail_quote">On Fri, Feb 12, 2010 at 4:29 AM, Lucian Goron <span dir="ltr">&lt;<a href="mailto:luciangoron@gmail.com">luciangoron@gmail.com</a>&gt;</span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex;">
Hello, <br><br>I have a code that was suppose to create a set of points, to render them and then compute the elevation-colored points as in the following example <a href="http://www.vtk.org/Wiki/VTK/Examples/Elevation_Filter" target="_blank">http://www.vtk.org/Wiki/VTK/Examples/Elevation_Filter</a>.<br>

Unfortunately, I get a seg fault. I am relatively new to VTK and I am sure that I miss something related to pointers and dynamic allocation...<br><br>my code is:<br><br>#include &lt;vtkPoints.h&gt;<br>#include &lt;vtkCellArray.h&gt;<br>

#include &lt;vtkPointData.h&gt;<br>#include &lt;vtkPolyData.h&gt;<br>#include &lt;vtkPolyDataMapper.h&gt;<br>#include &lt;vtkActor.h&gt;<br>#include &lt;vtkRenderWindow.h&gt;<br>#include &lt;vtkRenderer.h&gt;<br>#include &lt;vtkRenderWindowInteractor.h&gt;<br>

#include &lt;vtkProperty.h&gt;<br>#include &lt;vtkMath.h&gt;<br>#include &lt;vtkDelaunay2D.h&gt;<br>#include &lt;vtkXMLPolyDataWriter.h&gt;<br>#include &lt;vtkLookupTable.h&gt;<br>#include &lt;vtkFloatArray.h&gt;<br>#include &lt;vtkElevationFilter.h&gt;<br>

<br>using namespace std;<br><br>int main(int argc, char *argv[])<br>{<br>  //Create the geometry of a point (the coordinate)<br>  vtkPoints *points = vtkPoints::New();<br>  <br>  //Create the topology of the point (a vertex)<br>

  vtkCellArray *vertices = vtkCellArray::New();<br>  <br>  int i = 0;<br>  int gridSize = 10;<br>  vtkIdType point_id[111];<br>  <br>  for(int x = 0; x &lt; gridSize; x++)<br>  {<br>    for(int y = 0; y &lt; gridSize; y++)<br>

    {<br>      i++;<br>      point_id[i] = points-&gt;InsertNextPoint(x, y, vtkMath::Random(-0.5, 0.5));<br>      vertices-&gt;InsertNextCell ( i, point_id );<br>    }<br>  }<br>  <br>  //Create a polydata object<br>  vtkPolyData *p = vtkPolyData::New();<br>

  p-&gt;SetPoints ( points );<br>  p-&gt;SetVerts ( vertices );<br> <br>  //Create an actor and mapper<br>  vtkPolyDataMapper *mapper = vtkPolyDataMapper::New();<br>  mapper-&gt;SetInput(p);<br> <br>  vtkActor *actor = vtkActor::New();<br>

  actor-&gt;SetMapper(mapper);<br>  actor-&gt;GetProperty()-&gt;SetPointSize(3);<br>  <br>   //Create a renderer, render window, and interactor<br>  vtkRenderer *renderer = vtkRenderer::New();<br>  vtkRenderWindow *renderWindow = vtkRenderWindow::New();<br>

  renderWindow-&gt;AddRenderer(renderer);<br>  vtkRenderWindowInteractor *renderWindowInteractor = vtkRenderWindowInteractor::New();<br>  renderWindowInteractor-&gt;SetRenderWindow(renderWindow);<br> <br>  //Add the actors to the scene<br>

  renderer-&gt;AddActor(actor);<br> <br>  //Render and interact<br>  renderWindow-&gt;Render();<br>  renderWindowInteractor-&gt;Start();<br> <br>  /// /// /// /// /// /// <br>  <br>  //triangulate the grid points<br>  vtkDelaunay2D *delaunay = vtkDelaunay2D::New();<br>

  delaunay-&gt;SetInput(p);<br>  delaunay-&gt;Update();<br>  <br>  vtkElevationFilter *elevationFilter = vtkElevationFilter::New();<br>  elevationFilter-&gt;SetInput(p);<br>  //you could set these z values to the min and max z values of your data to have a more sensibly scaled output<br>

  elevationFilter-&gt;SetLowPoint(0.0, 0.0, -1.0);<br>  elevationFilter-&gt;SetHighPoint(0.0, 0.0, 1.0);<br>  elevationFilter-&gt;Update();<br>  <br>  vtkPolyData* outputPolyData = vtkPolyData::SafeDownCast(elevationFilter-&gt;GetOutput());<br>

 <br>  vtkFloatArray *elevation = vtkFloatArray::SafeDownCast(outputPolyData-&gt;GetPointData()-&gt;GetArray(&quot;Elevation&quot;));<br> <br>  //create the color map<br>  vtkLookupTable *colorLookupTable = vtkLookupTable::New();<br>

  colorLookupTable-&gt;SetTableRange(0, 1);<br>  colorLookupTable-&gt;Build();<br> <br>  //generate the colors for each point based on the color map<br>  vtkUnsignedCharArray *colors = vtkUnsignedCharArray::New();<br>  colors-&gt;SetNumberOfComponents ( 3 );<br>

  colors-&gt;SetName ( &quot;Colors&quot; );<br>  <br>  cout &lt;&lt; &quot;There are &quot; &lt;&lt; outputPolyData-&gt;GetNumberOfPoints() &lt;&lt; &quot; points.&quot; &lt;&lt; vtkstd::endl;<br> <br>  for(int i = 0; i &lt; outputPolyData-&gt;GetNumberOfPoints(); i++)<br>

  {<br>    double val = elevation-&gt;GetValue(i);<br>    cout &lt;&lt; &quot;val: &quot; &lt;&lt; val &lt;&lt; vtkstd::endl;<br> <br>    double dcolor[3];<br>    colorLookupTable-&gt;GetColor(val, dcolor);<br>    cout &lt;&lt; &quot;dcolor: &quot; &lt;&lt; dcolor[0] &lt;&lt; &quot; &quot; &lt;&lt; dcolor[1] &lt;&lt; &quot; &quot; &lt;&lt; dcolor[2] &lt;&lt; vtkstd::endl;<br>

    unsigned char color[3];<br>    for(unsigned int j = 0; j &lt; 3; j++)<br>    {<br>      color[j] = 255 * dcolor[j]/1.0;<br>    }<br>    cout &lt;&lt; &quot;color: &quot; &lt;&lt; (int)color[0] &lt;&lt; &quot; &quot; &lt;&lt; (int)color[1] &lt;&lt; &quot; &quot; &lt;&lt; (int)color[2] &lt;&lt; vtkstd::endl;  <br>

 <br>    colors-&gt;InsertNextTupleValue(color);<br>  }<br> <br>  outputPolyData-&gt;GetPointData()-&gt;AddArray(colors);<br> <br>  //write the output file<br>  vtkXMLPolyDataWriter *writer = vtkXMLPolyDataWriter::New();<br>

  string outputFile = &quot;ef.vtp&quot;;<br>  writer-&gt;SetFileName(outputFile.c_str());<br>  writer-&gt;SetInput(outputPolyData);<br>  writer-&gt;Write();    <br>  <br>  return 0;<br>}<br><br>my gdbrun is:<br><br>#0  0xb7dca274 in vtkDataArrayTemplate&lt;float&gt;::GetTuple () from /usr/local/lib/vtk-5.3/libvtkCommon.so.5.3<br>

#1  0xb7d6cc5a in vtkPoints::GetPoint () from /usr/local/lib/vtk-5.3/libvtkCommon.so.5.3<br>#2  0xb56b260a in vtkPolyData::ComputeBounds () from /usr/local/lib/vtk-5.3/libvtkFiltering.so.5.3<br>#3  0xb55d356e in vtkDataSet::GetBounds () from /usr/local/lib/vtk-5.3/libvtkFiltering.so.5.3<br>

#4  0xb7a448ab in vtkPainterPolyDataMapper::GetBounds () from /usr/local/lib/vtk-5.3/libvtkRendering.so.5.3<br>#5  0xb79921f3 in vtkActor::GetBounds () from /usr/local/lib/vtk-5.3/libvtkRendering.so.5.3<br>#6  0xb7a7413f in vtkRenderer::ComputeVisiblePropBounds () from /usr/local/lib/vtk-5.3/libvtkRendering.so.5.3<br>

#7  0xb7a773dc in vtkRenderer::ResetCamera () from /usr/local/lib/vtk-5.3/libvtkRendering.so.5.3<br>#8  0xb7a87f9e in vtkRenderWindow::DoStereoRender () from /usr/local/lib/vtk-5.3/libvtkRendering.so.5.3<br>#9  0xb7a88505 in vtkRenderWindow::DoFDRender () from /usr/local/lib/vtk-5.3/libvtkRendering.so.5.3<br>

#10 0xb7a88aea in vtkRenderWindow::DoAARender () from /usr/local/lib/vtk-5.3/libvtkRendering.so.5.3<br>#11 0xb7a891fb in vtkRenderWindow::Render () from /usr/local/lib/vtk-5.3/libvtkRendering.so.5.3<br>#12 0xb7b4d02a in vtkXOpenGLRenderWindow::Render () from /usr/local/lib/vtk-5.3/libvtkRendering.so.5.3<br>

#13 0x0806cb75 in main ()<br><br>Can somebody help me ?<br>Thanks.<br><br></blockquote><div class="gmail_quote"><br></div>Hi there.<br><br></div><div class="gmail_quote">First thing, you should definitely use smart pointers: <a href="http://www.vtk.org/Wiki/VTK/Tutorials/SmartPointers">http://www.vtk.org/Wiki/VTK/Tutorials/SmartPointers</a></div>
<div class="gmail_quote"><br></div><div class="gmail_quote">The major thing that looked wrong was how you were adding the vertices. You can either do this:</div><div class="gmail_quote"><a href="http://www.vtk.org/Wiki/VTK/Examples/Triangle_GeometryVertices">http://www.vtk.org/Wiki/VTK/Examples/Triangle_GeometryVertices</a></div>
<div class="gmail_quote">or my preferred method lately:</div><div class="gmail_quote"><a href="http://www.vtk.org/Wiki/VTK/Examples/vtkVertexGlyphFilter">http://www.vtk.org/Wiki/VTK/Examples/vtkVertexGlyphFilter</a></div>
<div class="gmail_quote"><br></div><div class="gmail_quote">Another thing, you were setting the input of the elevation filter to &#39;p&#39;, I believe you wanted it set to the output of the Delaunay filter.</div><div class="gmail_quote">
<br></div><div class="gmail_quote">You were using AddArray when I believe you need to use SetScalars to actually get the colors displayed.</div><div class="gmail_quote"><br></div><div class="gmail_quote">You were visualizing &#39;p&#39; when I believe you wanted to visualize &#39;outputPolyData&#39;</div>
<div class="gmail_quote"><br></div><div class="gmail_quote">It actually isn&#39;t displaying anything at this point (I&#39;m not sure what&#39;s wrong at a quick glance), but hopefully this will get you headed in the right direction:</div>
<div class="gmail_quote"><br></div><div class="gmail_quote"><div class="gmail_quote">#include &lt;vtkSmartPointer.h&gt;</div><div class="gmail_quote">#include &lt;vtkCellData.h&gt;</div><div class="gmail_quote">#include &lt;vtkPoints.h&gt;</div>
<div class="gmail_quote">#include &lt;vtkCellArray.h&gt;</div><div class="gmail_quote">#include &lt;vtkPointData.h&gt;</div><div class="gmail_quote">#include &lt;vtkPolyData.h&gt;</div><div class="gmail_quote">#include &lt;vtkPolyDataMapper.h&gt;</div>
<div class="gmail_quote">#include &lt;vtkActor.h&gt;</div><div class="gmail_quote">#include &lt;vtkRenderWindow.h&gt;</div><div class="gmail_quote">#include &lt;vtkRenderer.h&gt;</div><div class="gmail_quote">#include &lt;vtkRenderWindowInteractor.h&gt;</div>
<div class="gmail_quote">#include &lt;vtkProperty.h&gt;</div><div class="gmail_quote">#include &lt;vtkMath.h&gt;</div><div class="gmail_quote">#include &lt;vtkDelaunay2D.h&gt;</div><div class="gmail_quote">#include &lt;vtkXMLPolyDataWriter.h&gt;</div>
<div class="gmail_quote">#include &lt;vtkLookupTable.h&gt;</div><div class="gmail_quote">#include &lt;vtkFloatArray.h&gt;</div><div class="gmail_quote">#include &lt;vtkElevationFilter.h&gt;</div><div class="gmail_quote">#include &lt;vtkVertexGlyphFilter.h&gt;</div>
<div class="gmail_quote"><br></div><div class="gmail_quote">int main(int argc, char *argv[])</div><div class="gmail_quote">{</div><div class="gmail_quote">  //Create the geometry of a point (the coordinate)</div><div class="gmail_quote">
  vtkSmartPointer&lt;vtkPoints&gt; points = </div><div class="gmail_quote">      vtkSmartPointer&lt;vtkPoints&gt;::New();</div><div class="gmail_quote">  </div><div class="gmail_quote">  //Create the topology of the point (a vertex)</div>
<div class="gmail_quote">  vtkSmartPointer&lt;vtkCellArray&gt; vertices = </div><div class="gmail_quote">      vtkSmartPointer&lt;vtkCellArray&gt;::New();</div><div class="gmail_quote">  </div><div class="gmail_quote">  int i = 0;</div>
<div class="gmail_quote">  int gridSize = 10;</div><div class="gmail_quote">  vtkIdType point_id[111];</div><div class="gmail_quote">  </div><div class="gmail_quote">  for(int x = 0; x &lt; gridSize; x++)</div><div class="gmail_quote">
  {</div><div class="gmail_quote">    for(int y = 0; y &lt; gridSize; y++)</div><div class="gmail_quote">    {</div><div class="gmail_quote">      i++;</div><div class="gmail_quote">      point_id[i] = points-&gt;InsertNextPoint(x, y, vtkMath::Random(-0.5, 0.5));</div>
<div class="gmail_quote">      vertices-&gt;InsertNextCell ( i, point_id );</div><div class="gmail_quote">    }</div><div class="gmail_quote">  }</div><div class="gmail_quote">  </div><div class="gmail_quote">  //Create a polydata object</div>
<div class="gmail_quote">  vtkSmartPointer&lt;vtkPolyData&gt; pointsPolyData = </div><div class="gmail_quote">      vtkSmartPointer&lt;vtkPolyData&gt;::New();</div><div class="gmail_quote">  pointsPolyData-&gt;SetPoints ( points );</div>
<div class="gmail_quote">  </div><div class="gmail_quote">  vtkSmartPointer&lt;vtkVertexGlyphFilter&gt; vertexFilter = </div><div class="gmail_quote">      vtkSmartPointer&lt;vtkVertexGlyphFilter&gt;::New();</div><div class="gmail_quote">
  vertexFilter-&gt;SetInputConnection(pointsPolyData-&gt;GetProducerPort());</div><div class="gmail_quote">  vertexFilter-&gt;Update();</div><div class="gmail_quote">  </div><div class="gmail_quote">  vtkSmartPointer&lt;vtkPolyData&gt; p = vertexFilter-&gt;GetOutput();</div>
<div class="gmail_quote"> </div><div class="gmail_quote">  /*</div><div class="gmail_quote">  //Create an actor and mapper</div><div class="gmail_quote">  vtkSmartPointer&lt;vtkPolyDataMapper&gt; mapper = </div><div class="gmail_quote">
      vtkSmartPointer&lt;vtkPolyDataMapper&gt;::New();</div><div class="gmail_quote">  mapper-&gt;SetInput(p);</div><div class="gmail_quote"> </div><div class="gmail_quote">  vtkSmartPointer&lt;vtkActor&gt; actor = </div>
<div class="gmail_quote">      vtkSmartPointer&lt;vtkActor&gt;::New();</div><div class="gmail_quote">  actor-&gt;SetMapper(mapper);</div><div class="gmail_quote">  actor-&gt;GetProperty()-&gt;SetPointSize(3);</div><div class="gmail_quote">
  */</div><div class="gmail_quote">   //Create a renderer, render window, and interactor</div><div class="gmail_quote">  vtkSmartPointer&lt;vtkRenderer&gt; renderer = </div><div class="gmail_quote">      vtkSmartPointer&lt;vtkRenderer&gt;::New();</div>
<div class="gmail_quote">  vtkSmartPointer&lt;vtkRenderWindow&gt; renderWindow = </div><div class="gmail_quote">      vtkSmartPointer&lt;vtkRenderWindow&gt;::New();</div><div class="gmail_quote">  renderWindow-&gt;AddRenderer(renderer);</div>
<div class="gmail_quote">  vtkSmartPointer&lt;vtkRenderWindowInteractor&gt; renderWindowInteractor = </div><div class="gmail_quote">      vtkSmartPointer&lt;vtkRenderWindowInteractor&gt;::New();</div><div class="gmail_quote">
  renderWindowInteractor-&gt;SetRenderWindow(renderWindow);</div><div class="gmail_quote"> </div><div class="gmail_quote"> </div><div class="gmail_quote">  //Render and interact</div><div class="gmail_quote">  renderWindow-&gt;Render();</div>
<div class="gmail_quote">  renderWindowInteractor-&gt;Start();</div><div class="gmail_quote"> </div><div class="gmail_quote">  /// /// /// /// /// /// </div><div class="gmail_quote">  </div><div class="gmail_quote">  //triangulate the grid points</div>
<div class="gmail_quote">  vtkSmartPointer&lt;vtkDelaunay2D&gt; delaunay = </div><div class="gmail_quote">      vtkSmartPointer&lt;vtkDelaunay2D&gt;::New();</div><div class="gmail_quote">  delaunay-&gt;SetInput(p);</div><div class="gmail_quote">
  delaunay-&gt;Update();</div><div class="gmail_quote">  </div><div class="gmail_quote">  vtkSmartPointer&lt;vtkElevationFilter&gt; elevationFilter = </div><div class="gmail_quote">      vtkSmartPointer&lt;vtkElevationFilter&gt;::New();</div>
<div class="gmail_quote">  //elevationFilter-&gt;SetInput(p);</div><div class="gmail_quote">  elevationFilter-&gt;SetInputConnection(delaunay-&gt;GetOutputPort());</div><div class="gmail_quote">  //you could set these z values to the min and max z values of your data to have a more sensibly scaled output</div>
<div class="gmail_quote">  elevationFilter-&gt;SetLowPoint(0.0, 0.0, -1.0);</div><div class="gmail_quote">  elevationFilter-&gt;SetHighPoint(0.0, 0.0, 1.0);</div><div class="gmail_quote">  elevationFilter-&gt;Update();</div>
<div class="gmail_quote">  </div><div class="gmail_quote">  vtkPolyData* outputPolyData = vtkPolyData::SafeDownCast(elevationFilter-&gt;GetOutput());</div><div class="gmail_quote"> </div><div class="gmail_quote">  vtkFloatArray *elevation = vtkFloatArray::SafeDownCast(outputPolyData-&gt;GetPointData()-&gt;GetArray(&quot;Elevation&quot;));</div>
<div class="gmail_quote"> </div><div class="gmail_quote">  //create the color map</div><div class="gmail_quote">  vtkSmartPointer&lt;vtkLookupTable&gt; colorLookupTable = </div><div class="gmail_quote">      vtkSmartPointer&lt;vtkLookupTable&gt;::New();</div>
<div class="gmail_quote">  colorLookupTable-&gt;SetTableRange(0, 1);</div><div class="gmail_quote">  colorLookupTable-&gt;Build();</div><div class="gmail_quote"> </div><div class="gmail_quote">  //generate the colors for each point based on the color map</div>
<div class="gmail_quote">  vtkSmartPointer&lt;vtkUnsignedCharArray&gt; colors = </div><div class="gmail_quote">      vtkSmartPointer&lt;vtkUnsignedCharArray&gt;::New();</div><div class="gmail_quote">  colors-&gt;SetNumberOfComponents ( 3 );</div>
<div class="gmail_quote">  colors-&gt;SetName ( &quot;Colors&quot; );</div><div class="gmail_quote">  </div><div class="gmail_quote">  cout &lt;&lt; &quot;There are &quot; &lt;&lt; outputPolyData-&gt;GetNumberOfPoints() &lt;&lt; &quot; points.&quot; &lt;&lt; endl;</div>
<div class="gmail_quote">  cout &lt;&lt; &quot;There are &quot; &lt;&lt; outputPolyData-&gt;GetNumberOfCells() &lt;&lt; &quot; cells.&quot; &lt;&lt; endl;</div><div class="gmail_quote"> </div><div class="gmail_quote">  for(int i = 0; i &lt; outputPolyData-&gt;GetNumberOfCells(); i++)</div>
<div class="gmail_quote">  {</div><div class="gmail_quote">    double val = elevation-&gt;GetValue(i);</div><div class="gmail_quote">    cout &lt;&lt; &quot;val: &quot; &lt;&lt; val &lt;&lt; endl;</div><div class="gmail_quote">
 </div><div class="gmail_quote">    double dcolor[3];</div><div class="gmail_quote">    colorLookupTable-&gt;GetColor(val, dcolor);</div><div class="gmail_quote">    cout &lt;&lt; &quot;dcolor: &quot; &lt;&lt; dcolor[0] &lt;&lt; &quot; &quot; &lt;&lt; dcolor[1] &lt;&lt; &quot; &quot; &lt;&lt; dcolor[2] &lt;&lt; endl;</div>
<div class="gmail_quote">    unsigned char color[3];</div><div class="gmail_quote">    for(unsigned int j = 0; j &lt; 3; j++)</div><div class="gmail_quote">    {</div><div class="gmail_quote">      color[j] = 255 * dcolor[j]/1.0;</div>
<div class="gmail_quote">    }</div><div class="gmail_quote">    cout &lt;&lt; &quot;color: &quot; &lt;&lt; (int)color[0] &lt;&lt; &quot; &quot; &lt;&lt; (int)color[1] &lt;&lt; &quot; &quot; &lt;&lt; (int)color[2] &lt;&lt; endl;  </div>
<div class="gmail_quote"> </div><div class="gmail_quote">    colors-&gt;InsertNextTupleValue(color);</div><div class="gmail_quote">  }</div><div class="gmail_quote"> </div><div class="gmail_quote">  //outputPolyData-&gt;GetPointData()-&gt;AddArray(colors);</div>
<div class="gmail_quote">  outputPolyData-&gt;GetCellData()-&gt;SetScalars(colors);</div><div class="gmail_quote"> </div><div class="gmail_quote">    //Create an actor and mapper</div><div class="gmail_quote">  vtkSmartPointer&lt;vtkPolyDataMapper&gt; mapper = </div>
<div class="gmail_quote">      vtkSmartPointer&lt;vtkPolyDataMapper&gt;::New();</div><div class="gmail_quote">  mapper-&gt;SetInput(outputPolyData);</div><div class="gmail_quote"> </div><div class="gmail_quote">  vtkSmartPointer&lt;vtkActor&gt; actor = </div>
<div class="gmail_quote">      vtkSmartPointer&lt;vtkActor&gt;::New();</div><div class="gmail_quote">  actor-&gt;SetMapper(mapper);</div><div class="gmail_quote">  actor-&gt;GetProperty()-&gt;SetPointSize(3);</div><div class="gmail_quote">
  </div><div class="gmail_quote">    //Add the actors to the scene</div><div class="gmail_quote">  renderer-&gt;AddActor(actor);</div><div class="gmail_quote">  </div><div class="gmail_quote">  //write the output file</div>
<div class="gmail_quote">  vtkSmartPointer&lt;vtkXMLPolyDataWriter&gt; writer = </div><div class="gmail_quote">      vtkSmartPointer&lt;vtkXMLPolyDataWriter&gt;::New();</div><div class="gmail_quote">  writer-&gt;SetFileName(&quot;ef.vtp&quot;);</div>
<div class="gmail_quote">  writer-&gt;SetInput(outputPolyData);</div><div class="gmail_quote">  writer-&gt;Write();</div><div class="gmail_quote">  </div><div class="gmail_quote">  return EXIT_SUCCESS;</div><div class="gmail_quote">
}</div></div><div class="gmail_quote"><br clear="all">Thanks,<br><br><div>David </div></div>