using System; using System.Collections.Generic; using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; using bbiwarg.Detectors.Touch; using bbiwarg.Utility; namespace bbiwarg.Graphics { class TouchEventVisualizer { public OutputImage OutputImage { get; private set; } private List kalmanFilters; private List> touchPositions; private int lastUpdated = -1; private int width, height; public TouchEventVisualizer(int width, int height) { this.width = width; this.height = height; OutputImage = new Graphics.OutputImage(width, height); touchPositions = new List>(); kalmanFilters = new List(); } public void addPalmTouchEvent(PalmTouchEvent e, int currentFrame) { List currentList; Kalman2DPositionFilter currentFilter; bool addList = false; if (lastUpdated == -1 || (currentFrame - lastUpdated) > 5) { currentList = new List(); currentFilter = new Kalman2DPositionFilter(e.RelativePalmPosition); addList = true; } else { currentList = touchPositions.Last>(); currentFilter = kalmanFilters.Last(); } Vector2D pos; if (currentFilter == null) { currentFilter = new Kalman2DPositionFilter(e.RelativePalmPosition); pos = e.RelativePalmPosition; } else { pos = currentFilter.getCorrectedPosition(e.RelativePalmPosition); } int size = Math.Min(width, height); currentList.Add(new Vector2D((int)(pos.X * size), (int)(size - pos.Y * size))); if (addList) { touchPositions.Add(currentList); kalmanFilters.Add(currentFilter); } lastUpdated = currentFrame; } public void updateImage() { OutputImage = new OutputImage(width, height); int size = Math.Min(width, height); OutputImage.drawRectangle(0, 0, size - 1, size - 1, Color.White); foreach (List positions in touchPositions) { for (int i = 1; i < positions.Count; ++i) { OutputImage.drawLineSegment(new LineSegment2D(positions[i - 1], positions[i]), Constants.TouchEventVisualizerLineColor); } if (touchPositions.Count != 0) OutputImage.fillCircle(positions.Last().IntX, positions.Last().IntY, 3, Constants.TouchEventVisualizerPointColor); } } public void Reset() { touchPositions.Clear(); OutputImage = new OutputImage(width, height); lastUpdated = -1; } } }