/* * GeoTools - The Open Source Java GIS Toolkit * http://geotools.org * * (C) 2001-2006 Vivid Solutions * (C) 2001-2008, Open Source Geospatial Foundation (OSGeo) * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; * version 2.1 of the License. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. */ package org.geotools.geometry.iso.topograph2D; import java.io.PrintStream; import java.util.ArrayList; import java.util.Collection; import java.util.Iterator; import java.util.Map; import java.util.TreeMap; /** * A map of nodes, indexed by the coordinate of the node * * * * @source $URL$ */ public class NodeMap { Map nodeMap = new TreeMap(); NodeFactory nodeFact; public NodeMap(NodeFactory nodeFact) { this.nodeFact = nodeFact; } /** * Factory function - subclasses can override to create their own types of * nodes */ /* * protected Node createNode(Coordinate coord) { return new Node(coord); } */ /** * This method expects that a node has a coordinate value. */ public Node addNode(Coordinate coord) { Node node = (Node) nodeMap.get(coord); if (node == null) { node = nodeFact.createNode(coord); nodeMap.put(coord, node); } return node; } public Node addNode(Node n) { Node node = (Node) nodeMap.get(n.getCoordinate()); if (node == null) { nodeMap.put(n.getCoordinate(), n); return n; } node.mergeLabel(n); return node; } /** * Adds a node for the start point of this EdgeEnd (if one does not already * exist in this map). Adds the EdgeEnd to the (possibly new) node. */ public void add(EdgeEnd e) { Coordinate p = e.getCoordinate(); Node n = addNode(p); n.add(e); } /** * @return the node if found; null otherwise */ public Node find(Coordinate coord) { return (Node) nodeMap.get(coord); } public Iterator iterator() { return nodeMap.values().iterator(); } public Collection values() { return nodeMap.values(); } public Collection getBoundaryNodes(int geomIndex) { Collection bdyNodes = new ArrayList(); for (Iterator i = iterator(); i.hasNext();) { Node node = (Node) i.next(); if (node.getLabel().getLocation(geomIndex) == Location.BOUNDARY) bdyNodes.add(node); } return bdyNodes; } public void print(PrintStream out) { for (Iterator it = iterator(); it.hasNext();) { Node n = (Node) it.next(); n.print(out); } } }