/// <summary>
        ///     Filters the specified timed points.
        /// </summary>
        /// <param name="timedPoints">The timed points.</param>
        /// <returns>
        ///     An average of the last N points (as long as they fall within a given timespan from <see cref="DateTime.Now" />).
        /// </returns>
        public override Point?Filter(TimedPoints timedPoints)
        {
            if (timedPoints == null)
            {
                return(null);
            }

            var withinTimeSpan = timedPoints.Where(pair => DateTime.Now - pair.Key <= this.timeSpan).ToList();

            if (withinTimeSpan.Count < this.numberOfPoints)
            {
                return(null);
            }

            var pointsToAverage = withinTimeSpan.OrderByDescending(pair => pair.Key).Take(this.numberOfPoints).ToList();
            var averageX        = pointsToAverage.Select(pair => pair.Value.X).Average();
            var averageY        = pointsToAverage.Select(pair => pair.Value.Y).Average();

            return(new Point(averageX, averageY));
        }