//*************************************** // AverageDistanceWithAnomalies // // use: calculates the average difference between // the points of two gestures but weighing // those which deviate significantly by // multiplying them // Both the tightness of this and the factor // of multiplication are customizable // above // // param: playerGesture: first to be compared // template: gesture to be compared against // // return: returns float value of the average distance // between points of two parameter gestures // with weights private float AverageDifferenceWithAnomalies(DrawnGesture playerGesture, DrawnGesture template) { int numPoints = playerGesture.GetNumPoints(); if (numPoints != template.GetNumPoints()) { Debug.Log("Number of points differs from templates"); return(-1f); } float totalDifference = 0; float[] sampleDifferences = new float[numPoints]; float[] sampleDeviations = new float[numPoints]; float standardDev = 0; for (int i = 0; i < numPoints; i++) { float thisDistance = PointDistance(playerGesture.GetPoints()[i], template.GetPoints()[i]); sampleDifferences[i] = thisDistance; totalDifference += thisDistance; } float average = totalDifference / numPoints; for (int i = 0; i < numPoints; i++) { sampleDeviations[i] = Math.Abs(sampleDifferences[i] - average); standardDev += sampleDifferences[i]; } standardDev = standardDev / numPoints; for (int i = 0; i < numPoints; i++) { if (Math.Abs(sampleDeviations[i]) > devTightness * standardDev) { totalDifference -= sampleDifferences[i]; totalDifference += anomaliesFactor * sampleDifferences[i]; } } average = totalDifference / numPoints; return(average); }
//*************************************** // AverageDifference // // use: caluclates the average distance between // the points of two gestures // // param: playerGesture: first to be compared // template: gesture to be compared against // // return: returns float value of the average distance // between points of two parameter gestures private float AverageDifference(DrawnGesture playerGesture, DrawnGesture template) { int numPoints = playerGesture.GetNumPoints(); if (numPoints != template.GetNumPoints()) { Debug.Log("Number of points differs from templates"); return(-1f); } float totalDifference = 0; for (int i = 0; i < numPoints; i++) { totalDifference += PointDistance(playerGesture.GetPoints()[i], template.GetPoints()[i]); } return(totalDifference / numPoints); }
//*************************************** // EndGesture // // use: Resets control bools and other variables // records gesture to the templates object // or calls recognition. // Called when max recording points reached. private void EndGesture() { if (inputReady) { inputReady = false; } gestureStarted = false; gestureComplete = true; Rescale(currentGesture); MapPoints(currentGesture); if (recording) { currentGesture.SetName(templateSaveName); templates.templates.Add(new DrawnGesture(currentGesture.GetName(), pointsPerGesture, currentGesture.GetMaxX(), currentGesture.GetMaxY(), currentGesture.GetMinX(), currentGesture.GetMinY(), currentGesture.GetPoints())); SaveTemplates(); } else { DrawnGesture m = FindMatch(currentGesture, templates); Debug.Log(m.GetName()); } varReset(); }