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 :

http://dive4elements.wald.intevation.org