/* This program 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 3 of the License, or (at your option) any later version. This program 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 General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see <http://www.gnu.org/licenses/>. */ package org.opentripplanner.common.geometry; import java.util.ArrayList; import java.util.HashSet; import java.util.Iterator; import java.util.Set; import org.opentripplanner.routing.graph.Vertex; import org.opentripplanner.routing.vertextype.TransitVertex; import com.vividsolutions.jts.geom.Coordinate; import com.vividsolutions.jts.geom.Geometry; import com.vividsolutions.jts.geom.GeometryFactory; import com.vividsolutions.jts.geom.MultiPoint; public class Subgraph { private Set<Vertex> streetVertexSet; private Set<Vertex> stopsVertexSet; private ArrayList<Coordinate> vertexCoords; private Geometry convexHullAsGeom = null; private boolean newVertexAdded = true; public Subgraph(){ streetVertexSet = new HashSet<Vertex>(); stopsVertexSet = new HashSet<Vertex>(); vertexCoords = new ArrayList<Coordinate>(); } public void addVertex(Vertex vertex){ if(vertex instanceof TransitVertex){ stopsVertexSet.add(vertex); }else{ streetVertexSet.add(vertex); } newVertexAdded = true; vertexCoords.add(vertex.getCoordinate()); } public boolean contains(Vertex vertex){ return (streetVertexSet.contains(vertex) || stopsVertexSet.contains(vertex)); } public boolean containsStreet(Vertex vertex){ return streetVertexSet.contains(vertex); } public int streetSize(){ return streetVertexSet.size(); } public int stopSize(){ return stopsVertexSet.size(); } public Vertex getRepresentativeVertex(){ //TODO this is not very smart but good enough at the moment return streetVertexSet.iterator().next(); } public Iterator<Vertex> streetIterator() { return streetVertexSet.iterator(); } public Iterator<Vertex> stopIterator() { return stopsVertexSet.iterator(); } private static GeometryFactory gf = new GeometryFactory(); public Geometry getConvexHull() { if (newVertexAdded) { MultiPoint mp = gf.createMultiPoint(vertexCoords.toArray(new Coordinate[0])); newVertexAdded = false; mp.convexHull(); } return convexHullAsGeom; } }