001    package ps2;
002    
003    
004    /**
005     * <p>
006     * A GeoPoint models a point on the earth.  GeoPoints are immutable.
007     * </p>
008     *
009     * <p>
010     * North latitudes and east longitudes are represented by positive
011     * numbers.  South latitudes and west longitudes are represented by
012     * negative numbers.  In each case, the precision is to a millionth
013     * of a degree.
014     * </p>
015     *
016     * <p>
017     * The code may assume that the represented points are nearby Seattle.
018     * </p>
019     *
020     * <p>
021     * <b>Implementation hint</b>:<br /> Seattle is at approximately 47
022     * deg. 36 min. 35 sec. N latitude and 122 deg. 19 min. 59 sec. W
023     * longitude.  There are 60 minutes per degree, and 60 seconds per
024     * minute.  So, in decimal, these correspond to 47.609722 North
025     * latitude and -122.333056 East longitude.  The constructor takes
026     * integers in millionths of degrees.  To create a new GeoPoint
027     * located in Seattle, use: <tt>GeoPoint seattle = new
028     * GeoPoint(47609722, -122333056);</tt>
029     * </p>
030     *
031     * <p>
032     * Near Seattle, there are approximately 69.04 miles per degree of
033     * latitude and 47.574 miles per degree of longitude.  An
034     * implementation should use these values when determining distances
035     * and headings.
036     * </p>
037     *
038     * @specfield  latitude :  real     // measured in degrees latitude
039     * @specfield  longitude : real     // measured in degrees longitude
040     **/
041    public class GeoPoint {
042    
043        /** Minimum value the latitude field can have in this class. **/
044        public static final int MIN_LATITUDE  =  -90 * 1000000;
045    
046        /** Maximum value the latitude field can have in this class. **/
047        public static final int MAX_LATITUDE  =   90 * 1000000;
048    
049        /** Minimum value the longitude field can have in this class. **/
050        public static final int MIN_LONGITUDE = -180 * 1000000;
051    
052        /** Maximum value the longitude field can have in this class. **/
053        public static final int MAX_LONGITUDE =  180 * 1000000;
054    
055    
056        /**
057         * Approximation used to determine distances and headings using a
058         * "flat earth" simplification.
059         **/
060        public static final double MILES_PER_DEGREE_LATITUDE = 69.04;
061    
062        /**
063         * Approximation used to determine distances and headings using a
064         * "flat earth" simplification.
065         **/
066        public static final double MILES_PER_DEGREE_LONGITUDE = 46.574;
067    
068    
069        // FIELDS
070    
071    
072        // Constructors
073    
074        /**
075         * @requires the (latitude, longitude) point expressed in
076         * millionths of a degree is valid, such that
077         * MIN_LATITUDE <= latitude <= MAX_LATITUDE and
078         * MIN_LONGITUDE <= longitude <= MAX_LONGITUDE
079         *
080         * @effects constructs a GeoPoint from a latitude and
081         * longitude given in millionths of degrees.
082         **/
083        public GeoPoint(int latitude, int longitude) {
084            throw new RuntimeException("Not yet implemented");
085        }
086    
087    
088        /**
089         * Checks that the representation invariant holds (if any).
090         * Throws an exception if the rep invariant is violated.
091         **/
092        private void checkRep() {
093            throw new RuntimeException("Not yet implemented");
094        }
095    
096    
097        // Observers
098    
099        /**
100         * the latitude of the GeoPoint object, in millionths of degrees.
101         **/
102        public int getLatitude() {
103            throw new RuntimeException("Not yet implemented");
104        }
105    
106    
107        /**
108         * the longitude of the GeoPoint object, in millionths of degrees.
109         **/
110        public int getLongitude() {
111            throw new RuntimeException("Not yet implemented");
112        }
113    
114    
115        /**
116         * Computes the distance between GeoPoints.
117         * @requires gp != null
118         * @return The distance, in miles, from this to gp, using the
119         * flat-surface, near Seattle approximation.
120         **/
121        public double distanceTo(GeoPoint gp) {
122            throw new RuntimeException("Not yet implemented");
123        }
124    
125    
126        /**
127         * Computes the compass heading between GeoPoints.
128         * @requires gp != null && !this.equals(gp)
129         * @return The compass heading h from this to
130         * gp, in degrees, using the flat-surface, near Seattle
131         * approximation, such that 0 &le; h &lt; 360.  In compass
132         * headings, north = 0, east = 90, south = 180, and west = 270.
133         **/
134        public double headingTo(GeoPoint gp) {
135            throw new RuntimeException("Not yet implemented");
136        }
137    
138    
139        /**
140         * Compares the specified Object with this GeoPoint for equality.
141         * @return gp != null && (gp instanceof GeoPoint)
142         *         && gp.latitude = this.latitude && gp.longitude = this.longitude
143         **/
144        public boolean equals(Object gp) {
145            throw new RuntimeException("Not yet implemented");
146        }
147    
148    
149        /**
150         * @return a valid hashcode for this GeoPoint.
151         **/
152        public int hashCode() {
153            // This implementation will work, but you may want to modify
154            // it later for improved performance.  If you do change the
155            // implementation, make sure it satisfies the hashCode
156            // invariant.  That is, if equals returns true for two
157            // objects, then they must have the same hashCode.
158            return (1);
159        }
160    
161    
162        /**
163         * @return a string representation of this GeoPoint.
164         **/
165        public String toString() {
166            throw new RuntimeException("Not yet implemented");
167        }
168    
169    } // GeoPoint