[vtkusers] Extract isosurfaces from a point cloud polydata with contourfilter

Daniel Coelho 1danielcoelho at gmail.com
Sun Jan 18 07:01:28 EST 2015


Hello everyone!

I have a point cloud in the form of a polydata, where I build vertices with
vtkVertexGlyphFilter.

That polydata has pointdata with scalars ranging from 0 to 255, and I'm
trying to use vtkContourFilter to extract 5 planes, that ideally should cut
through the data at the values corresponding to each plane.

Just to make it clearer: The expected output should be 5 parallel planes,
equidistant to each other, where each is an isosurface of a certain value,
with respect to the scalars of the pointcloud.

The problem is: I get absolutely no output. No points, no cell, nada. I've
looked at every example I could find and the mailing list archive, but
couldn't pinpoint the problem.

Here is a short compilable example that shows this problem. You can also
see outputs from print statements as comments:
OBS: I use VTK 5.8 for some reasons, this is non-negotiable

#include <vtkSmartPointer.h>

#include <vtkContourFilter.h>

#include <vtkTypeUInt8Array.h>

#include <vtkVertexGlyphFilter.h>

#include <vtkPolyDataMapper.h>

#include <vtkActor.h>

#include <vtkRenderer.h>

#include <vtkRenderWindow.h>

#include <vtkRenderWindowInteractor.h>


#define VTK_NEW(type, instance) \

  ;                             \

  vtkSmartPointer<type> instance = vtkSmartPointer<type>::New();


int main(int argc, char *argv[]) {


  VTK_NEW(vtkPoints, points);

  points->Allocate(100 * 100 * 100);


  VTK_NEW(vtkTypeUInt8Array, data_array);

  data_array->Allocate(100 * 100 * 100);


  for (int x = 0; x < 100; x++) {

    for (int y = 0; y < 100; ++y) {

      for (int z = 0; z < 100; ++z) {

        points->InsertNextPoint(x, y, z);

        data_array->InsertNextValue(z % 256);

      }

    }

  }


  VTK_NEW(vtkPolyData, polydata);

  polydata->SetPoints(points);

  polydata->GetPointData()->SetScalars(data_array);


  VTK_NEW(vtkVertexGlyphFilter, glyph_filter);

  glyph_filter->SetInput(polydata);

  glyph_filter->Update();

  glyph_filter->GetOutput()->Print(std::cout << "Glyph filter: \n");

  //Output here:

  //Number Of Points: 1000000

  //Number Of Cells: 1000000

  //Bounds look good, all good


  VTK_NEW(vtkContourFilter, cont_filt);

  cont_filt->SetInputConnection(glyph_filter->GetOutputPort());

  double scalarRange[2];

  polydata->GetPointData()->GetScalars()->GetRange(scalarRange);

  cont_filt->GenerateValues(5, scalarRange[0], scalarRange[1]);

  cont_filt->Update();


  // Print the contours

  int num_contours = cont_filt->GetNumberOfContours();

  double cont_values[num_contours];

  cont_filt->GetValues(cont_values);

  std::cout << "Contours: ";

  for (int var = 0; var < num_contours; ++var) {

    std::cout << cont_values[var] << " ";

  }

  std::cout << std::endl;

  //Output here:

  //Contours: 0 24.75 49.5 74.25 99


  cont_filt->GetOutput()->Print(std::cout << "Contour filter: \n");

  //Output here:

  //No points, no cells, default bounds, no nothing


  VTK_NEW(vtkPolyDataMapper, mapper);

  mapper->SetInputConnection(cont_filt->GetOutputPort());

  mapper->SetScalarVisibility(1);


  VTK_NEW(vtkActor, actor);

  actor->SetMapper(mapper);


  VTK_NEW(vtkRenderer, renderer);

  renderer->AddActor(actor);


  VTK_NEW(vtkRenderWindow, render_window)

  render_window->AddRenderer(renderer);

  render_window->SetSize(600, 600);


  VTK_NEW(vtkRenderWindowInteractor, interactor);

  interactor->SetRenderWindow(render_window);


  renderer->ResetCamera();

  render_window->Render();

  interactor->Start();

}
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://public.kitware.com/pipermail/vtkusers/attachments/20150118/0d2595ad/attachment.html>


More information about the vtkusers mailing list