package de.fub.agg2graph.gpseval.features;
import de.fub.agg2graph.gpseval.data.Waypoint;
/**
* The AvgBearingChangeFeature calculates the average bearing change for a
* GPS-track.
*/
public class AvgBearingChangeFeature extends Feature {
private int mLastSegment = 0;
private double mSumBearingChange = 0;
private Double mLastBearing = null;
private int mCount = 0;
private int mBearingChangeThreshold = 0;
@Override
public void reset() {
mSumBearingChange = 0;
mLastBearing = null;
mCount = 0;
mBearingChangeThreshold = getIntParam("bearingChangeThreshold", 0);
}
@Override
public void addWaypoint(Waypoint entry) {
// If segment has changed, use current waypoint as new "start"-waypoint
// for following calculations.
if (entry.getSegment() != mLastSegment) {
mLastBearing = null;
mLastSegment = entry.getSegment();
}
if (mLastBearing != null) {
double bearMax = Math.max(mLastBearing, entry.getBearing());
double bearMin = Math.min(mLastBearing, entry.getBearing());
double bearChange = bearMax - bearMin;
bearChange = bearChange > 180 ? 360 - bearChange : bearChange;
if (bearChange > mBearingChangeThreshold) {
mSumBearingChange += bearChange;
++mCount;
}
}
mLastBearing = entry.getBearing();
}
@Override
public double getResult() {
return mCount > 0 ? (mSumBearingChange / mCount) : 0;
}
}