001: /*
002: * The JTS Topology Suite is a collection of Java classes that
003: * implement the fundamental operations required to validate a given
004: * geo-spatial data set to a known topological specification.
005: *
006: * Copyright (C) 2001 Vivid Solutions
007: *
008: * This library is free software; you can redistribute it and/or
009: * modify it under the terms of the GNU Lesser General Public
010: * License as published by the Free Software Foundation; either
011: * version 2.1 of the License, or (at your option) any later version.
012: *
013: * This library is distributed in the hope that it will be useful,
014: * but WITHOUT ANY WARRANTY; without even the implied warranty of
015: * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
016: * Lesser General Public License for more details.
017: *
018: * You should have received a copy of the GNU Lesser General Public
019: * License along with this library; if not, write to the Free Software
020: * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
021: *
022: * For more information, contact:
023: *
024: * Vivid Solutions
025: * Suite #1A
026: * 2328 Government Street
027: * Victoria BC V8T 5G5
028: * Canada
029: *
030: * (250)385-6040
031: * www.vividsolutions.com
032: */
033:
034: package com.vividsolutions.jts.planargraph;
035:
036: import java.util.*;
037: import com.vividsolutions.jts.geom.Coordinate;
038:
039: /**
040: * A sorted collection of {@link DirectedEdge}s which leave a {@link Node}
041: * in a {@link PlanarGraph}.
042: *
043: * @version 1.7
044: */
045: public class DirectedEdgeStar {
046:
047: /**
048: * The underlying list of outgoing DirectedEdges
049: */
050: protected List outEdges = new ArrayList();
051: private boolean sorted = false;
052:
053: /**
054: * Constructs a DirectedEdgeStar with no edges.
055: */
056: public DirectedEdgeStar() {
057: }
058:
059: /**
060: * Adds a new member to this DirectedEdgeStar.
061: */
062: public void add(DirectedEdge de) {
063: outEdges.add(de);
064: sorted = false;
065: }
066:
067: /**
068: * Drops a member of this DirectedEdgeStar.
069: */
070: public void remove(DirectedEdge de) {
071: outEdges.remove(de);
072: }
073:
074: /**
075: * Returns an Iterator over the DirectedEdges, in ascending order by angle with the positive x-axis.
076: */
077: public Iterator iterator() {
078: sortEdges();
079: return outEdges.iterator();
080: }
081:
082: /**
083: * Returns the number of edges around the Node associated with this DirectedEdgeStar.
084: */
085: public int getDegree() {
086: return outEdges.size();
087: }
088:
089: /**
090: * Returns the coordinate for the node at wich this star is based
091: */
092: public Coordinate getCoordinate() {
093: Iterator it = iterator();
094: if (!it.hasNext())
095: return null;
096: DirectedEdge e = (DirectedEdge) it.next();
097: return e.getCoordinate();
098: }
099:
100: /**
101: * Returns the DirectedEdges, in ascending order by angle with the positive x-axis.
102: */
103: public List getEdges() {
104: sortEdges();
105: return outEdges;
106: }
107:
108: private void sortEdges() {
109: if (!sorted) {
110: Collections.sort(outEdges);
111: sorted = true;
112: }
113: }
114:
115: /**
116: * Returns the zero-based index of the given Edge, after sorting in ascending order
117: * by angle with the positive x-axis.
118: */
119: public int getIndex(Edge edge) {
120: sortEdges();
121: for (int i = 0; i < outEdges.size(); i++) {
122: DirectedEdge de = (DirectedEdge) outEdges.get(i);
123: if (de.getEdge() == edge)
124: return i;
125: }
126: return -1;
127: }
128:
129: /**
130: * Returns the zero-based index of the given DirectedEdge, after sorting in ascending order
131: * by angle with the positive x-axis.
132: */
133: public int getIndex(DirectedEdge dirEdge) {
134: sortEdges();
135: for (int i = 0; i < outEdges.size(); i++) {
136: DirectedEdge de = (DirectedEdge) outEdges.get(i);
137: if (de == dirEdge)
138: return i;
139: }
140: return -1;
141: }
142:
143: /**
144: * Returns the remainder when i is divided by the number of edges in this
145: * DirectedEdgeStar.
146: */
147: public int getIndex(int i) {
148: int modi = i % outEdges.size();
149: //I don't think modi can be 0 (assuming i is positive) [Jon Aquino 10/28/2003]
150: if (modi < 0)
151: modi += outEdges.size();
152: return modi;
153: }
154:
155: /**
156: * Returns the DirectedEdge on the left-hand side of the given DirectedEdge (which
157: * must be a member of this DirectedEdgeStar).
158: */
159: public DirectedEdge getNextEdge(DirectedEdge dirEdge) {
160: int i = getIndex(dirEdge);
161: return (DirectedEdge) outEdges.get(getIndex(i + 1));
162: }
163: }
|