|
|
|
@ -139,6 +139,9 @@ namespace Avalonia.Input.GestureRecognizers |
|
|
|
sampleCount++; |
|
|
|
} while (sampleCount < HistorySize); |
|
|
|
|
|
|
|
var offset = newestSample.Point - oldestSample.Point; |
|
|
|
var duration = newestSample.Time - oldestSample.Time; |
|
|
|
|
|
|
|
if (sampleCount >= MinSampleSize) |
|
|
|
{ |
|
|
|
var xFit = LeastSquaresSolver.Solve(2, time.Slice(0, sampleCount), x.Slice(0, sampleCount), w.Slice(0, sampleCount)); |
|
|
|
@ -150,20 +153,31 @@ namespace Avalonia.Input.GestureRecognizers |
|
|
|
return new VelocityEstimate( // convert from pixels/ms to pixels/s
|
|
|
|
PixelsPerSecond: new Vector(xFit.Coefficients[1] * 1000, yFit.Coefficients[1] * 1000), |
|
|
|
Confidence: xFit.Confidence * yFit.Confidence, |
|
|
|
Duration: newestSample.Time - oldestSample.Time, |
|
|
|
Offset: newestSample.Point - oldestSample.Point |
|
|
|
Duration: duration, |
|
|
|
Offset: offset |
|
|
|
); |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
else if(sampleCount > 1) |
|
|
|
{ |
|
|
|
// Return linear velocity if we don't have enough samples
|
|
|
|
var distance = newestSample.Point - oldestSample.Point; |
|
|
|
return new VelocityEstimate( |
|
|
|
PixelsPerSecond: new Vector(distance.X / duration.Milliseconds * 1000, distance.Y / duration.Milliseconds * 1000), |
|
|
|
Confidence: 1, |
|
|
|
Duration: duration, |
|
|
|
Offset: offset |
|
|
|
); |
|
|
|
} |
|
|
|
|
|
|
|
// We're unable to make a velocity estimate but we did have at least one
|
|
|
|
// valid pointer position.
|
|
|
|
return new VelocityEstimate( |
|
|
|
PixelsPerSecond: Vector.Zero, |
|
|
|
Confidence: 1.0, |
|
|
|
Duration: newestSample.Time - oldestSample.Time, |
|
|
|
Offset: newestSample.Point - oldestSample.Point |
|
|
|
Duration: duration, |
|
|
|
Offset: offset |
|
|
|
); |
|
|
|
} |
|
|
|
|
|
|
|
|