Mercurial > dive4elements > river
comparison 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 |
comparison
equal
deleted
inserted
replaced
646:d299e220d89c | 647:bb484489d3df |
---|---|
1 package de.intevation.flys.exports; | |
2 | |
3 import java.awt.geom.AffineTransform; | |
4 import java.awt.geom.NoninvertibleTransformException; | |
5 import java.awt.geom.Rectangle2D; | |
6 | |
7 import org.w3c.dom.Document; | |
8 import org.w3c.dom.Element; | |
9 | |
10 import org.apache.log4j.Logger; | |
11 | |
12 import org.jfree.chart.ChartRenderingInfo; | |
13 import org.jfree.chart.JFreeChart; | |
14 import org.jfree.chart.plot.XYPlot; | |
15 import org.jfree.data.Range; | |
16 | |
17 import de.intevation.artifacts.common.ArtifactNamespaceContext; | |
18 import de.intevation.artifacts.common.utils.XMLUtils; | |
19 import de.intevation.artifacts.common.utils.XMLUtils.ElementCreator; | |
20 | |
21 | |
22 /** | |
23 * This class helps generating chart info documents. | |
24 * | |
25 * @author <a href="mailto:ingo.weinzierl@intevation.de">Ingo Weinzierl</a> | |
26 */ | |
27 public class InfoGeneratorHelper { | |
28 | |
29 private static final Logger logger = | |
30 Logger.getLogger(InfoGeneratorHelper.class); | |
31 | |
32 | |
33 private InfoGeneratorHelper() { | |
34 } | |
35 | |
36 | |
37 /** | |
38 * Triggers the creation of the chart info document. | |
39 * | |
40 * @param chart The JFreeChart chart. | |
41 * @param info An info object that has been created while chart creation. | |
42 * | |
43 * @return the info document. | |
44 */ | |
45 public static Document createInfoDocument( | |
46 JFreeChart chart, | |
47 ChartRenderingInfo info) | |
48 { | |
49 logger.debug("InfoGeneratorHelper.createInfoDocument"); | |
50 | |
51 Document doc = XMLUtils.newDocument(); | |
52 | |
53 ElementCreator cr = new ElementCreator( | |
54 doc, | |
55 ArtifactNamespaceContext.NAMESPACE_URI, | |
56 ArtifactNamespaceContext.NAMESPACE_PREFIX); | |
57 | |
58 Element chartinfo = cr.create("chartinfo"); | |
59 | |
60 chartinfo.appendChild(createTransformationElement(cr, chart, info)); | |
61 | |
62 doc.appendChild(chartinfo); | |
63 | |
64 return doc; | |
65 } | |
66 | |
67 | |
68 /** | |
69 * This method appends the values of a transformation matrix to transform | |
70 * image pixel coordinates into chart coordinates. | |
71 * | |
72 * @param cr The ElementCreator. | |
73 * @param chart The chart object. | |
74 * @param info The ChartRenderingInfo that is filled while chart creation. | |
75 * | |
76 * @return an element that contains one or more transformation matrix. | |
77 */ | |
78 protected static Element createTransformationElement( | |
79 ElementCreator cr, | |
80 JFreeChart chart, | |
81 ChartRenderingInfo info) | |
82 { | |
83 logger.debug("InfoGeneratorHelper.createTransformationElement"); | |
84 | |
85 Element tf = cr.create("transformation-matrix"); | |
86 | |
87 Rectangle2D dataArea = info.getPlotInfo().getDataArea(); | |
88 | |
89 XYPlot plot = (XYPlot) chart.getPlot(); | |
90 Range xRange = plot.getDomainAxis().getRange(); | |
91 Range yRange = plot.getRangeAxis().getRange(); | |
92 | |
93 double[] tm = createTransformationMatrix(dataArea, xRange, yRange); | |
94 | |
95 cr.addAttr(tf, "sx", String.valueOf(tm[0]), true); | |
96 cr.addAttr(tf, "sy", String.valueOf(tm[1]), true); | |
97 cr.addAttr(tf, "tx", String.valueOf(tm[2]), true); | |
98 cr.addAttr(tf, "ty", String.valueOf(tm[3]), true); | |
99 | |
100 return tf; | |
101 } | |
102 | |
103 | |
104 /** | |
105 * This method determines a transformation matrix to transform pixel | |
106 * coordinates of the chart image into chart coordinates. | |
107 * | |
108 * @param dataArea The rectangle that contains the data points of the chart. | |
109 * @param xRange The x axis range. | |
110 * @param yRange The y axis range. | |
111 * | |
112 * @return a double array as follows: [sx, sy, tx, ty]. | |
113 */ | |
114 protected static double[] createTransformationMatrix( | |
115 Rectangle2D dataArea, | |
116 Range xRange, | |
117 Range yRange) | |
118 { | |
119 double offsetX = dataArea.getX(); | |
120 double width = dataArea.getWidth() - 1; | |
121 double offsetY = dataArea.getY(); | |
122 double height = dataArea.getHeight(); | |
123 | |
124 double lowerX = xRange.getLowerBound(); | |
125 double upperX = xRange.getUpperBound(); | |
126 double lowerY = yRange.getLowerBound(); | |
127 double upperY = yRange.getUpperBound(); | |
128 | |
129 double dMoveX = upperX - lowerX; | |
130 double fMoveX = width * lowerX; | |
131 double dMoveY = lowerY - upperY; | |
132 double fMoveY = height * upperY; | |
133 | |
134 AffineTransform t1 = AffineTransform.getTranslateInstance( | |
135 offsetX - ( fMoveX / dMoveX ), | |
136 offsetY - ( fMoveY / dMoveY ) ); | |
137 | |
138 AffineTransform t2 = AffineTransform.getScaleInstance( | |
139 width / (upperX - lowerX), | |
140 height / (lowerY - upperY)); | |
141 | |
142 t1.concatenate(t2); | |
143 | |
144 try { | |
145 t1.invert(); | |
146 | |
147 double[] c = new double[6]; | |
148 t1.getMatrix(c); | |
149 | |
150 return new double[] { c[0], c[3], c[4], c[5] }; | |
151 } | |
152 catch (NoninvertibleTransformException e) { | |
153 // do nothing | |
154 logger.warn("Matrix is not invertible."); | |
155 } | |
156 | |
157 return new double[] { 1d, 1d, 0d, 0d }; | |
158 } | |
159 } | |
160 // vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 : |