package org.wamblee.gps.track; import java.io.Serializable; import java.util.ArrayList; import java.util.Iterator; import java.util.List; import org.wamblee.gps.geometry.Point; public class TrackImpl implements Track, Serializable { private String _description; private List _segments; public TrackImpl(String aDescription) { _description = aDescription; _segments = new ArrayList(); } public void addSegment(TrackSegment aSegment) { _segments.add(aSegment); } @Override public String getDescription() { return _description; } @Override public Point getPoint(int aIndex) { int localIndex = aIndex; Iterator 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 result; } @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 result; } @Override public List getSegments() { return _segments; } @Override public int size() { int result = 0; for (TrackSegment segment: _segments) { result += segment.size(); } return result; } }