Mercurial > dive4elements > river
comparison flys-artifacts/src/main/java/de/intevation/flys/exports/EnhancedLineAndShapeRenderer.java @ 2073:27ada2e4243d
Performance improvements for EnhancedLineAndShapeRenderer: buffer minimum and maximum for each series.
flys-artifacts/trunk@3584 c6561f87-3c4e-4783-a992-168aeb5c3f6f
author | Ingo Weinzierl <ingo.weinzierl@intevation.de> |
---|---|
date | Wed, 04 Jan 2012 14:25:10 +0000 |
parents | 4cdd9c4896f6 |
children |
comparison
equal
deleted
inserted
replaced
2072:4cdd9c4896f6 | 2073:27ada2e4243d |
---|---|
1 package de.intevation.flys.exports; | 1 package de.intevation.flys.exports; |
2 | 2 |
3 import java.awt.Graphics2D; | 3 import java.awt.Graphics2D; |
4 import java.awt.Shape; | 4 import java.awt.Shape; |
5 import java.awt.geom.Rectangle2D; | 5 import java.awt.geom.Rectangle2D; |
6 import java.util.HashMap; | |
7 import java.util.Map; | |
6 | 8 |
7 import org.apache.log4j.Logger; | 9 import org.apache.log4j.Logger; |
8 | 10 |
9 import org.jfree.chart.axis.ValueAxis; | 11 import org.jfree.chart.axis.ValueAxis; |
10 import org.jfree.chart.entity.EntityCollection; | 12 import org.jfree.chart.entity.EntityCollection; |
24 Logger.getLogger(EnhancedLineAndShapeRenderer.class); | 26 Logger.getLogger(EnhancedLineAndShapeRenderer.class); |
25 | 27 |
26 protected BooleanList isMinimumShapeVisible; | 28 protected BooleanList isMinimumShapeVisible; |
27 protected BooleanList isMaximumShapeVisible; | 29 protected BooleanList isMaximumShapeVisible; |
28 | 30 |
31 protected Map<Integer, Double> seriesMinimum; | |
32 protected Map<Integer, Double> seriesMaximum; | |
33 | |
29 | 34 |
30 public EnhancedLineAndShapeRenderer(boolean lines, boolean shapes) { | 35 public EnhancedLineAndShapeRenderer(boolean lines, boolean shapes) { |
31 super(lines, shapes); | 36 super(lines, shapes); |
32 this.isMinimumShapeVisible = new BooleanList(); | 37 this.isMinimumShapeVisible = new BooleanList(); |
33 this.isMaximumShapeVisible = new BooleanList(); | 38 this.isMaximumShapeVisible = new BooleanList(); |
39 this.seriesMinimum = new HashMap<Integer, Double>(); | |
40 this.seriesMaximum = new HashMap<Integer, Double>(); | |
34 } | 41 } |
35 | 42 |
36 | 43 |
37 public boolean getItemShapeVisible(XYDataset dataset, int series, int item){ | 44 public boolean getItemShapeVisible(XYDataset dataset, int series, int item){ |
38 if (super.getItemShapeVisible(series, item)) { | 45 if (super.getItemShapeVisible(series, item)) { |
39 logger.debug("Items are visible."); | |
40 return true; | 46 return true; |
41 } | 47 } |
42 | 48 |
43 if (isMinimumShapeVisible(series) && isMinimum(dataset, series, item)) { | 49 if (isMinimumShapeVisible(series) && isMinimum(dataset, series, item)) { |
44 logger.debug("Minimum is visible for series: " + series); | |
45 return true; | 50 return true; |
46 } | 51 } |
47 | 52 |
48 if (isMaximumShapeVisible(series) && isMaximum(dataset, series, item)) { | 53 if (isMaximumShapeVisible(series) && isMaximum(dataset, series, item)) { |
49 logger.debug("Maximum is visible for series: " + series); | |
50 return true; | 54 return true; |
51 } | 55 } |
52 | |
53 logger.debug("Nothing is visible at all."); | |
54 | 56 |
55 return false; | 57 return false; |
56 } | 58 } |
57 | 59 |
58 | 60 |
73 Rectangle2D dataArea, | 75 Rectangle2D dataArea, |
74 ValueAxis rangeAxis, | 76 ValueAxis rangeAxis, |
75 CrosshairState crosshairState, | 77 CrosshairState crosshairState, |
76 EntityCollection entities | 78 EntityCollection entities |
77 ) { | 79 ) { |
78 logger.debug("Draw secondary pass"); | |
79 Shape entityArea = null; | 80 Shape entityArea = null; |
80 | 81 |
81 // get the data point... | 82 // get the data point... |
82 double x1 = dataset.getXValue(series, item); | 83 double x1 = dataset.getXValue(series, item); |
83 double y1 = dataset.getYValue(series, item); | 84 double y1 = dataset.getYValue(series, item); |
169 public boolean isMaximumShapeVisible(int series) { | 170 public boolean isMaximumShapeVisible(int series) { |
170 return isMaximumShapeVisible.getBoolean(series); | 171 return isMaximumShapeVisible.getBoolean(series); |
171 } | 172 } |
172 | 173 |
173 | 174 |
174 public static boolean isMinimum(XYDataset dataset, int series, int item) { | 175 public boolean isMinimum(XYDataset dataset, int series, int item) { |
175 return dataset.getYValue(series, item) == getMinimum(dataset, series); | 176 return dataset.getYValue(series, item) == getMinimum(dataset, series); |
176 } | 177 } |
177 | 178 |
178 | 179 |
179 public static double getMinimum(XYDataset dataset, int series) { | 180 public double getMinimum(XYDataset dataset, int series) { |
181 Integer key = Integer.valueOf(series); | |
182 Double old = seriesMinimum.get(Integer.valueOf(series)); | |
183 | |
184 if (old != null) { | |
185 return old.doubleValue(); | |
186 } | |
187 | |
188 logger.debug("Compute minimum of Series: " + series); | |
189 | |
180 double min = Double.MAX_VALUE; | 190 double min = Double.MAX_VALUE; |
181 | 191 |
182 for (int i = 0, n = dataset.getItemCount(series); i < n; i++) { | 192 for (int i = 0, n = dataset.getItemCount(series); i < n; i++) { |
183 double tmpValue = dataset.getYValue(series, i); | 193 double tmpValue = dataset.getYValue(series, i); |
184 | 194 |
185 if (tmpValue < min) { | 195 if (tmpValue < min) { |
186 min = tmpValue; | 196 min = tmpValue; |
187 } | 197 } |
188 } | 198 } |
189 | 199 |
200 seriesMinimum.put(key, Double.valueOf(min)); | |
201 | |
190 return min; | 202 return min; |
191 } | 203 } |
192 | 204 |
193 | 205 |
194 public static boolean isMaximum(XYDataset dataset, int series, int item) { | 206 public boolean isMaximum(XYDataset dataset, int series, int item) { |
195 return dataset.getYValue(series, item) == getMaximum(dataset, series); | 207 return dataset.getYValue(series, item) == getMaximum(dataset, series); |
196 } | 208 } |
197 | 209 |
198 | 210 |
199 public static double getMaximum(XYDataset dataset, int series) { | 211 public double getMaximum(XYDataset dataset, int series) { |
212 Integer key = Integer.valueOf(series); | |
213 Double old = seriesMaximum.get(Integer.valueOf(series)); | |
214 | |
215 if (old != null) { | |
216 return old.doubleValue(); | |
217 } | |
218 | |
219 logger.debug("Compute maximum of Series: " + series); | |
220 | |
200 double max = -Double.MAX_VALUE; | 221 double max = -Double.MAX_VALUE; |
201 | 222 |
202 for (int i = 0, n = dataset.getItemCount(series); i < n; i++) { | 223 for (int i = 0, n = dataset.getItemCount(series); i < n; i++) { |
203 double tmpValue = dataset.getYValue(series, i); | 224 double tmpValue = dataset.getYValue(series, i); |
204 | 225 |
205 if (tmpValue > max) { | 226 if (tmpValue > max) { |
206 max = tmpValue; | 227 max = tmpValue; |
207 } | 228 } |
208 } | 229 } |
209 | 230 |
231 seriesMaximum.put(key, Double.valueOf(max)); | |
232 | |
210 return max; | 233 return max; |
211 } | 234 } |
212 } | 235 } |
213 // vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 : | 236 // vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 : |