001 package ps2; 002 003 import java.util.*; 004 005 006 /** 007 * <p> 008 * A Route is a path that traverses arbitrary GeoSegments, regardless 009 * of their names. 010 * </p> 011 * 012 * <p> 013 * Routes are immutable. New Routes can be constructed by adding a 014 * segment to the end of a Route. An added segment must be properly 015 * oriented; that is, its p1 field must correspond to the end of the 016 * original Route, and its p2 field corresponds to the end of the new 017 * Route. 018 * </p> 019 * 020 * <p> 021 * Because a Route is not necessarily straight, its length -- the 022 * distance traveled by following the path from start to end -- is not 023 * necessarily the same as the distance along a straight line between 024 * its endpoints. 025 * </p> 026 * 027 * <p> 028 * Lastly, a Route may be viewed as a sequence of geographical 029 * features, using the <tt>getGeoFeatures()</tt> method which returns 030 * a List<GeoFeature>. 031 * </p> 032 * 033 * @specfield start : GeoPoint // location of the start of the route 034 * @specfield end : GeoPoint // location of the end of the route 035 * @specfield startHeading : angle // direction of travel at the start of the route, in degrees 036 * @specfield endHeading : angle // direction of travel at the end of the route, in degrees 037 * @specfield geoFeatures : sequence // a sequence of geographic features that make up this Route 038 * @specfield geoSegments : sequence // a sequence of segments that make up this Route 039 * @derivedfield length : real // total length of the route, in miles 040 * @derivedfield endingGeoSegment : GeoSegment // last GeoSegment of the route 041 **/ 042 public class Route { 043 //FIELDS 044 045 046 // Constructors 047 048 /** 049 * @requires gs != null 050 * @effects Constructs a new Route. 051 **/ 052 public Route(GeoSegment gs) { 053 throw new RuntimeException("Not yet implemented"); 054 } 055 056 057 /** 058 * Checks that the representation invariant holds (if any). 059 **/ 060 // Throws a RuntimeException if the rep invariant is violated. 061 private void checkRep() throws RuntimeException { 062 throw new RuntimeException("Not yet implemented"); 063 } 064 065 066 // Observers 067 068 /** 069 * @return location of the start of the route 070 **/ 071 public GeoPoint getStart() { 072 throw new RuntimeException("Not yet implemented"); 073 } 074 075 076 /** 077 * @return location of the end of the route 078 **/ 079 public GeoPoint getEnd() { 080 throw new RuntimeException("Not yet implemented"); 081 } 082 083 /** 084 * @return the last GeoSegment of the route 085 **/ 086 public GeoSegment getEndingGeoSegment() { 087 throw new RuntimeException("Not yet implemented"); 088 } 089 090 091 /** 092 * @return direction (in compass heading) of travel at the start 093 * of the route, in degrees 094 **/ 095 public double getStartHeading() { 096 throw new RuntimeException("Not yet implemented"); 097 } 098 099 100 /** 101 * @return direction of travel at the end of the route, in 102 * degrees 103 */ 104 public double getEndHeading() { 105 throw new RuntimeException("Not yet implemented"); 106 } 107 108 109 /** 110 * @return total length of the route, in miles. NOTE: this is NOT 111 * as-the-crow-flies, but rather the total distance required to 112 * traverse the route. These values are not necessarily equal. 113 */ 114 public double getLength() { 115 throw new RuntimeException("Not yet implemented"); 116 } 117 118 119 // Producers 120 121 /** 122 * Creates a new route that is equal to this route with gs 123 * appended to its end. 124 * @requires gs != null && gs.p1 = this.end 125 * @return a new Route r such that 126 * r.end = gs.p2 127 * && r.endHeading = gs.heading 128 * && r.length = this.length + gs.length 129 **/ 130 public Route addSegment(GeoSegment gs) { 131 throw new RuntimeException("Not yet implemented"); 132 } 133 134 135 /** 136 * Returns a List of GeoFeature objects. The 137 * concatenation of the GeoFeatures, in order, is equivalent to 138 * this route. No two consecutive GeoFeature objects have the 139 * same name.<p> 140 * 141 * @return a List of GeoFeatures such that 142 * <pre> 143 * this.start = a.get(0).start 144 * && this.startHeading = a.get(0).startHeading 145 * && this.end = a.get(a.length - 1).end 146 * && this.endHeading = a.get(a.length - 1).endHeading 147 * && this.length = sum (0 ≤ i < a.size) . a.get(i).length 148 * && for all integers i . 149 * (0 ≤ i < a.size - 1 ⇒ (a.get(i).name != a.get(i+1).name && 150 * a.get(i).end = a.get(i+1).start)) 151 * </pre> 152 * @see ps2.GeoFeature 153 **/ 154 public List<GeoFeature> getGeoFeatures() { 155 throw new RuntimeException("Not yet implemented"); 156 } 157 158 159 /** 160 * Returns a List of GeoSegment objects. The concatentation 161 * of the GeoSegments, in order, is equivalent to this route. 162 * @return a List of GeoSegments such that 163 * <pre> 164 * this.start = a.get(0).p1 165 * && this.startHeading = a.get(0).heading 166 * && this.end = a.get( a.size - 1 ).p2 167 * && this.endHeading = a.get( a.size - 1 ).heading 168 * && this.length = sum (0 ≤ i < a.size) . a.get(i).length 169 * && for all integers i . 170 * (0 ≤ i < a.size-1 ⇒ (a.get(i).p2 = a.get(i+1).p1)) 171 * </pre> 172 * @see ps2.GeoSegment 173 */ 174 public List<GeoSegment> getGeoSegments() { 175 throw new RuntimeException("Not yet implemented"); 176 } 177 178 179 /** 180 * Compares the specified Object with this Route for equality. 181 * @return true iff (o instanceof Route) 182 * && (o.geoFeatures and this.geoFeatures contain 183 * the same elements in the same order). 184 **/ 185 public boolean equals(Object o) { 186 throw new RuntimeException("Not yet implemented"); 187 } 188 189 190 /** 191 * @return a valid hash code for this. 192 **/ 193 public int hashCode() { 194 // This implementation will work, but you may want to modify 195 // it later for improved performance. If you do change the 196 // implementation, make sure it satisfies the hashCode 197 // invariant. That is, if equals returns true for two 198 // objects, then they must have the same hashCode. 199 200 return (1); 201 } 202 203 204 /** 205 * @return a string representation of this. 206 **/ 207 public String toString() { 208 throw new RuntimeException("Not yet implemented"); 209 } 210 211 } //Route