using System; using System.Collections.Generic; using System.Drawing; using System.Diagnostics; using System.Linq; using System.Text; using System.Threading.Tasks; using bbiwarg.Recognition.TouchRecognition; using bbiwarg.Utility; namespace bbiwarg.Graphics { class TouchEventVisualizer { public OutputImage OutputImage { get; private set; } private int width, height; private Stopwatch timer; private Dictionary idTranslations; private Dictionary> positions; private Dictionary lastUpdates; private int nextFreeID; public TouchEventVisualizer(int width, int height) { this.width = width; this.height = height; reset(); } public void reset() { timer = new Stopwatch(); timer.Start(); nextFreeID = 1; idTranslations = new Dictionary(); positions = new Dictionary>(); lastUpdates = new Dictionary(); } public void touchDown(object sender, TouchEventArgs tea) { int id = nextFreeID; nextFreeID++; idTranslations.Add(tea.TrackID, id); positions.Add(id, new List()); positions[id].Add(tea.RelativePosition); lastUpdates.Add(id, timer.ElapsedMilliseconds); } public void touchMove(object sender, TouchEventArgs tea) { int id = idTranslations[tea.TrackID]; positions[id].Add(tea.RelativePosition); lastUpdates[id] = timer.ElapsedMilliseconds; } public void touchUp(object sender, TouchEventArgs tea) { int id = idTranslations[tea.TrackID]; positions[id].Add(tea.RelativePosition); lastUpdates[id] = timer.ElapsedMilliseconds; idTranslations.Remove(tea.TrackID); } public void updateImage() { //remove old positions long currentTime = timer.ElapsedMilliseconds; List ids = new List(lastUpdates.Keys); for (int i = ids.Count - 1; i >= 0; i--) { int id = ids[i]; if (currentTime - lastUpdates[id] > Constants.TouchEventVisualizerFadeOutTime) { positions.Remove(id); lastUpdates.Remove(id); } } OutputImage = new OutputImage(width, height); //border OutputImage.drawRectangle(0, 0, width - 1, height - 1, Constants.TouchEventVisualizerGridColor); //draw grid int numRows = Constants.PalmGridNumRows; int numColumns = Constants.PalmGridNumColumns; int widthPerColumn = width / numColumns; int heightPerRow = height / numRows; for (int i = 0; i <= numColumns; i++) { OutputImage.drawLineSegment(new LineSegment2D(new Vector2D(i * widthPerColumn, 0), new Vector2D(i * widthPerColumn, height - 1)), Constants.TouchEventVisualizerGridColor); } for (int i = 0; i <= numRows; i++) { OutputImage.drawLineSegment(new LineSegment2D(new Vector2D(0, i * heightPerRow), new Vector2D(width - 1, i * heightPerRow)), Constants.TouchEventVisualizerGridColor); } for (int row = 0; row < numRows; row++) { for (int col = 0; col < numColumns; col++) { int x = (int)((col+0.5f)*widthPerColumn)-5; int y = (int)((row+0.5f)*heightPerRow)+5; OutputImage.drawText(x,y,(1+row*numColumns+col).ToString(),Constants.TouchEventVisualizerTextColor); } } foreach (int id in positions.Keys) drawTouchGesture(positions[id], 1 - ((currentTime - lastUpdates[id]) / (float)Constants.TouchEventVisualizerFadeOutTime)); } public void drawTouchGesture(List positions, float opacity) { Vector2D maxPixel = new Vector2D(width - 1, height - 1); int numPositions = positions.Count; Color lineColor = Constants.TouchEventVisualizerLineColor; Color pointColor = Constants.TouchEventVisualizerPointColor; Color lineColorFaded = Color.FromArgb((int)(opacity * lineColor.R), (int)(opacity * lineColor.G), (int)(opacity * lineColor.B)); Color pointColorFaded = Color.FromArgb((int)(opacity * pointColor.R), (int)(opacity * pointColor.G), (int)(opacity * pointColor.B)); for (int i = 1; i < numPositions; i++) { OutputImage.drawLineSegment(new LineSegment2D(positions[i - 1].scale(maxPixel), positions[i].scale(maxPixel)), lineColorFaded); } Vector2D lastPos = positions[numPositions - 1].scale(maxPixel); OutputImage.fillCircle(lastPos.IntX, lastPos.IntY, 3, pointColorFaded); } } }