Mercurial > dive4elements > gnv-client
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 ) { |