package tim.prune.correlate; import tim.prune.data.DataPoint; import tim.prune.data.MediaObject; /** * Class to hold a pair of points used to hold the result of correlation */ public class PointMediaPair { private MediaObject _media = null; private DataPoint _pointBefore = null; private DataPoint _pointAfter = null; private long _secondsBefore = 1L; private long _secondsAfter = -1L; /** * Constructor * @param inMedia media object */ public PointMediaPair(MediaObject inMedia) { _media = inMedia; } /** * Add a point to the pair * @param inPoint data point * @param inSeconds number of seconds time difference, positive means point later */ public void addPoint(DataPoint inPoint, long inSeconds) { // Check if point is closest point before if (inSeconds <= 0) { // point stamp is before media stamp if (inSeconds > _secondsBefore || _secondsBefore > 0L) { // point stamp is nearer to media _pointBefore = inPoint; _secondsBefore = inSeconds; } } // Check if point is closest point after if (inSeconds >= 0) { // point stamp is after media stamp if (inSeconds < _secondsAfter || _secondsAfter < 0L) { // point stamp is nearer to media _pointAfter = inPoint; _secondsAfter = inSeconds; } } } /** * @return Media object */ public MediaObject getMedia() { return _media; } /** * @return the closest point before the media */ public DataPoint getPointBefore() { return _pointBefore; } /** * @return number of seconds between media and subsequent point */ public long getSecondsBefore() { return _secondsBefore; } /** * @return the closest point after the media */ public DataPoint getPointAfter() { return _pointAfter; } /** * @return number of seconds between previous point and media */ public long getSecondsAfter() { return _secondsAfter; } /** * @return true if both points found */ public boolean isValid() { return getPointBefore() != null && getPointAfter() != null; } /** * @return the fraction of the distance along the interpolated line */ public double getFraction() { if (_secondsAfter == 0L) return 0.0; return (-_secondsBefore * 1.0 / (-_secondsBefore + _secondsAfter)); } /** * @return the number of seconds to the nearest point */ public long getMinSeconds() { return Math.min(_secondsAfter, -_secondsBefore); } /** * @return angle from media to nearest point in radians */ public double getMinRadians() { double totalRadians = DataPoint.calculateRadiansBetween(_pointBefore, _pointAfter); double frac = getFraction(); return totalRadians * Math.min(frac, 1-frac); } }