Mercurial > dive4elements > river
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,