using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace bbiwarg.Detectors.Touch { class TouchTracker { private List<TouchEvent>[] detectedTouchEvents; private List<TouchEvent> trackedTouchEvents; private int framesUntilTracked; public TouchTracker() { framesUntilTracked = 3; detectedTouchEvents = new List<TouchEvent>[framesUntilTracked]; for (int i = 0; i < framesUntilTracked; i++) { detectedTouchEvents[i] = new List<TouchEvent>(); } } public void setDetectedTouchEventsThisFrame(List<TouchEvent> touchEventsThisFrame) { for (int i = (framesUntilTracked-1); i > 0; i--) { detectedTouchEvents[i] = detectedTouchEvents[i - 1]; } detectedTouchEvents[0] = touchEventsThisFrame; findTrackedTouches(); } private void findTrackedTouches() { trackedTouchEvents = new List<TouchEvent>(); foreach (TouchEvent te in detectedTouchEvents[0]) { bool tracked = true; for (int i = 1; i < framesUntilTracked; i++) { if (!hasSimilarTouchEventInFrame(te, i)) tracked = false; } if (tracked) { trackedTouchEvents.Add(te); Console.WriteLine("touch tracked at x:" + te.getX() + " y:" + te.getY() + " [touchValue:" + te.getTouchValue() + "]"); } } } private bool hasSimilarTouchEventInFrame(TouchEvent touchEvent, int frame) { float maxDistance = 20; foreach (TouchEvent te in detectedTouchEvents[frame]) { float distance = touchEvent.getDistanceTo(te); if (distance < maxDistance) return true; } return false; } } }