/****************************************************************************** * Name: Reference Solution * NetID: ref * Precept: P00 * * Description: Reads GPS tracking data (lat, lon, alt) and creates a * Path of waypoints. After reading in data, computes and * prints stats. Stats are based on a command line argument * threshold. ******************************************************************************/ public class Path { private Node first; // a reference to the "first" node on the tour private Node last; // a reference to the "last" node on the tour // a node in the circular linked list private static class Node { private Coordinate coord; private Node next; } // create an empty trip public Path() { } // return a string representation of this tour public String toString() { if (first == null) return ""; StringBuilder sb = new StringBuilder(); Node x = first; do { sb.append(x.coord + "\n"); x = x.next; } while (x != first); return sb.toString(); } // return Stats regarding the path public Stats computeStats(int altThresh) { if (first == null) return new Stats(); double lastAlt = first.coord.getAlt(); double high = lastAlt; double low = lastAlt; int points = 1; double dist = 0.0; double asc = 0.0; double desc = 0.0; if (last == first) return new Stats(points, dist, high, low, asc, desc); Node x = first; do { Node next = x.next; points++; dist += x.coord.haversineDist(next.coord); if (Math.abs(lastAlt - next.coord.getAlt()) > altThresh) { if (lastAlt > next.coord.getAlt()) desc += (lastAlt - next.coord.getAlt()); else asc += (next.coord.getAlt() - lastAlt); lastAlt = next.coord.getAlt(); } x = next; high = Math.max(high, x.coord.getAlt()); low = Math.min(low, x.coord.getAlt()); } while (x != last); return new Stats(points, dist, high, low, asc, desc); } // insert waypoint at the end of the path public void addWaypoint(Coordinate coord) { Node node = new Node(); node.coord = coord; if (first == null) { first = node; last = node; node.next = node; return; } last.next = node; node.next = first; last = node; } // main client public static void main(String[] args) { Path path = new Path(); while(!StdIn.isEmpty()) { double lon = StdIn.readDouble(); double lat = StdIn.readDouble(); double alt = StdIn.readDouble(); path.addWaypoint(new Coordinate(lon, lat, alt)); } if (args.length == 0) { StdOut.print(path); return; } else if (args.length == 1) { int thresh = Integer.parseInt(args[0]); StdOut.print(path.computeStats(thresh)); return; } StdOut.println("ERROR: Path takes zero or one command line argument."); } }