comparison 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
comparison
equal deleted inserted replaced
1882:d67a9ca116c3 1883:eb671699fbc2
84 import java.awt.geom.Line2D; 84 import java.awt.geom.Line2D;
85 import java.awt.geom.Rectangle2D; 85 import java.awt.geom.Rectangle2D;
86 import java.io.IOException; 86 import java.io.IOException;
87 import java.io.ObjectInputStream; 87 import java.io.ObjectInputStream;
88 import java.io.ObjectOutputStream; 88 import java.io.ObjectOutputStream;
89 import java.util.ArrayList;
89 import java.util.Collections; 90 import java.util.Collections;
90 import java.util.LinkedList; 91 import java.util.LinkedList;
92 import java.util.List;
91 93
92 import org.jfree.chart.LegendItem; 94 import org.jfree.chart.LegendItem;
93 import org.jfree.chart.axis.ValueAxis; 95 import org.jfree.chart.axis.ValueAxis;
94 import org.jfree.chart.entity.EntityCollection; 96 import org.jfree.chart.entity.EntityCollection;
95 import org.jfree.chart.entity.XYItemEntity; 97 import org.jfree.chart.entity.XYItemEntity;
99 import org.jfree.chart.plot.PlotOrientation; 101 import org.jfree.chart.plot.PlotOrientation;
100 import org.jfree.chart.plot.PlotRenderingInfo; 102 import org.jfree.chart.plot.PlotRenderingInfo;
101 import org.jfree.chart.plot.XYPlot; 103 import org.jfree.chart.plot.XYPlot;
102 import org.jfree.chart.urls.XYURLGenerator; 104 import org.jfree.chart.urls.XYURLGenerator;
103 import org.jfree.data.xy.XYDataset; 105 import org.jfree.data.xy.XYDataset;
106 import org.jfree.data.xy.DefaultXYDataset;
104 import org.jfree.io.SerialUtilities; 107 import org.jfree.io.SerialUtilities;
105 import org.jfree.ui.RectangleEdge; 108 import org.jfree.ui.RectangleEdge;
106 import org.jfree.util.PaintUtilities; 109 import org.jfree.util.PaintUtilities;
107 import org.jfree.util.PublicCloneable; 110 import org.jfree.util.PublicCloneable;
108 import org.jfree.util.ShapeUtilities; 111 import org.jfree.util.ShapeUtilities;
109 112
110 import org.jfree.chart.renderer.xy.AbstractXYItemRenderer; 113 import org.jfree.chart.renderer.xy.AbstractXYItemRenderer;
111 import org.jfree.chart.renderer.xy.XYItemRenderer; 114 import org.jfree.chart.renderer.xy.XYItemRenderer;
112 import org.jfree.chart.renderer.xy.XYItemRendererState; 115 import org.jfree.chart.renderer.xy.XYItemRendererState;
116
117 import gnu.trove.TDoubleArrayList;
113 118
114 /** 119 /**
115 * A renderer for an {@link XYPlot} that highlights the differences between two 120 * A renderer for an {@link XYPlot} that highlights the differences between two
116 * series. The example shown here is generated by the 121 * series. The example shown here is generated by the
117 * <code>DifferenceChartDemo1.java</code> program included in the JFreeChart 122 * <code>DifferenceChartDemo1.java</code> program included in the JFreeChart
355 * 360 *
356 * @return The number of passes required by the renderer. 361 * @return The number of passes required by the renderer.
357 */ 362 */
358 public int getPassCount() { 363 public int getPassCount() {
359 return 2; 364 return 2;
365 }
366
367 public static List<XYDataset> splitByNaNs(XYDataset dataset) {
368 List<XYDataset> datasets = new ArrayList<XYDataset>();
369
370 switch (dataset.getSeriesCount()) {
371 case 0:
372 return datasets;
373 case 1:
374 int N = dataset.getItemCount(0);
375 TDoubleArrayList xs = new TDoubleArrayList(N);
376 TDoubleArrayList ys = new TDoubleArrayList(N);
377 for (int i = 0; i < N; ++i) {
378 double x = dataset.getXValue(0, i);
379 double y = dataset.getYValue(0, i);
380 if (Double.isNaN(x) || Double.isNaN(y)) {
381 if (!xs.isEmpty()) {
382 DefaultXYDataset ds = new DefaultXYDataset();
383 datasets.add(ds);
384 ds.addSeries(
385 dataset.getSeriesKey(0),
386 new double [][] {
387 xs.toNativeArray(),
388 ys.toNativeArray() });
389 xs.reset();
390 ys.reset();
391 }
392 }
393 else {
394 xs.add(x);
395 ys.add(y);
396 }
397 }
398 if (!xs.isEmpty()) {
399 DefaultXYDataset ds = new DefaultXYDataset();
400 datasets.add(ds);
401 ds.addSeries(
402 dataset.getSeriesKey(0),
403 new double [][] {
404 xs.toNativeArray(),
405 ys.toNativeArray() });
406 }
407 break;
408 default: // two or more
409 // TODO: split two parts
410 datasets.add(dataset);
411 break;
412 }
413
414 return datasets;
360 } 415 }
361 416
362 /** 417 /**
363 * Draws the visual representation of a single data item. 418 * Draws the visual representation of a single data item.
364 * 419 *
389 int item, 444 int item,
390 CrosshairState crosshairState, 445 CrosshairState crosshairState,
391 int pass) { 446 int pass) {
392 switch (pass) { 447 switch (pass) {
393 case 0: 448 case 0:
394 drawItemPass0(g2, dataArea, info, 449 for (XYDataset ds: splitByNaNs(dataset)) {
395 plot, domainAxis, rangeAxis, 450 drawItemPass0(g2, dataArea, info,
396 dataset, series, item, crosshairState); 451 plot, domainAxis, rangeAxis,
452 dataset, series, item, crosshairState);
453 }
397 break; 454 break;
398 case 1: 455 case 1:
399 drawItemPass1(g2, dataArea, info, 456 drawItemPass1(g2, dataArea, info,
400 plot, domainAxis, rangeAxis, 457 plot, domainAxis, rangeAxis,
401 dataset, series, item, crosshairState); 458 dataset, series, item, crosshairState);

http://dive4elements.wald.intevation.org