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