# VisualizeKDTree

VTKExamples/Java/DataStructures/VisualizeKDTree

### Description

This demo shows every level of a kdTree.

### Code

VisualizeKDTree.java

    import vtk.*;

    public class VisualizeKDTree
    {

      static
      {
        System.loadLibrary("vtkCommonJava");
        System.loadLibrary("vtkFilteringJava");
        System.loadLibrary("vtkIOJava");
        System.loadLibrary("vtkImagingJava");
        System.loadLibrary("vtkGraphicsJava");
        System.loadLibrary("vtkRenderingJava");
        System.loadLibrary("vtkWidgetsJava");
      }

      static class vtkSliderCallback
      {
        void Execute()
        {
          this.Level = (int)Math.round(((vtkSliderRepresentation)SliderWidget.GetRepresentation()).GetValue());
          this.KdTree.GenerateRepresentation(this.Level, this.PolyData);
          this.Renderer.Render();
        }

        vtkKdTreePointLocator KdTree;
        int Level = 0;
        vtkPolyData PolyData;
        vtkRenderer Renderer;
        vtkSliderWidget SliderWidget;
      }

      public static void main(String[] args)
      {
        // Create a point cloud
        vtkPointSource pointSource = new vtkPointSource();
        pointSource.SetRadius(4);
        pointSource.SetNumberOfPoints(1000);
        pointSource.Update();

        vtkPolyDataMapper pointsMapper = new vtkPolyDataMapper();
        pointsMapper.SetInputConnection(pointSource.GetOutputPort());

        vtkActor pointsActor = new vtkActor();
        pointsActor.SetMapper(pointsMapper);
        pointsActor.GetProperty().SetInterpolationToFlat();

        int maxLevel = 20;
        // Create the tree
        vtkKdTreePointLocator kdTree = new vtkKdTreePointLocator();
        kdTree.SetDataSet(pointSource.GetOutput());
        kdTree.AutomaticOff();
        kdTree.SetMaxLevel(maxLevel);
        kdTree.BuildLocator();

        // Initialize the representation
        vtkPolyData polydata = new vtkPolyData();
        kdTree.GenerateRepresentation(0, polydata);

        vtkPolyDataMapper octreeMapper = new vtkPolyDataMapper();
        octreeMapper.SetInputConnection(polydata.GetProducerPort());

        vtkActor octreeActor = new vtkActor();
        octreeActor.SetMapper(octreeMapper);
        octreeActor.GetProperty().SetInterpolationToFlat();
        octreeActor.GetProperty().SetRepresentationToWireframe();

        // A renderer and render window
        vtkRenderer renderer = new vtkRenderer();
        vtkRenderWindow renderWindow = new vtkRenderWindow();
        renderWindow.AddRenderer(renderer);

        // An interactor
        vtkRenderWindowInteractor renderWindowInteractor =
          new vtkRenderWindowInteractor();
        renderWindowInteractor.SetRenderWindow(renderWindow);

        // Add the actors to the scene
        renderer.AddActor(pointsActor);
        renderer.AddActor(octreeActor);

        // Render an image (lights and cameras are created automatically)
        renderWindow.Render();

        vtkSliderRepresentation2D sliderRep = new vtkSliderRepresentation2D();
        sliderRep.SetMinimumValue(0);
        sliderRep.SetMaximumValue(kdTree.GetLevel());
        sliderRep.SetValue(0);
        sliderRep.SetTitleText("Level");
        sliderRep.GetPoint1Coordinate().SetCoordinateSystemToNormalizedDisplay();
        sliderRep.GetPoint1Coordinate().SetValue(.2, .2);
        sliderRep.GetPoint2Coordinate().SetCoordinateSystemToNormalizedDisplay();
        sliderRep.GetPoint2Coordinate().SetValue(.8, .2);
        sliderRep.SetSliderLength(0.075);
        sliderRep.SetSliderWidth(0.05);
        sliderRep.SetEndCapLength(0.05);

        vtkSliderWidget sliderWidget = new vtkSliderWidget();
        sliderWidget.SetInteractor(renderWindowInteractor);
        sliderWidget.SetRepresentation(sliderRep);
        sliderWidget.SetAnimationModeToAnimate();
        sliderWidget.EnabledOn();

        vtkSliderCallback callback = new vtkSliderCallback();
        callback.KdTree = kdTree;
        callback.PolyData = polydata;
        callback.Renderer = renderer;
        callback.SliderWidget = sliderWidget;

        sliderWidget.AddObserver("InteractionEvent", callback, "Execute");

        renderWindowInteractor.Initialize();
        renderWindow.Render();

        renderWindowInteractor.Start();
      }
    }