comparison gnv-artifacts/src/main/java/de/intevation/gnv/state/profile/verticalcrosssection/OutputHelper.java @ 521:1bf058f1a2d1

Generate seabed polygon to "Profilschnitte". gnv-artifacts/trunk@615 c6561f87-3c4e-4783-a992-168aeb5c3f6f
author Sascha L. Teichmann <sascha.teichmann@intevation.de>
date Sun, 24 Jan 2010 20:24:03 +0000
parents
children c4156275c1e1
comparison
equal deleted inserted replaced
520:a8f6ca59b26e 521:1bf058f1a2d1
1 package de.intevation.gnv.state.profile.verticalcrosssection;
2
3 import de.intevation.gnv.jfreechart.CompactXYItems;
4 import de.intevation.gnv.jfreechart.PolygonSeries;
5
6 import de.intevation.gnv.math.Interpolation3D;
7
8 import gnu.trove.TDoubleArrayList;
9
10 import org.apache.log4j.Logger;
11
12 /**
13 * @author Sascha L. Teichmann (sascha.teichmann@intevation.de)
14 */
15 public class OutputHelper
16 {
17 private static Logger log = Logger.getLogger(OutputHelper.class);
18
19 public static final double EPS = 1e-5d;
20
21 private OutputHelper() {
22 }
23
24 public static PolygonSeries createSeabedPolygon(
25 Interpolation3D interpolation,
26 Integer fill
27 ) {
28 double maxDepth = interpolation.getMaxDepth();
29 double cellWidth = interpolation.getCellWidth();
30 double cellHeight = interpolation.getCellHeight();
31
32 double [] depths = interpolation.getDepths();
33
34 double x = 0d;
35
36 TDoubleArrayList vertices = new TDoubleArrayList();
37
38 PolygonSeries ps = new PolygonSeries();
39
40 for (int i = 0; i < depths.length; ++i, x += cellWidth) {
41 double depth = depths[i];
42
43 if (vertices.isEmpty()) {
44 if (Double.isNaN(depth) || depth == maxDepth) {
45 continue;
46 }
47 if (depth > 0d) depth = 0d;
48 vertices.add(x); vertices.add(maxDepth);
49 vertices.add(x); vertices.add(depth);
50 vertices.add(x+cellWidth); vertices.add(depth);
51 }
52 else { // in polygon
53 if (Double.isNaN(depth) || depth == maxDepth) {
54 vertices.add(x); vertices.add(maxDepth);
55 ps.addRing(new CompactXYItems(vertices.toNativeArray()));
56 vertices.reset();
57 }
58 else {
59 if (depth > 0d) depth = 0d;
60 int N = vertices.size();
61 if (N > 2 && Math.abs(depth - vertices.get(N-1)) < EPS) {
62 vertices.set(N-2, x+cellWidth);
63 }
64 else {
65 vertices.add(vertices.get(N-2)); vertices.add(depth);
66 vertices.add(x+cellWidth); vertices.add(depth);
67 }
68 }
69 }
70 } // for all depths
71
72 if (!vertices.isEmpty()) {
73 vertices.add(vertices.get(vertices.size()-2));
74 vertices.add(maxDepth);
75 ps.addRing(new CompactXYItems(vertices.toNativeArray()));
76 }
77
78 if (ps.getItemCount() == 0) {
79 return null;
80 }
81
82 ps.setAttribute("fill", fill);
83
84 return ps;
85 }
86 }
87 // vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :

http://dive4elements.wald.intevation.org