comparison gnv-artifacts/src/main/java/de/intevation/gnv/math/Interpolation2D.java @ 501:70adafe2b9d5

Speed up the "Horizontalschnitte" gnv-artifacts/trunk@584 c6561f87-3c4e-4783-a992-168aeb5c3f6f
author Sascha L. Teichmann <sascha.teichmann@intevation.de>
date Wed, 20 Jan 2010 14:47:30 +0000
parents ab29e4ff2fda
children d9d933e06875
comparison
equal deleted inserted replaced
500:ca5162aa644d 501:70adafe2b9d5
1 package de.intevation.gnv.math; 1 package de.intevation.gnv.math;
2
3 import java.util.ArrayList;
4 import java.util.List;
5 import java.util.HashMap;
6 import java.util.Collections;
7 2
8 import com.vividsolutions.jts.geom.Coordinate; 3 import com.vividsolutions.jts.geom.Coordinate;
9 import com.vividsolutions.jts.geom.Envelope; 4 import com.vividsolutions.jts.geom.Envelope;
10 5
11 import com.vividsolutions.jts.index.quadtree.Quadtree; 6 import com.vividsolutions.jts.index.quadtree.Quadtree;
12 7
8 import gnu.trove.TDoubleArrayList;
9
10 import java.util.ArrayList;
11 import java.util.Collections;
12 import java.util.HashMap;
13 import java.util.List;
14
15 import org.apache.commons.math.stat.descriptive.moment.Mean;
16 import org.apache.commons.math.stat.descriptive.moment.StandardDeviation;
17
13 import org.apache.log4j.Logger; 18 import org.apache.log4j.Logger;
14 19
15 /** 20 /**
16 * @author Sascha L. Teichmann 21 * @author Sascha L. Teichmann (sascha.teichmann@intevation.de)
17 */ 22 */
18 public final class Interpolation2D 23 public final class Interpolation2D
19 { 24 {
20 private static Logger log = Logger.getLogger(Interpolation2D.class); 25 private static Logger log = Logger.getLogger(Interpolation2D.class);
21 26
22 public interface Consumer { 27 public interface Consumer {
23 void interpolated(Coordinate point, boolean success); 28 void interpolated(Coordinate point, boolean success);
24 } // interface Consumer 29 } // interface Consumer
25 30
26 private Interpolation2D() { 31 private Interpolation2D() {
32 }
33
34 private static final double dist(double a, double b) {
35 a -= b;
36 return Math.sqrt(a*a);
37 }
38
39 private static final double OUTLIER_EPS = 0.4d;
40
41 public static final double [] calculateBufferRemoveOutlier(
42 List <? extends Point2d> points
43 ) {
44 HashMap<Integer, ArrayList<Point2d>> iMap =
45 new HashMap<Integer, ArrayList<Point2d>>();
46
47 HashMap<Integer, ArrayList<Point2d>> jMap =
48 new HashMap<Integer, ArrayList<Point2d>>();
49
50 for (int k = points.size()-1; k >= 0; --k) {
51 Point2d p = points.get(k);
52
53 ArrayList<Point2d> jList = jMap.get(p.j);
54 ArrayList<Point2d> iList = iMap.get(p.i);
55
56 if (jList == null) {
57 jMap.put(p.j, jList = new ArrayList<Point2d>());
58 }
59 jList.add(p);
60
61 if (iList == null) {
62 iMap.put(p.i, iList = new ArrayList<Point2d>());
63 }
64 iList.add(p);
65 }
66
67 TDoubleArrayList deltas = new TDoubleArrayList();
68
69 Mean mean = new Mean();
70 StandardDeviation sd = new StandardDeviation();
71
72 for (ArrayList<Point2d> v: jMap.values()) {
73 Collections.sort(v, Point2d.Y_COMPARATOR);
74 for (int i = 1, L = v.size(); i < L; ++i) {
75 double dy = Math.abs(v.get(i).y - v.get(i-1).y);
76 deltas.add(dy);
77 mean.increment(dy);
78 sd .increment(dy);
79 }
80 }
81
82 deltas.sort();
83
84 double m = mean.getResult();
85 double s = sd .getResult();
86 double eps = OUTLIER_EPS*s;
87
88 int yi = deltas.size() - 1;
89 while (yi > 0 && dist(deltas.get(yi), m) > eps) {
90 --yi;
91 }
92
93 double dyMax = deltas.get(yi) + 1e-5d;
94
95 if (log.isDebugEnabled()) {
96 log.debug("mean y: " + m);
97 log.debug("sigma y: " + s);
98 }
99
100 deltas.reset();
101 mean.clear();
102 sd .clear();
103
104 for (ArrayList<Point2d> v: iMap.values()) {
105 Collections.sort(v, Point2d.X_COMPARATOR);
106 for (int i = 1, L = v.size(); i < L; ++i) {
107 double dx = Math.abs(v.get(i).x - v.get(i-1).x);
108 deltas.add(dx);
109 mean.increment(dx);
110 sd .increment(dx);
111 }
112 }
113
114 deltas.sort();
115
116 m = mean.getResult();
117 s = sd .getResult();
118 eps = OUTLIER_EPS*s;
119
120 int xi = deltas.size() - 1;
121
122 while (xi > 0 && dist(deltas.get(xi), m) > eps) {
123 --xi;
124 }
125
126 double dxMax = deltas.get(xi) + 1e-5d;
127
128 if (log.isDebugEnabled()) {
129 log.debug("mean y: " + m);
130 log.debug("sigma y: " + s);
131 }
132
133 return new double [] { dxMax, dyMax };
27 } 134 }
28 135
29 public static final double [] calculateBuffer( 136 public static final double [] calculateBuffer(
30 List <? extends Point2d> points 137 List <? extends Point2d> points
31 ) { 138 ) {

http://dive4elements.wald.intevation.org