TouchTracker.cs 2.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using System.Threading.Tasks;
  6. namespace bbiwarg.Detectors.Touch
  7. {
  8. class TouchTracker
  9. {
  10. private List<TouchEvent>[] detectedTouchEvents;
  11. private List<TouchEvent> trackedTouchEvents;
  12. private int framesUntilTracked;
  13. public TouchTracker() {
  14. framesUntilTracked = 3;
  15. detectedTouchEvents = new List<TouchEvent>[framesUntilTracked];
  16. for (int i = 0; i < framesUntilTracked; i++) {
  17. detectedTouchEvents[i] = new List<TouchEvent>();
  18. }
  19. }
  20. public void setDetectedTouchEventsThisFrame(List<TouchEvent> touchEventsThisFrame) {
  21. for (int i = (framesUntilTracked-1); i > 0; i--) {
  22. detectedTouchEvents[i] = detectedTouchEvents[i - 1];
  23. }
  24. detectedTouchEvents[0] = touchEventsThisFrame;
  25. findTrackedTouches();
  26. }
  27. private void findTrackedTouches() {
  28. trackedTouchEvents = new List<TouchEvent>();
  29. foreach (TouchEvent te in detectedTouchEvents[0]) {
  30. bool tracked = true;
  31. for (int i = 1; i < framesUntilTracked; i++) {
  32. if (!hasSimilarTouchEventInFrame(te, i)) tracked = false;
  33. }
  34. if (tracked)
  35. {
  36. trackedTouchEvents.Add(te);
  37. Console.WriteLine("touch tracked at x:" + te.getX() + " y:" + te.getY() + " [touchValue:" + te.getTouchValue() + "]");
  38. }
  39. }
  40. }
  41. private bool hasSimilarTouchEventInFrame(TouchEvent touchEvent, int frame) {
  42. float maxDistance = 20;
  43. foreach (TouchEvent te in detectedTouchEvents[frame]) {
  44. float distance = touchEvent.getDistanceTo(te);
  45. if (distance < maxDistance)
  46. return true;
  47. }
  48. return false;
  49. }
  50. }
  51. }