More track data.
[utils] / gps / src / main / java / org / wamblee / gps / track / TrackImpl.java
diff --git a/gps/src/main/java/org/wamblee/gps/track/TrackImpl.java b/gps/src/main/java/org/wamblee/gps/track/TrackImpl.java
new file mode 100644 (file)
index 0000000..12513f3
--- /dev/null
@@ -0,0 +1,83 @@
+package org.wamblee.gps.track;
+
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.List;
+
+import org.wamblee.gps.geometry.Point;
+
+public class TrackImpl implements Track {
+
+    private String _description; 
+    private List<TrackSegment> _segments; 
+    
+    public TrackImpl(String aDescription) { 
+        _description = aDescription;
+        _segments = new ArrayList<TrackSegment>();
+    }
+    
+    public void addSegment(TrackSegment aSegment) { 
+        _segments.add(aSegment);
+    }
+    
+    @Override
+    public String getDescription() {
+        return _description;
+    }
+    
+    @Override
+    public Point getPoint(int aIndex) {
+        int localIndex = aIndex; 
+        Iterator<TrackSegment> i = _segments.iterator(); 
+        while (i.hasNext()) { 
+            TrackSegment segment = i.next();
+            if ( localIndex < segment.size() ) { 
+                return segment.getPoint(localIndex);
+            }
+            localIndex -= segment.size();
+        }
+        throw new IndexOutOfBoundsException("" + aIndex);  
+    }
+    
+    @Override
+    public double getMinCoordinate(int i) {
+        if ( size() == 0 ) { 
+            throw new IllegalArgumentException("empty track");
+        }
+        double result = Double.MAX_VALUE;
+        for (TrackSegment segment: _segments) { 
+            if ( segment.size() > 0 ) { 
+                result = Math.min(result, segment.getMinCoordinate(i));
+            }
+        }
+        return 0;
+    }
+    
+    @Override
+    public double getMaxCoordinate(int i) {
+        if ( size() == 0 ) { 
+            throw new IllegalArgumentException("empty track");
+        }
+        double result = Double.MIN_VALUE;
+        for (TrackSegment segment: _segments) { 
+            if ( segment.size() > 0 ) { 
+                result = Math.max(result, segment.getMaxCoordinate(i));
+            }
+        }
+        return 0;
+    }
+    
+    @Override
+    public List<TrackSegment> getSegments() {
+        return _segments; 
+    }
+    
+    @Override
+    public int size() {
+        int result = 0; 
+        for (TrackSegment segment: _segments) { 
+            result += segment.size();
+        }
+        return result; 
+    }
+}