/*========================================================================= Program: Visualization Toolkit Module: TestLabelPlacementMapperCoincidentPoints.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. =========================================================================*/ // .NAME Test of vtkLabelPlacer // .SECTION Description // this program tests vtkLabelPlacer which uses a sophisticated algorithm to // prune labels/icons preventing them from overlapping. #include "vtkActor.h" #include "vtkActor2D.h" #include "vtkCamera.h" #include "vtkCellArray.h" #include "vtkFloatArray.h" #include "vtkImageData.h" #include "vtkLabelHierarchy.h" #include "vtkLabelPlacementMapper.h" #include "vtkLabeledDataMapper.h" #include "vtkMath.h" #include "vtkPointData.h" #include "vtkPointSet.h" #include "vtkPointSetToLabelHierarchy.h" #include "vtkPoints.h" #include "vtkPolyData.h" #include "vtkPolyDataMapper.h" #include "vtkPolyDataMapper2D.h" #include "vtkProperty.h" #include "vtkRectilinearGrid.h" #include "vtkRenderWindow.h" #include "vtkRenderWindowInteractor.h" #include "vtkRenderer.h" #include "vtkSmartPointer.h" #include "vtkStringArray.h" #include "vtkStructuredGrid.h" #include "vtkTextProperty.h" #include "vtkUnstructuredGrid.h" #include "vtkSphereSource.h" #include #include /* void prtbds( const char* msg, const double* bds ) { cout << msg << ":"; for ( int i = 0; i < 3; ++ i ) cout << " [ " << bds[2*i] << ", " << bds[2*i+1] << "]"; cout << "\n"; } */ int TestLabelPlacementMapperCoincidentPoints(int argc, char* argv[]) { int maxLevels = 5; int targetLabels = 7; double labelRatio = 1.0; int i = 0; int iteratorType = vtkLabelHierarchy::QUEUE; vtkSmartPointer labelHierarchy = vtkSmartPointer::New(); vtkSmartPointer labelPlacer = vtkSmartPointer::New(); vtkSmartPointer pointSetToLabelHierarchy = vtkSmartPointer::New(); vtkSmartPointer polyDataMapper = vtkSmartPointer::New(); vtkSmartPointer actor = vtkSmartPointer::New(); vtkSmartPointer polyDataMapper2 = vtkSmartPointer::New(); vtkSmartPointer actor2 = vtkSmartPointer::New(); vtkSmartPointer renderer = vtkSmartPointer::New(); vtkSmartPointer renWin = vtkSmartPointer::New(); renWin->SetMultiSamples(0); // ensure to have the same test image everywhere vtkSmartPointer iren = vtkSmartPointer::New(); vtkSmartPointer labeledMapper = vtkSmartPointer::New(); vtkSmartPointer textActor = vtkSmartPointer::New(); vtkSmartPointer points = vtkSmartPointer::New(); // renderer->GetActiveCamera()->ParallelProjectionOn(); vtkMath::RandomSeed(5678); for (i = 0; i < 29; i++) { // points->InsertPoint( i, vtkMath::Random(-1.0, 1.0), vtkMath::Random(-1.0, 1.0), 0. ); points->InsertPoint(i, 0.0, 0.0, 0.0); } points->InsertPoint(29, 2.2, 2.2, 0.0); vtkSmartPointer cells = vtkSmartPointer::New(); cells->InsertNextCell(30); for (i = 0; i < 30; i++) { cells->InsertCellPoint(i); } vtkSmartPointer polyData = vtkSmartPointer::New(); polyData->SetPoints(points); polyData->SetVerts(cells); vtkSmartPointer stringData = vtkSmartPointer::New(); stringData->SetName("PlaceNames"); stringData->InsertNextValue("Abu Dhabi"); stringData->InsertNextValue("Amsterdam"); stringData->InsertNextValue("Beijing"); stringData->InsertNextValue("Berlin"); stringData->InsertNextValue("Cairo"); stringData->InsertNextValue("Caracas"); stringData->InsertNextValue("Dublin"); stringData->InsertNextValue("Georgetown"); stringData->InsertNextValue("The Hague"); stringData->InsertNextValue("Hanoi"); stringData->InsertNextValue("Islamabad"); stringData->InsertNextValue("Jakarta"); stringData->InsertNextValue("Kiev"); stringData->InsertNextValue("Kingston"); stringData->InsertNextValue("Lima"); stringData->InsertNextValue("London"); stringData->InsertNextValue("Luxembourg City"); stringData->InsertNextValue("Madrid"); stringData->InsertNextValue("Moscow"); stringData->InsertNextValue("Nairobi"); stringData->InsertNextValue("New Delhi"); stringData->InsertNextValue("Ottawa"); stringData->InsertNextValue("Paris"); stringData->InsertNextValue("Prague"); stringData->InsertNextValue("Rome"); stringData->InsertNextValue("Seoul"); stringData->InsertNextValue("Tehran"); stringData->InsertNextValue("Tokyo"); stringData->InsertNextValue("Warsaw"); stringData->InsertNextValue("Washington"); polyData->GetPointData()->AddArray(stringData); vtkSmartPointer tprop = vtkSmartPointer::New(); tprop->SetFontSize(12); tprop->SetFontFamily(vtkTextProperty::GetFontFamilyFromString("Arial")); tprop->SetColor(0.0, 0.8, 0.2); pointSetToLabelHierarchy->SetInputData(polyData); pointSetToLabelHierarchy->SetTextProperty(tprop); pointSetToLabelHierarchy->SetPriorityArrayName("Priority"); pointSetToLabelHierarchy->SetLabelArrayName("PlaceNames"); pointSetToLabelHierarchy->SetMaximumDepth(maxLevels); pointSetToLabelHierarchy->SetTargetLabelCount(targetLabels); labelPlacer->SetInputConnection(pointSetToLabelHierarchy->GetOutputPort()); labelPlacer->SetIteratorType(iteratorType); labelPlacer->SetMaximumLabelFraction(labelRatio); // labelPlacer->SetIteratorType(1); // Quadtree is only available type for 2-D. polyDataMapper->SetInputData(polyData); // polyDataMapper2->SetInputConnection(labelPlacer->GetOutputPort(2)); actor->SetMapper(polyDataMapper); // actor2->SetMapper(polyDataMapper2); // labelPlacer->Update(); textActor->SetMapper(labelPlacer); // renderer->AddActor(actor); // renderer->AddActor(actor2); renderer->AddActor(textActor); renWin->SetSize(600, 600); renWin->AddRenderer(renderer); renderer->SetBackground(0.0, 0.0, 0.0); iren->SetRenderWindow(renWin); // labelPlacer->Update(); // cout << "Pre-reset-camera bounds of...\n"; // prtbds( "output 0", labelPlacer->GetOutput( 0 )->GetBounds() ); // prtbds( "output 1", labelPlacer->GetOutput( 1 )->GetBounds() ); // prtbds( "output 2", labelPlacer->GetOutput( 2 )->GetBounds() ); /* renWin->Render(); renderer->ResetCamera(); renderer->ResetCamera(); renderer->ResetCamera(); renWin->Render(); */ // cout << "Post-reset-camera Bounds of...\n"; // prtbds( "output 0", labelPlacer->GetOutput( 0 )->GetBounds() ); // prtbds( "output 1", labelPlacer->GetOutput( 1 )->GetBounds() ); // prtbds( "output 2", labelPlacer->GetOutput( 2 )->GetBounds() ); renWin->Render(); int retVal = vtkRegressionTestImage(renWin); if (retVal == vtkRegressionTester::DO_INTERACTOR) { iren->Start(); } return !retVal; }