/* * GeoTools - The Open Source Java GIS Toolkit * http://geotools.org * * (C) 2002-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.graph.structure.opt; import java.util.ArrayList; import java.util.Iterator; import org.geotools.graph.structure.Edge; import org.geotools.graph.structure.Node; /** * Optimized implementation of Edge. * * @author Justin Deoliveira, Refractions Research Inc, jdeolive@refractions.net * @see Edge * * @source $URL$ */ public class OptEdge extends OptGraphable implements Edge { /** a node **/ private OptNode m_nodeA; /** b node **/ private OptNode m_nodeB; /** * Constructs a new optimized edge. * * @param nodeA A node of edge. * @param nodeB B node of edge. */ public OptEdge(OptNode nodeA, OptNode nodeB) { m_nodeA = nodeA; m_nodeB = nodeB; } /** * @see Edge#getNodeA() */ public Node getNodeA() { return(m_nodeA); } /** * @see Edge#getNodeB() */ public Node getNodeB() { return(m_nodeB); } /** * @see Edge#getOtherNode(Node) */ public Node getOtherNode(Node node) { return( m_nodeA.equals(node) ? m_nodeB : m_nodeB.equals(node) ? m_nodeA : null ); } /** * @see Edge#reverse() */ public void reverse() { OptNode tmp = m_nodeA; m_nodeA = m_nodeB; m_nodeB = tmp; } /** * @see Edge#compareNodes(Edge) */ public int compareNodes(Edge other) { if (m_nodeA.equals(other.getNodeA()) && m_nodeB.equals(other.getNodeB())) return(Edge.EQUAL_NODE_ORIENTATION); if (m_nodeB.equals(other.getNodeA()) && m_nodeA.equals(other.getNodeB())) return(Edge.OPPOSITE_NODE_ORIENTATION); return(Edge.UNEQUAL_NODE_ORIENTATION); } /** * @see org.geotools.graph.structure.Graphable#getRelated() */ public Iterator getRelated() { return(new RelatedIterator(this)); } public class RelatedIterator implements Iterator { private Iterator m_itr; public RelatedIterator(OptEdge edge) { ArrayList edges = new ArrayList( m_nodeA.getDegree() + m_nodeB.getDegree() - 2 - m_nodeA.getEdges(m_nodeB).size() ); //add all edges of node A except this edge for (int i = 0; i < m_nodeA.getEdgeArray().length; i++) { Edge e = (Edge)m_nodeA.getEdgeArray()[i]; if (!e.equals(edge)) edges.add(m_nodeA.getEdgeArray()[i]); } //add only edges from node b that are node shared with node a for (int i = 0; i < m_nodeB.getEdgeArray().length; i++) { Edge e = (Edge)m_nodeB.getEdgeArray()[i]; if (!e.getOtherNode(m_nodeB).equals(m_nodeA)) edges.add(e); } m_itr = edges.iterator(); } public void remove() { throw new UnsupportedOperationException( getClass().getName() + "#remove() not supported." ); } public boolean hasNext() { return(m_itr.hasNext()); } public Object next() { return(m_itr.next()); } } }