using System; using System.Collections.Generic; using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; using bbiwarg.Images; using bbiwarg.Graphics; namespace bbiwarg.Recognition.TouchRecognition { class TouchTracker { private OutputImage outputImage; private List[] detectedTouchEvents; private int framesUntilTracked; public List TrackedTouchEvents; public TouchTracker() { reset(); } public void reset() { framesUntilTracked = Constants.TouchEventNumFramesUntilTracked; detectedTouchEvents = new List[framesUntilTracked]; for (int i = 0; i < framesUntilTracked; i++) { detectedTouchEvents[i] = new List(); } } public void setDetectedTouchEventsThisFrame(List touchEventsThisFrame, OutputImage outputImage) { this.outputImage = outputImage; for (int i = (framesUntilTracked - 1); i > 0; i--) { detectedTouchEvents[i] = detectedTouchEvents[i - 1]; } detectedTouchEvents[0] = touchEventsThisFrame; findTrackedTouches(); } private void findTrackedTouches() { TrackedTouchEvents = new List(); foreach (TouchEvent te in detectedTouchEvents[0]) { bool tracked = true; for (int i = 1; i < framesUntilTracked; i++) { if (!hasSimilarTouchEventInFrame(te, i)) tracked = false; } if (tracked) { outputImage.fillCircle(te.Position.IntX, te.Position.IntY, 5, Color.Yellow); TrackedTouchEvents.Add(te); } } } private bool hasSimilarTouchEventInFrame(TouchEvent touchEvent, int frame) { foreach (TouchEvent te in detectedTouchEvents[frame]) { if (touchEvent.isSimilarTo(te)) return true; } return false; } } }