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