view flys-artifacts/src/main/java/de/intevation/flys/exports/StyledSeriesBuilder.java @ 4255:670e98f5a441

Fixed leak while merging facets. The ThemeList that is used by OutputHelper to sort the Facets for an Output now uses a list to store the ManagedFacets. The correct order is made up by sorting the List using Collections.sort() function of the Java JDK. Therfore, the ManagedFacet class implements the Comparable interface. The return value of its compareTo(other) method depends on the value of the 'position' field.
author Ingo Weinzierl <weinzierl.ingo@googlemail.com>
date Thu, 25 Oct 2012 14:01:46 +0200
parents 2a8919e0ed28
children e62f70c2213d
line wrap: on
line source
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 dataset with an offset (shift all points by given amount).
     * @param series series to add data to.
     * @param wkms WKms of which the Ws will be shifted.
     * @param off the offset.
     */
    public static void addUpperBand(XYSeries series, WKms wkms, double off) {
        if (wkms == null) {
            return;
        }

        int size = wkms.size();

        for (int i = 0; i < size; i++) {
            series.add(wkms.getKm(i), wkms.getW(i)+off, false);
        }
    }


    /**
     * Add points to dataset with an offset (shift all points 'down' by given
     * amount).
     * @param series series to add data to.
     * @param wkms WKms of which the Ws will be shifted.
     * @param off the offset.
     */
    public static void addLowerBand(XYSeries series, WKms wkms, double off) {
        addUpperBand(series, wkms, -off);
    }


    /**
     * 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 :

http://dive4elements.wald.intevation.org