Mercurial > dive4elements > gnv-client
diff gnv-artifacts/src/main/java/de/intevation/gnv/raster/IsoProducer.java @ 657:af3f56758f59
merged gnv-artifacts/0.5
author | Thomas Arendsen Hein <thomas@intevation.de> |
---|---|
date | Fri, 28 Sep 2012 12:13:53 +0200 |
parents | f7038820df2e |
children | 9a828e5a2390 |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gnv-artifacts/src/main/java/de/intevation/gnv/raster/IsoProducer.java Fri Sep 28 12:13:53 2012 +0200 @@ -0,0 +1,143 @@ +package de.intevation.gnv.raster; + +import java.util.List; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.HashSet; + +import gnu.trove.TIntObjectHashMap; +import gnu.trove.TIntHashSet; +import gnu.trove.TObjectProcedure; + +import de.intevation.gnv.math.IJKey; + +import de.intevation.gnv.raster.Vectorizer.Edge; + +/** + * @author Sascha L. Teichmann (sascha.teichmann@intevation.de) + */ +public class IsoProducer +extends AbstractProducer +{ + public interface AttributeGenerator { + + Object generateAttribute(int neighbor1, int neighbor2); + + } // interface AttributeGenerator + + protected HashMap<Edge, Integer> open; + protected HashMap<IJKey, TIntObjectHashMap> commonOpen; + protected HashMap<IJKey, ArrayList<Edge>> complete; + + protected int width; + protected int height; + + public IsoProducer( + double minX, double minY, + double maxX, double maxY + ) { + super(minX, minY, maxX, maxY); + + open = new HashMap<Edge, Integer>(); + commonOpen = new HashMap<IJKey, TIntObjectHashMap>(); + complete = new HashMap<IJKey, ArrayList<Edge>>(); + } + + public void handleRings( + List<Edge> rings, + int value, + int width, + int height + ) { + if (value == -1) { + return; + } + this.width = width; + this.height = height; + + Integer v = Integer.valueOf(value); + + for (Edge head: rings) { + Edge current = head; + do { + Integer neighbor = open.remove(current); + + if (neighbor != null) { + IJKey pair = new IJKey(value, neighbor.intValue()); + pair.sort(); + + TIntObjectHashMap co = commonOpen.get(pair); + + if (co == null) { + commonOpen.put(pair, co = new TIntObjectHashMap()); + } + + Edge edge = new Edge(current); + + Edge otherA = (Edge)co.remove(edge.a); + if (otherA != null) { + otherA.chain(edge, edge.a); + } + + Edge otherB = (Edge)co.remove(edge.b); + if (otherB != null) { + otherB.chain(edge, edge.b); + } + + if (edge.isComplete()) { + ArrayList list = complete.get(pair); + if (list == null) { + complete.put(pair, list = new ArrayList()); + } + list.add(Vectorizer.simplify(edge, width)); + } + else { + if (otherA == null) { + co.put(edge.a, edge); + } + if (otherB == null) { + co.put(edge.b, edge); + } + } + } + else { + Edge edge = new Edge(current.b, current.a); + open.put(edge, v); + } + + current = current.next; + } + while (current != head); + } // for all rings + + } // handleRings + + protected HashSet<IJKey> joinPairs() { + HashSet<IJKey> pairs = new HashSet<IJKey>(); + pairs.addAll(complete .keySet()); + pairs.addAll(commonOpen.keySet()); + return pairs; + } + + protected static ArrayList<Edge> headList(TIntObjectHashMap map) { + 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; + } + }); + return headList; + } + + public void clear() { + open.clear(); + complete.clear(); + commonOpen.clear(); + } +} +// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :