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