@Override
 public void processNewResult(VisualizerContext context, Object result) {
   VisualizationTree.findNewResultVis(
       context,
       result,
       Relation.class,
       ScatterPlotProjector.class,
       new VisualizationTree.Handler2<Relation<?>, ScatterPlotProjector<?>>() {
         @Override
         public void process(
             VisualizerContext context, Relation<?> rel, ScatterPlotProjector<?> p) {
           if (!TypeUtil.POLYGON_TYPE.isAssignableFromType(rel.getDataTypeInformation())) {
             return;
           }
           if (RelationUtil.dimensionality(p.getRelation()) != 2) {
             return;
           }
           // Assume that a 2d projector is using the same coordinates as the
           // polygons.
           final VisualizationTask task =
               new VisualizationTask(NAME, context, rel, rel, PolygonVisualization.this);
           task.level = VisualizationTask.LEVEL_DATA - 10;
           task.addUpdateFlags(VisualizationTask.ON_DATA);
           context.addVis(rel, task);
           context.addVis(p, task);
         }
       });
 }
 @Override
 public void processNewResult(VisualizerContext context, Object result) {
   Hierarchy.Iter<OPTICSProjector> it =
       VisualizationTree.filter(context, result, OPTICSProjector.class);
   for (; it.valid(); it.advance()) {
     OPTICSProjector p = it.get();
     final VisualizationTask task =
         new VisualizationTask(NAME, context, p.getResult(), null, this);
     task.level = VisualizationTask.LEVEL_INTERACTIVE;
     context.addVis(p, task);
   }
 }