Skip to content

QuantizePolyDataPoints

vtk-examples/Cxx/PolyData/QuantizePolyDataPoints


Description

This example demonstrates how to "snap" points onto a discrete grid. This example rounds the coordinates of each point the the nearest 0.1

Question

If you have a question about this example, please use the VTK Discourse Forum

Code

QuantizePolyDataPoints.cxx

#include <vtkNew.h>
#include <vtkProperty.h>
#include <vtkQuantizePolyDataPoints.h>
#include <vtkSmartPointer.h>
#include <vtkCamera.h>
#include <vtkGlyph3DMapper.h>
#include <vtkPointSource.h>
#include <vtkPoints.h>
#include <vtkPolyData.h>
#include <vtkPolyDataMapper.h>
#include <vtkProperty.h>
#include <vtkRenderWindow.h>
#include <vtkRenderWindowInteractor.h>
#include <vtkRenderer.h>
#include <vtkSphereSource.h>
#include <vtkXMLPolyDataReader.h>
#include <vtkNamedColors.h>
#include <vtkNew.h>
#include <vtkProperty.h>


int main(int, char*[])
{
  vtkNew<vtkNamedColors> colors;

  vtkNew<vtkPointSource> pointSource;
  pointSource->SetNumberOfPoints(100);
  pointSource->Update();

  std::cout << "There are " << pointSource->GetNumberOfPoints() << " points."
            << std::endl;

  vtkNew<vtkQuantizePolyDataPoints> quantizeFilter;
  quantizeFilter->SetInputConnection(pointSource->GetOutputPort());
  quantizeFilter->SetQFactor(.1);
  quantizeFilter->Update();

  vtkPolyData* quantized = quantizeFilter->GetOutput();
  std::cout << "There are " << quantized->GetNumberOfPoints()
            << " quantized points." << std::endl;

  for (vtkIdType i = 0; i < pointSource->GetOutput()->GetNumberOfPoints(); i++)
  {
    double pOrig[3];
    double pQuantized[3];
    pointSource->GetOutput()->GetPoint(i, pOrig);
    quantized->GetPoints()->GetPoint(i, pQuantized);

    std::cout << "Point " << i << " : (" << pOrig[0] << ", " << pOrig[1] << ", "
              << pOrig[2] << ")"
              << " (" << pQuantized[0] << ", " << pQuantized[1] << ", "
              << pQuantized[2] << ")" << std::endl;
  }

  double radius = 0.02;
  vtkNew<vtkSphereSource> sphereSource;
  sphereSource->SetRadius(radius);

  vtkNew<vtkGlyph3DMapper> inputMapper;
  inputMapper->SetInputConnection(pointSource->GetOutputPort());
  inputMapper->SetSourceConnection(sphereSource->GetOutputPort());
  inputMapper->ScalarVisibilityOff();
  inputMapper->ScalingOff();

  vtkNew<vtkActor> inputActor;
  inputActor->SetMapper(inputMapper);
  inputActor->GetProperty()->SetColor(
      colors->GetColor3d("Orchid").GetData());


  vtkNew<vtkGlyph3DMapper> quantizedMapper;
  quantizedMapper->SetInputConnection(quantizeFilter->GetOutputPort());
  quantizedMapper->SetSourceConnection(sphereSource->GetOutputPort());
  quantizedMapper->ScalarVisibilityOff();
  quantizedMapper->ScalingOff();

  vtkNew<vtkActor> quantizedActor;
  quantizedActor->SetMapper(quantizedMapper);
  quantizedActor->GetProperty()->SetColor(
      colors->GetColor3d("Orchid").GetData());

  // There will be one render window
  vtkNew<vtkRenderWindow> renderWindow;
  renderWindow->SetSize(640, 360);

  // And one interactor
  vtkNew<vtkRenderWindowInteractor> interactor;
  interactor->SetRenderWindow(renderWindow);
  renderWindow->SetWindowName("QuantizePolyDataPoints");

  // Define viewport ranges
  // (xmin, ymin, xmax, ymax)
  double leftViewport[4] = {0.0, 0.0, 0.5, 1.0};
  double rightViewport[4] = {0.5, 0.0, 1.0, 1.0};

  // Setup both renderers
  vtkNew<vtkRenderer> leftRenderer;
  renderWindow->AddRenderer(leftRenderer);
  leftRenderer->SetViewport(leftViewport);
  leftRenderer->SetBackground(colors->GetColor3d("Bisque").GetData());

  vtkNew<vtkRenderer> rightRenderer;
  renderWindow->AddRenderer(rightRenderer);
  rightRenderer->SetViewport(rightViewport);
  rightRenderer->SetBackground(colors->GetColor3d("PaleTurquoise").GetData());

  leftRenderer->AddActor(inputActor);
  rightRenderer->AddActor(quantizedActor);

  leftRenderer->ResetCamera();

  rightRenderer->SetActiveCamera(leftRenderer->GetActiveCamera());

  renderWindow->Render();
  interactor->Start();

  return EXIT_SUCCESS;
}

CMakeLists.txt

cmake_minimum_required(VERSION 3.3 FATAL_ERROR)

project(QuantizePolyDataPoints)

find_package(VTK COMPONENTS 
  vtkCommonColor
  vtkCommonCore
  vtkCommonDataModel
  vtkFiltersGeneral
  vtkFiltersSources
  vtkIOXML
  vtkInteractionStyle
  vtkRenderingContextOpenGL2
  vtkRenderingCore
  vtkRenderingFreeType
  vtkRenderingGL2PSOpenGL2
  vtkRenderingOpenGL2
  QUIET
)

if (NOT VTK_FOUND)
  message("Skipping QuantizePolyDataPoints: ${VTK_NOT_FOUND_MESSAGE}")
  return()
endif()
message (STATUS "VTK_VERSION: ${VTK_VERSION}")
if (VTK_VERSION VERSION_LESS "8.90.0")
  # old system
  include(${VTK_USE_FILE})
  add_executable(QuantizePolyDataPoints MACOSX_BUNDLE QuantizePolyDataPoints.cxx )
  target_link_libraries(QuantizePolyDataPoints PRIVATE ${VTK_LIBRARIES})
else()
  # Prevent a "command line is too long" failure in Windows.
  set(CMAKE_NINJA_FORCE_RESPONSE_FILE "ON" CACHE BOOL "Force Ninja to use response files.")
  add_executable(QuantizePolyDataPoints MACOSX_BUNDLE QuantizePolyDataPoints.cxx )
  target_link_libraries(QuantizePolyDataPoints PRIVATE ${VTK_LIBRARIES})
  # vtk_module_autoinit is needed
  vtk_module_autoinit(
    TARGETS QuantizePolyDataPoints
    MODULES ${VTK_LIBRARIES}
    )
endif()

Download and Build QuantizePolyDataPoints

Click here to download QuantizePolyDataPoints and its CMakeLists.txt file. Once the tarball QuantizePolyDataPoints.tar has been downloaded and extracted,

cd QuantizePolyDataPoints/build

If VTK is installed:

cmake ..

If VTK is not installed but compiled on your system, you will need to specify the path to your VTK build:

cmake -DVTK_DIR:PATH=/home/me/vtk_build ..

Build the project:

make

and run it:

./QuantizePolyDataPoints

WINDOWS USERS

Be sure to add the VTK bin directory to your path. This will resolve the VTK dll's at run time.