Mercurial > dive4elements > river
diff flys-artifacts/src/main/java/de/intevation/flys/exports/StyledSeriesBuilder.java @ 3318:dbe2f85bf160
merged flys-artifacts/2.8
author | Thomas Arendsen Hein <thomas@intevation.de> |
---|---|
date | Fri, 28 Sep 2012 12:14:35 +0200 |
parents | d9af29a4bb85 |
children | f091f2f55f88 |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/flys-artifacts/src/main/java/de/intevation/flys/exports/StyledSeriesBuilder.java Fri Sep 28 12:14:35 2012 +0200 @@ -0,0 +1,189 @@ +package de.intevation.flys.exports; + +import org.apache.log4j.Logger; + +import org.jfree.data.xy.XYSeries; + +import de.intevation.flys.artifacts.model.WKms; +import de.intevation.flys.artifacts.model.WQKms; +import de.intevation.flys.artifacts.model.WWQQ; + +/** + * Helper to create and modify StyledXYSeries. + */ +public class StyledSeriesBuilder { + + /** + * JFreeChart and the area calculation will fail if we use Double.INFINITY + * or Double.MAX_VALUE (probably because these are really used in + * calculations). We define and use a more handy value instead. + */ + final static double BIG_DOUBLE_VALUE = 1234567d; + + private static final Logger logger = Logger.getLogger + (StyledSeriesBuilder.class); + + + /** + * Trivial, hidden constructor. + */ + private StyledSeriesBuilder() { + } + + + /** + * Add points to series. + * + * @param series Series to add points to. + * @param points Points to add to series, points[0] to 1st dim, points[1] + * to 2nd dim. + * @param skipNANs if true, skip NAN values in points parameter. + */ + public static void addPoints(XYSeries series, double[][] points, boolean skipNANs) { + if (points == null || points.length <= 1) { + return; + } + double [] xPoints = points[0]; + double [] yPoints = points[1]; + for (int i = 0; i < xPoints.length; i++) { + if (skipNANs && + (Double.isNaN(xPoints[i]) || Double.isNaN(yPoints[i]))) { + logger.warn ("Skipping NaN in StyledSeriesBuilder."); + continue; + } + series.add(xPoints[i], yPoints[i], false); + } + } + + + /** + * Add points to series (km to 1st dim, w to 2nd dim). + * + * @param series Series to add points to. + * @param wkms WKms to add to series. + */ + public static void addPoints(XYSeries series, WKms wkms) { + if (wkms == null) { + return; + } + + int size = wkms.size(); + + for (int i = 0; i < size; i++) { + series.add(wkms.getKm(i), wkms.getW(i), false); + } + } + + + /** + * Add points to series (km to 1st dim, q to 2nd dim). + * + * @param series Series to add points to. + * @param wqkms WQKms to add to series. + */ + public static void addPointsKmQ(XYSeries series, WQKms wqkms) { + if (wqkms == null) { + return; + } + + int size = wqkms.size(); + + for (int i = 0; i < size; i++) { + series.add(wqkms.getKm(i), wqkms.getQ(i), false); + } + } + + + /** + * Add points to series (km to 1st dim, q to 2nd dim), adding points + * to achieve a step-like curve. + * + * @param series Series to add points to. + * @param wqkms WQKms to add to series. + */ + public static void addStepPointsKmQ(XYSeries series, WQKms wqkms) { + if (wqkms == null) { + return; + } + + int size = wqkms.size(); + + for (int i = 0; i < size; i++) { + if (i==0) { + series.add(wqkms.getKm(i), wqkms.getQ(i), false); + } + else { + //Add two points. + double halveX = (wqkms.getKm(i-1) + wqkms.getKm(i)) / 2d; + series.add(halveX, wqkms.getQ(i-1)); + series.add(halveX, wqkms.getQ(i)); + } + if (i == size-1) { + series.add(wqkms.getKm(i), wqkms.getQ(i), false); + } + } + } + + + /** + * Add points to series (q to 1st dim, w to 2nd dim). + * + * @param series Series to add points to. + * @param wqkms WQKms to add to series. + */ + public static void addPointsQW(XYSeries series, WQKms wqkms) { + if (wqkms == null) { + return; + } + + int size = wqkms.size(); + + for (int i = 0; i < size; i++) { + series.add(wqkms.getQ(i), wqkms.getW(i)); + } + } + + + /** + * Add points to series (q to 1st dim, w to 2nd dim). + * + * @param series Series to add points to. + * @param wwqq WWQQ to add to series. + */ + public static void addPoints(XYSeries series, WWQQ wwqq) { + if (wwqq == null) { + return; + } + + int size = wwqq.size(); + + for (int i = 0; i < size; i++) { + series.add(wwqq.getW1(i), wwqq.getW2(i)); + } + } + + + /** + * Create a Series such that an infinitely big area can be filled + * between the newly created and the given series. + */ + public static XYSeries createGroundAtInfinity(XYSeries series) { + XYSeries ground = new XYSeries(series.getKey() + /** TODO rand + */ "INF"); + ground.add(series.getMinX(), -BIG_DOUBLE_VALUE); + ground.add(series.getMaxX(), -BIG_DOUBLE_VALUE); + return ground; + } + + + /** + * Create a Series such that an infinitely big area can be filled + * between the newly created and the given series. + */ + public static XYSeries createCeilingAtInfinity(XYSeries series) { + XYSeries ground = new XYSeries(series.getKey() + /** TODO rand + */ "INF"); + ground.add(series.getMinX(), BIG_DOUBLE_VALUE); + ground.add(series.getMaxX(), BIG_DOUBLE_VALUE); + return ground; + } +} +// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :