diff gnv-artifacts/src/main/java/de/intevation/gnv/raster/Vectorizer.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 f42ed4f10b79
children 9a828e5a2390
line wrap: on
line diff
--- a/gnv-artifacts/src/main/java/de/intevation/gnv/raster/Vectorizer.java	Fri Jan 01 12:08:05 2010 +0000
+++ b/gnv-artifacts/src/main/java/de/intevation/gnv/raster/Vectorizer.java	Fri Jan 01 21:52:41 2010 +0000
@@ -84,6 +84,14 @@
             return length;
         }
 
+		public Edge head() {
+			Edge current = this;
+			while (current.prev != null) {
+				current = current.prev;
+			}
+			return current;
+		}
+
         public int hashCode() {
             return (a << 16) | b;
         }
@@ -96,9 +104,7 @@
 
     protected static Edge simplify(Edge edge, int width) {
 
-        Edge e1 = edge;
-        Edge e2 = edge.next;
-        Edge e3 = e2.next;
+        Edge e1 = edge, start = edge;
 
         int length = edge.length();
 
@@ -106,35 +112,42 @@
             return e1;
         }
 
+        Edge e2 = edge.next;
+
         int count = 0;
 
         do {
             int e1x = e1.a % width;
             int e1y = e1.a / width;
-            int e2x = e2.a % width;
-            int e2y = e2.a / width;
-            int e3x = e3.a % width;
-            int e3y = e3.a / width;
+            int e2x = e1.b % width;
+            int e2y = e1.b / width;
+            int e3x = e2.b % width;
+            int e3y = e2.b / width;
 
             if ((e1x == e2x && e2x == e3x && e1x == e3x)
-            ||  (e1y == e2y && e2y == e3y && e1y == e3y)) {
-                e1.next = e3;
-                e3.prev = e1;
-                e2 = e3;
-                e3 = e2.next;
+                    ||  (e1y == e2y && e2y == e3y && e1y == e3y)) {
+                e1.b = e2.b;
+                Edge removed = e1.next;
+                e1.next = e2.next;
+                if (e1.next != null) {
+                    e1.next.prev = e1;
+                }
+                e2 = e1.next;
                 count = 0;
                 --length;
+                if (removed == start) {
+                    start = e1;
+                }
             }
             else {
                 e1 = e1.next;
                 e2 = e2.next;
-                e3 = e3.next;
                 ++count;
             }
         }
-        while (length > 1 && count < length + 2);
+        while (length > 1 && e2 != null && count < length + 2);
 
-        return e1;
+        return start;
     }
 
     protected int []            raster;

http://dive4elements.wald.intevation.org