diff gnv-artifacts/src/main/java/de/intevation/gnv/raster/IsoPolygonSeriesProducer.java @ 447:92b7ccbf6163

Improved generation of iso lines in vertical cross section. gnv-artifacts/trunk@495 c6561f87-3c4e-4783-a992-168aeb5c3f6f
author Sascha L. Teichmann <sascha.teichmann@intevation.de>
date Fri, 01 Jan 2010 21:52:41 +0000
parents eb2ac62e853a
children 3cb2bea50456
line wrap: on
line diff
--- a/gnv-artifacts/src/main/java/de/intevation/gnv/raster/IsoPolygonSeriesProducer.java	Fri Jan 01 12:08:05 2010 +0000
+++ b/gnv-artifacts/src/main/java/de/intevation/gnv/raster/IsoPolygonSeriesProducer.java	Fri Jan 01 21:52:41 2010 +0000
@@ -6,9 +6,12 @@
 import java.util.ArrayList;
 import java.util.Collection;
 
+import org.apache.log4j.Logger;
+
+import gnu.trove.TIntHashSet;
 import gnu.trove.TIntObjectHashMap;
 import gnu.trove.TDoubleArrayList;
-import gnu.trove.TIntObjectIterator;
+import gnu.trove.TObjectProcedure;
 
 import de.intevation.gnv.raster.Vectorizer.RingsHandler;
 import de.intevation.gnv.raster.Vectorizer.Edge;
@@ -24,6 +27,11 @@
 public class IsoPolygonSeriesProducer
 implements   RingsHandler
 {
+	private static Logger log = Logger.getLogger(
+		IsoPolygonSeriesProducer.class);
+
+	public static final Float LINE_WIDTH = Float.valueOf(0.1f);
+
     public interface LabelGenerator {
 
         String generateLabel(int neighbor1, int neighbor2);
@@ -132,6 +140,7 @@
     public Collection<PolygonSeries> getSeries(LabelGenerator labelGenerator) {
 
         ArrayList<PolygonSeries> series = new ArrayList<PolygonSeries>();
+
         double b1 = minX;
         double m1 = width != 1
             ? (maxX - minX)/(width-1)
@@ -155,13 +164,6 @@
 
         for (IJKey key: pairs) {
             PolygonSeries ps = new PolygonSeries();
-            series.add(ps);
-
-            if (labelGenerator != null) {
-                ps.setAttribute(
-                    "label",
-                    labelGenerator.generateLabel(key.i, key.j));
-            }
 
             // process complete
             ArrayList<Edge> completeList = complete.get(key);
@@ -173,7 +175,9 @@
                         vertices.add(m2*(current.a / width) + b2);
                     }
                     while ((current = current.next) != head);
-                    // TODO: Do we need to copy b of the tail?
+                    // add head again to close shape
+                    vertices.add(m1*(head.a % width) + b1);
+                    vertices.add(m2*(head.a / width) + b2);
                     ps.addRing(new CompactXYItems(vertices.toNativeArray()));
                     vertices.clear();
                 }
@@ -181,16 +185,22 @@
 
             // process open
             TIntObjectHashMap map = commonOpen.get(key);
+
             if (map != null) {
-                for (TIntObjectIterator it = map.iterator(); it.hasNext();) {
-                    it.advance();
-                    int  k    = it.key();
-                    Edge head = (Edge)it.value();
-                    // ignore tails
-                    if ((head.next == null && head.prev != null)
-                    ||  (head.next == null && head.prev == null && head.b == k)) {
-                        continue;
-                    }
+				final ArrayList<Edge> headList = new ArrayList<Edge>();
+				map.forEachValue(new TObjectProcedure() {
+					TIntHashSet headSet = new TIntHashSet();
+					public boolean execute(Object value) {
+						Edge head = ((Edge)value).head();
+						if (headSet.add(head.a)) {
+							headList.add(head);
+						}
+						return true;
+					}
+				});
+
+                for (Edge head: headList) {
+
                     head = Vectorizer.simplify(head, width);
                     Edge current = head, last = head;
                     do {
@@ -206,6 +216,18 @@
                     vertices.clear();
                 } // for all in common open
             } // if map defined for key
+
+			int itemCount = ps.getItemCount();
+
+			if (itemCount > 0) {
+				series.add(ps);
+				if (labelGenerator != null) {
+					ps.setAttribute(
+						"label",
+						labelGenerator.generateLabel(key.i, key.j));
+				}
+				ps.setAttribute("line.width", LINE_WIDTH);
+			}
         } // for all pairs
 
         return series;

http://dive4elements.wald.intevation.org