Mercurial > dive4elements > river
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); |