package tim.prune.data;
/**
* Class to provide checking functions
*/
public abstract class Checker
{
/**
* Check if a given track is doubled, so that each point is given twice,
* once as waypoint and again as track point
* @param inTrack track to check
* @return true if track is doubled, false otherwise
*/
public static boolean isDoubledTrack(Track inTrack)
{
// Check for empty track
if (inTrack == null || inTrack.getNumPoints() < 2) {return false;}
// Check for non-even number of points
final int numPoints = inTrack.getNumPoints();
if (numPoints % 2 != 0) {return false;}
// Loop through first half of track
final int halfNum = numPoints / 2;
for (int i=0; i<halfNum; i++)
{
DataPoint firstPoint = inTrack.getPoint(i);
DataPoint secondPoint = inTrack.getPoint(i + halfNum);
if (!firstPoint.getLatitude().equals(secondPoint.getLatitude())
|| !firstPoint.getLongitude().equals(secondPoint.getLongitude())) {
return false;
}
}
// Passed the test, so contents must all be doubled
return true;
}
/**
* Find the index of the next segment start after the given index
* @param inTrack track object
* @param inIndex current index
* @return index of next segment start
*/
public static int getNextSegmentStart(Track inTrack, int inIndex)
{
int i = inIndex + 1;
DataPoint point = null;
while ((point=inTrack.getPoint(i)) != null && (point.isWaypoint() || !point.getSegmentStart())) {
i++;
}
return Math.min(i, inTrack.getNumPoints()-1);
}
/**
* Find the index of the previous segment start before the given index
* @param inTrack track object
* @param inIndex current index
* @return index of previous segment start
*/
public static int getPreviousSegmentStart(Track inTrack, int inIndex)
{
int i = inIndex - 1;
DataPoint point = null;
while ((point=inTrack.getPoint(i)) != null && (point.isWaypoint() || !point.getSegmentStart())) {
i--;
}
// Have we gone past the beginning of the track?
i = Math.max(i, 0);
// count forwards past the waypoints if necessary
while ((point=inTrack.getPoint(i)) != null && point.isWaypoint()) {
i++;
}
return i;
}
/**
* Find the index of the last track point in the current segment
* @param inTrack track object
* @param inIndex current index
* @return index of next segment end
*/
public static int getNextSegmentEnd(Track inTrack, int inIndex)
{
// First, go to start of following segment, or the end of the track
int i = getNextSegmentStart(inTrack, inIndex);
// If it's the next segment, subtract one
DataPoint point = inTrack.getPoint(i);
if (point == null || point.getSegmentStart())
{
i--;
}
// Now we may be on a waypoint, so count back to get the last track point
while ((point=inTrack.getPoint(i)) != null && point.isWaypoint()) {
i--;
}
return Math.min(i, inTrack.getNumPoints()-1);
}
/**
* @param inTrack track object
* @return true if there is at least one waypoint with a timestamp
*/
public static boolean haveWaypointsGotTimestamps(Track inTrack)
{
if (inTrack != null)
{
for (int i=0; i<inTrack.getNumPoints(); i++)
{
DataPoint p = inTrack.getPoint(i);
if (p != null && p.isWaypoint() && p.hasTimestamp())
{
return true;
}
}
}
return false;
}
}