From 6dee6fdea08f624ced3cbcbc2853859dd4309fa1 Mon Sep 17 00:00:00 2001 From: Dan Lipsa Date: Tue, 25 Nov 2014 15:03:32 -0500 Subject: [PATCH] Fix KdTree::GenerateRepresentation and add test. Change-Id: I15c9ecb05fc32bca7b4fd14bd0d88e76cf904929 --- Common/DataModel/Testing/Cxx/CMakeLists.txt | 4 + .../Testing/Cxx/TestKdTreeRepresentation.cxx | 134 ++++++++++++++++++ .../Baseline/TestKdTreeRepresentation.png.md5 | 1 + Common/DataModel/vtkKdTree.cxx | 7 +- 4 files changed, 143 insertions(+), 3 deletions(-) create mode 100644 Common/DataModel/Testing/Cxx/TestKdTreeRepresentation.cxx create mode 100644 Common/DataModel/Testing/Data/Baseline/TestKdTreeRepresentation.png.md5 diff --git a/Common/DataModel/Testing/Cxx/CMakeLists.txt b/Common/DataModel/Testing/Cxx/CMakeLists.txt index a9599cf8d43..b4731c8af7c 100644 --- a/Common/DataModel/Testing/Cxx/CMakeLists.txt +++ b/Common/DataModel/Testing/Cxx/CMakeLists.txt @@ -50,8 +50,12 @@ vtk_add_test_cxx(${vtk-module}CxxTests data_tests TestCellIterators.cxx,NO_VALID,NO_OUTPUT TestQuadraticPolygonFilters.cxx ) +vtk_add_test_cxx(${vtk-module}CxxTests output_tests + TestKdTreeRepresentation.cxx,NO_DATA + ) set(all_tests ${tests} ${data_tests} + ${output_tests} ) vtk_test_cxx_executable(${vtk-module}CxxTests all_tests) diff --git a/Common/DataModel/Testing/Cxx/TestKdTreeRepresentation.cxx b/Common/DataModel/Testing/Cxx/TestKdTreeRepresentation.cxx new file mode 100644 index 00000000000..7cd94ad7f26 --- /dev/null +++ b/Common/DataModel/Testing/Cxx/TestKdTreeRepresentation.cxx @@ -0,0 +1,134 @@ +/*========================================================================= + + Program: Visualization Toolkit + Module: TestKdTreeBoxSelection.cxx + + Copyright (c) Ken Martin, Will Schroeder, Bill Lorensen + All rights reserved. + See Copyright.txt or http://www.kitware.com/Copyright.htm for details. + + This software is distributed WITHOUT ANY WARRANTY; without even + the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR + PURPOSE. See the above copyright notice for more information. + +=========================================================================*/ + +#include "vtkActor.h" +#include "vtkCamera.h" +#include "vtkGlyph3D.h" +#include "vtkInteractorStyleRubberBandPick.h" +#include "vtkKdTree.h" +#include "vtkPoints.h" +#include "vtkPolyData.h" +#include "vtkPolyDataMapper.h" +#include "vtkProperty.h" +#include "vtkRegressionTestImage.h" +#include "vtkRenderer.h" +#include "vtkRenderWindow.h" +#include "vtkRenderWindowInteractor.h" +#include "vtkSmartPointer.h" +#include "vtkSphereSource.h" + +#define VTK_CREATE(type,name) \ + vtkSmartPointer name = vtkSmartPointer::New() + +int TestKdTreeRepresentation(int argc, char *argv[]) +{ + double glyphSize = 0.05; + const vtkIdType num_points = 10; + // random points generated on Linux (rand does not work the same on different + // platforms) + double p[num_points][3] = + { + {0.840188, 0.394383, 0.783099}, + {0.79844, 0.911647, 0.197551}, + {0.335223, 0.76823, 0.277775}, + {0.55397, 0.477397, 0.628871}, + {0.364784, 0.513401, 0.95223}, + {0.916195, 0.635712, 0.717297}, + {0.141603, 0.606969, 0.0163006}, + {0.242887, 0.137232, 0.804177}, + {0.156679, 0.400944, 0.12979}, + {0.108809, 0.998925, 0.218257} + }; + + // generate random points + VTK_CREATE(vtkPolyData, pointData); + VTK_CREATE(vtkPoints, points); + points->SetDataTypeToDouble(); + points->SetNumberOfPoints( num_points ); + pointData->Allocate(num_points); + for (vtkIdType i = 0; i < num_points; ++i) + { + points->SetPoint( i, p[i] ); + pointData->InsertNextCell(VTK_VERTEX,1, &i); + } + pointData->SetPoints(points); + + // create a kdtree + VTK_CREATE(vtkKdTree, kdTree); + kdTree->SetMinCells(1); + kdTree->BuildLocatorFromPoints(points); + + // generate a kdtree representation + VTK_CREATE(vtkPolyData, kdTreeRepr); + kdTree->GenerateRepresentation(/*kdTree->GetLevel()*/2, kdTreeRepr); + VTK_CREATE(vtkPolyDataMapper, kdTreeReprMapper); + kdTreeReprMapper->SetInputData(kdTreeRepr); + + VTK_CREATE(vtkActor, kdTreeReprActor); + kdTreeReprActor->SetMapper(kdTreeReprMapper); + kdTreeReprActor->GetProperty()->SetColor(1.0, 1.0, 1.0); + kdTreeReprActor->GetProperty()->SetRepresentationToWireframe(); + kdTreeReprActor->GetProperty()->SetLineWidth(4); + kdTreeReprActor->GetProperty()->LightingOff(); + + // + // Create vertex glyphs + // + VTK_CREATE(vtkSphereSource, sphere); + sphere->SetRadius(glyphSize); + + VTK_CREATE(vtkGlyph3D, glyph); + glyph->SetInputData(0, pointData); + glyph->SetInputConnection(1, sphere->GetOutputPort()); + + VTK_CREATE(vtkPolyDataMapper, glyphMapper); + glyphMapper->SetInputConnection(glyph->GetOutputPort()); + + VTK_CREATE(vtkActor, glyphActor); + glyphActor->SetMapper(glyphMapper); + + // + // Set up render window + // + + VTK_CREATE (vtkCamera, camera); + vtkSmartPointer::New(); + camera->SetPosition(-10, 10, 20); + camera->SetFocalPoint(0, 0, 0); + + VTK_CREATE(vtkRenderer, ren); + ren->AddActor(glyphActor); + ren->AddActor(kdTreeReprActor); + ren->SetActiveCamera(camera); + ren->ResetCamera(); + + VTK_CREATE(vtkRenderWindow, win); + win->AddRenderer(ren); + + VTK_CREATE(vtkRenderWindowInteractor, iren); + iren->SetRenderWindow(win); + iren->Initialize(); + + VTK_CREATE(vtkInteractorStyleRubberBandPick, interact); + iren->SetInteractorStyle(interact); + + int retVal = vtkRegressionTestImage (win); + if ( retVal == vtkRegressionTester::DO_INTERACTOR) + { + iren->Start(); + retVal = vtkRegressionTester::PASSED; + } + return (!retVal); +} diff --git a/Common/DataModel/Testing/Data/Baseline/TestKdTreeRepresentation.png.md5 b/Common/DataModel/Testing/Data/Baseline/TestKdTreeRepresentation.png.md5 new file mode 100644 index 00000000000..8cd58b9a62b --- /dev/null +++ b/Common/DataModel/Testing/Data/Baseline/TestKdTreeRepresentation.png.md5 @@ -0,0 +1 @@ +02da91d14495841c2bbed0a69dd35bc0 diff --git a/Common/DataModel/vtkKdTree.cxx b/Common/DataModel/vtkKdTree.cxx index eaab73d3b1f..6713dfd36cc 100644 --- a/Common/DataModel/vtkKdTree.cxx +++ b/Common/DataModel/vtkKdTree.cxx @@ -3180,10 +3180,11 @@ void vtkKdTree::GenerateRepresentationWholeSpace(int level, vtkPolyData *pd) level = this->Level; } - int npoints = 0; - int npolys = 0; + // points and quads for level 0 bounding box + int npoints = 8; + int npolys = 6; - for (i=0 ; i < level; i++) + for (i = 1; i < level; i++) { int levelPolys = 1 << (i-1); npoints += (4 * levelPolys); -- GitLab