Mercurial > dive4elements > river
view flys-artifacts/src/main/java/de/intevation/flys/exports/InfoGeneratorHelper.java @ 647:bb484489d3df
Introduced a new output generators for creating chart info documents.
flys-artifacts/trunk@2032 c6561f87-3c4e-4783-a992-168aeb5c3f6f
author | Ingo Weinzierl <ingo.weinzierl@intevation.de> |
---|---|
date | Wed, 01 Jun 2011 08:01:07 +0000 |
parents | |
children | d4c4fefb095b |
line wrap: on
line source
package de.intevation.flys.exports; import java.awt.geom.AffineTransform; import java.awt.geom.NoninvertibleTransformException; import java.awt.geom.Rectangle2D; import org.w3c.dom.Document; import org.w3c.dom.Element; import org.apache.log4j.Logger; import org.jfree.chart.ChartRenderingInfo; import org.jfree.chart.JFreeChart; import org.jfree.chart.plot.XYPlot; import org.jfree.data.Range; import de.intevation.artifacts.common.ArtifactNamespaceContext; import de.intevation.artifacts.common.utils.XMLUtils; import de.intevation.artifacts.common.utils.XMLUtils.ElementCreator; /** * This class helps generating chart info documents. * * @author <a href="mailto:ingo.weinzierl@intevation.de">Ingo Weinzierl</a> */ public class InfoGeneratorHelper { private static final Logger logger = Logger.getLogger(InfoGeneratorHelper.class); private InfoGeneratorHelper() { } /** * Triggers the creation of the chart info document. * * @param chart The JFreeChart chart. * @param info An info object that has been created while chart creation. * * @return the info document. */ public static Document createInfoDocument( JFreeChart chart, ChartRenderingInfo info) { logger.debug("InfoGeneratorHelper.createInfoDocument"); Document doc = XMLUtils.newDocument(); ElementCreator cr = new ElementCreator( doc, ArtifactNamespaceContext.NAMESPACE_URI, ArtifactNamespaceContext.NAMESPACE_PREFIX); Element chartinfo = cr.create("chartinfo"); chartinfo.appendChild(createTransformationElement(cr, chart, info)); doc.appendChild(chartinfo); return doc; } /** * This method appends the values of a transformation matrix to transform * image pixel coordinates into chart coordinates. * * @param cr The ElementCreator. * @param chart The chart object. * @param info The ChartRenderingInfo that is filled while chart creation. * * @return an element that contains one or more transformation matrix. */ protected static Element createTransformationElement( ElementCreator cr, JFreeChart chart, ChartRenderingInfo info) { logger.debug("InfoGeneratorHelper.createTransformationElement"); Element tf = cr.create("transformation-matrix"); Rectangle2D dataArea = info.getPlotInfo().getDataArea(); XYPlot plot = (XYPlot) chart.getPlot(); Range xRange = plot.getDomainAxis().getRange(); Range yRange = plot.getRangeAxis().getRange(); double[] tm = createTransformationMatrix(dataArea, xRange, yRange); cr.addAttr(tf, "sx", String.valueOf(tm[0]), true); cr.addAttr(tf, "sy", String.valueOf(tm[1]), true); cr.addAttr(tf, "tx", String.valueOf(tm[2]), true); cr.addAttr(tf, "ty", String.valueOf(tm[3]), true); return tf; } /** * This method determines a transformation matrix to transform pixel * coordinates of the chart image into chart coordinates. * * @param dataArea The rectangle that contains the data points of the chart. * @param xRange The x axis range. * @param yRange The y axis range. * * @return a double array as follows: [sx, sy, tx, ty]. */ protected static double[] createTransformationMatrix( Rectangle2D dataArea, Range xRange, Range yRange) { double offsetX = dataArea.getX(); double width = dataArea.getWidth() - 1; double offsetY = dataArea.getY(); double height = dataArea.getHeight(); double lowerX = xRange.getLowerBound(); double upperX = xRange.getUpperBound(); double lowerY = yRange.getLowerBound(); double upperY = yRange.getUpperBound(); double dMoveX = upperX - lowerX; double fMoveX = width * lowerX; double dMoveY = lowerY - upperY; double fMoveY = height * upperY; AffineTransform t1 = AffineTransform.getTranslateInstance( offsetX - ( fMoveX / dMoveX ), offsetY - ( fMoveY / dMoveY ) ); AffineTransform t2 = AffineTransform.getScaleInstance( width / (upperX - lowerX), height / (lowerY - upperY)); t1.concatenate(t2); try { t1.invert(); double[] c = new double[6]; t1.getMatrix(c); return new double[] { c[0], c[3], c[4], c[5] }; } catch (NoninvertibleTransformException e) { // do nothing logger.warn("Matrix is not invertible."); } return new double[] { 1d, 1d, 0d, 0d }; } } // vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :