diff flys-artifacts/src/main/java/de/intevation/flys/jfree/StableXYDifferenceRenderer.java @ 1883:eb671699fbc2

CrossSectionApp: Draw water, too. flys-artifacts/trunk@3242 c6561f87-3c4e-4783-a992-168aeb5c3f6f
author Sascha L. Teichmann <sascha.teichmann@intevation.de>
date Sat, 12 Nov 2011 22:26:27 +0000
parents 0e9c0b49b4ef
children 4ae9c92feb8c
line wrap: on
line diff
--- a/flys-artifacts/src/main/java/de/intevation/flys/jfree/StableXYDifferenceRenderer.java	Sat Nov 12 12:07:39 2011 +0000
+++ b/flys-artifacts/src/main/java/de/intevation/flys/jfree/StableXYDifferenceRenderer.java	Sat Nov 12 22:26:27 2011 +0000
@@ -86,8 +86,10 @@
 import java.io.IOException;
 import java.io.ObjectInputStream;
 import java.io.ObjectOutputStream;
+import java.util.ArrayList;
 import java.util.Collections;
 import java.util.LinkedList;
+import java.util.List;
 
 import org.jfree.chart.LegendItem;
 import org.jfree.chart.axis.ValueAxis;
@@ -101,6 +103,7 @@
 import org.jfree.chart.plot.XYPlot;
 import org.jfree.chart.urls.XYURLGenerator;
 import org.jfree.data.xy.XYDataset;
+import org.jfree.data.xy.DefaultXYDataset;
 import org.jfree.io.SerialUtilities;
 import org.jfree.ui.RectangleEdge;
 import org.jfree.util.PaintUtilities;
@@ -111,6 +114,8 @@
 import org.jfree.chart.renderer.xy.XYItemRenderer;
 import org.jfree.chart.renderer.xy.XYItemRendererState;
 
+import gnu.trove.TDoubleArrayList;
+
 /**
  * A renderer for an {@link XYPlot} that highlights the differences between two
  * series.  The example shown here is generated by the
@@ -359,6 +364,56 @@
         return 2;
     }
 
+    public static List<XYDataset> splitByNaNs(XYDataset dataset)  {
+        List<XYDataset> datasets = new ArrayList<XYDataset>();
+
+        switch (dataset.getSeriesCount()) {
+            case 0:
+                return datasets;
+            case 1:
+                int N = dataset.getItemCount(0);
+                TDoubleArrayList xs = new TDoubleArrayList(N);
+                TDoubleArrayList ys = new TDoubleArrayList(N);
+                for (int i = 0; i < N; ++i) {
+                    double x = dataset.getXValue(0, i);
+                    double y = dataset.getYValue(0, i);
+                    if (Double.isNaN(x) || Double.isNaN(y)) {
+                        if (!xs.isEmpty()) {
+                            DefaultXYDataset ds = new DefaultXYDataset();
+                            datasets.add(ds);
+                            ds.addSeries(
+                                dataset.getSeriesKey(0),
+                                new double [][] {
+                                    xs.toNativeArray(),
+                                    ys.toNativeArray() });
+                            xs.reset();
+                            ys.reset();
+                        }
+                    }
+                    else {
+                        xs.add(x);
+                        ys.add(y);
+                    }
+                }
+                if (!xs.isEmpty()) {
+                    DefaultXYDataset ds = new DefaultXYDataset();
+                    datasets.add(ds);
+                    ds.addSeries(
+                        dataset.getSeriesKey(0),
+                        new double [][] {
+                            xs.toNativeArray(),
+                            ys.toNativeArray() });
+                }
+                break;
+            default: // two or more
+                // TODO: split two parts
+                datasets.add(dataset);
+                break;
+        }
+
+        return datasets;
+    }
+
     /**
      * Draws the visual representation of a single data item.
      *
@@ -391,9 +446,11 @@
                          int pass) {
         switch (pass) {
             case 0:
-                drawItemPass0(g2, dataArea, info, 
-                    plot, domainAxis, rangeAxis,
-                    dataset, series, item, crosshairState);
+                for (XYDataset ds: splitByNaNs(dataset)) {
+                    drawItemPass0(g2, dataArea, info, 
+                        plot, domainAxis, rangeAxis,
+                        dataset, series, item, crosshairState);
+                }
                 break;
             case 1:
                 drawItemPass1(g2, dataArea, info,

http://dive4elements.wald.intevation.org