/*
* The JTS Topology Suite is a collection of Java classes that
* implement the fundamental operations required to validate a given
* geo-spatial data set to a known topological specification.
*
* Copyright (C) 2001 Vivid Solutions
*
* 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; either
* version 2.1 of the License, or (at your option) any later version.
*
* 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.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*
* For more information, contact:
*
* Vivid Solutions
* Suite #1A
* 2328 Government Street
* Victoria BC V8T 5G5
* Canada
*
* (250)385-6040
* www.vividsolutions.com
*/
package com.revolsys.geometry.geomgraph;
import java.io.PrintStream;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;
import java.util.Map;
import java.util.TreeMap;
import com.revolsys.geometry.model.Location;
import com.revolsys.geometry.model.Point;
/**
* A map of nodes, indexed by the coordinate of the node
* @version 1.7
*/
public class NodeMap implements Iterable<Node> {
NodeFactory nodeFact;
// Map nodeMap = new HashMap();
Map<Point, Node> nodeMap = new TreeMap<>();
public NodeMap(final NodeFactory nodeFact) {
this.nodeFact = nodeFact;
}
/**
* 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(final EdgeEnd e) {
final Point p = e.getCoordinate();
final Node n = addNode(p);
n.add(e);
}
public Node addNode(final Node n) {
final Node node = this.nodeMap.get(n.getPoint());
if (node == null) {
this.nodeMap.put(n.getPoint(), n);
return n;
}
node.mergeLabel(n);
return node;
}
/**
* Factory function - subclasses can override to create their own types of nodes
*/
/*
* protected Node newNode(Point coord) { return new Node(coord); }
*/
/**
* This method expects that a node has a coordinate value.
*/
public Node addNode(final Point coord) {
Node node = this.nodeMap.get(coord);
if (node == null) {
node = this.nodeFact.newNode(coord);
this.nodeMap.put(coord, node);
}
return node;
}
/**
* @return the node if found; null otherwise
*/
public Node find(final Point coord) {
return this.nodeMap.get(coord);
}
public Collection<Node> getBoundaryNodes(final int geomIndex) {
final Collection<Node> boundaryNodes = new ArrayList<>();
for (final Node node : this) {
if (node.getLabel().getLocation(geomIndex) == Location.BOUNDARY) {
boundaryNodes.add(node);
}
}
return boundaryNodes;
}
@Override
public Iterator<Node> iterator() {
return this.nodeMap.values().iterator();
}
public void print(final PrintStream out) {
for (final Node node : this) {
node.print(out);
}
}
public Collection<Node> values() {
return this.nodeMap.values();
}
}