Skip to content

Instantly share code, notes, and snippets.

@nigel-sampson
Created February 12, 2013 03:49
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save nigel-sampson/4760113 to your computer and use it in GitHub Desktop.
Save nigel-sampson/4760113 to your computer and use it in GitHub Desktop.
Collecting pointer moved and only want points once the pointer has moved a certain amount.
private void OnLoaded(object sender, RoutedEventArgs args)
{
var pointerMoved = Observable.FromEventPattern<PointerEventHandler, PointerRoutedEventArgs>(h => PathRoot.PointerMoved += h, h => PathRoot.PointerMoved -= h).Select(e => e.EventArgs);
var pointerInContact = pointerMoved.Where(p => p.Pointer.IsInContact);
var points = pointerInContact.Select(p => p.GetCurrentPoint(PathRoot)).Select(p => new Vector2((float) p.Position.X, (float) p.Position.Y));
var previousPoints = points.Skip(1);
var deltas = points.Zip(previousPoints, (current, previous) => new Vector2Delta { Point = current, Delta = current - previous });
var scannedDeltas = deltas.Scan(new Vector2Delta { Point = Vector2.Zero, Delta = Vector2.Zero }, ScanSignificantDeleta);
var signficantDeltas = scannedDeltas.Where(p => p.Significant);
signficantDeltas.Subscribe(p => AddEllipse(p.Point));
}
private Vector2Delta ScanSignificantDeleta(Vector2Delta scanned, Vector2Delta current)
{
var delta = current.Delta + scanned.Delta;
var significant = delta.Length() > 25;
return new Vector2Delta
{
Point = current.Point,
Delta = significant ? Vector2.Zero : delta,
Significant = significant
};
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment