public void ApplyPoint(PointF point) { var offset = point.Subtract(_startPoint); if (points.Count == 0) { points.Add(new GesturePoint { X = offset.X, Y = offset.Y, threshold = 10 }); } else { var last = points.Last(); var lastPoint = new PointF(last.X, last.Y); // first check distance from last point if (lastPoint.DistanceTo(offset) > 10) { var currentAngle = _previousOffset.AngleTo(offset); var previousAngle = lastPoint.AngleTo(_previousOffset); var da = currentAngle - previousAngle; if (da < -Math.PI) da += 2 * Math.PI; if (da > Math.PI) da -= 2 * Math.PI; if (da > 0.1) { AddPoint(_previousOffset); } } } _previousOffset = offset; }