(no commit message)
[utils] / gps / src / main / java / org / wamblee / gps / track / TrackImpl.java
1 package org.wamblee.gps.track;
2
3 import java.io.Serializable;
4 import java.util.ArrayList;
5 import java.util.Iterator;
6 import java.util.List;
7
8 import org.wamblee.gps.geometry.Point;
9
10 public class TrackImpl implements Track, Serializable {
11
12     private String _description; 
13     private List<TrackSegment> _segments; 
14     
15     public TrackImpl(String aDescription) { 
16         _description = aDescription;
17         _segments = new ArrayList<TrackSegment>();
18     }
19     
20     public void addSegment(TrackSegment aSegment) { 
21         _segments.add(aSegment);
22     }
23     
24     @Override
25     public String getDescription() {
26         return _description;
27     }
28     
29     @Override
30     public Point getPoint(int aIndex) {
31         int localIndex = aIndex; 
32         Iterator<TrackSegment> i = _segments.iterator(); 
33         while (i.hasNext()) { 
34             TrackSegment segment = i.next();
35             if ( localIndex < segment.size() ) { 
36                 return segment.getPoint(localIndex);
37             }
38             localIndex -= segment.size();
39         }
40         throw new IndexOutOfBoundsException("" + aIndex);  
41     }
42     
43     @Override
44     public double getMinCoordinate(int i) {
45         if ( size() == 0 ) { 
46             throw new IllegalArgumentException("empty track");
47         }
48         double result = Double.MAX_VALUE;
49         for (TrackSegment segment: _segments) { 
50             if ( segment.size() > 0 ) { 
51                 result = Math.min(result, segment.getMinCoordinate(i));
52             }
53         }
54         return result;
55     }
56     
57     @Override
58     public double getMaxCoordinate(int i) {
59         if ( size() == 0 ) { 
60             throw new IllegalArgumentException("empty track");
61         }
62         double result = Double.MIN_VALUE;
63         for (TrackSegment segment: _segments) { 
64             if ( segment.size() > 0 ) { 
65                 result = Math.max(result, segment.getMaxCoordinate(i));
66             }
67         }
68         return result;
69     }
70     
71     @Override
72     public List<TrackSegment> getSegments() {
73         return _segments; 
74     }
75     
76     @Override
77     public int size() {
78         int result = 0; 
79         for (TrackSegment segment: _segments) { 
80             result += segment.size();
81         }
82         return result; 
83     }
84 }