public List<IPrimitiveConditionData> GenerateRules(List<TouchPoint2> points) { List<IPrimitiveConditionData> returnList = new List<IPrimitiveConditionData>(); // Do all the possible combinations for (int j = 0; j < points.Count - 1; j++) { //If it's a blob, leave it if (!points[j].isFinger) { returnList.Add(null); continue; } var stylusPoints1 = TrigonometricCalculationHelper.removeRedundancy(points[j].Stroke.StylusPoints); if (stylusPoints1.Count < 4) // It's a point { returnList.Add(null); continue; } ValidSetOfTouchPoints line1 = ValidateLine(points[j]); if (line1.Count > 0) { for (int i = j + 1; i < points.Count; i++) { //Check to see if it is a point var stylusPoints2 = TrigonometricCalculationHelper.removeRedundancy(points[i].Stroke.StylusPoints); if (stylusPoints2.Count == 0) continue; // check to see if the two sets of points are lines ValidSetOfTouchPoints line2 = ValidateLine(points[i]); if (line2.Count == 0) continue; // Considering that they are two lines, the angle will only be check if their edges are nearby if (!linesTouch(stylusPoints1, stylusPoints2)) { returnList.Add(null); continue; } // Calculate slope of each line represented by the two sets of touch points // as the final of a line is usually fuzzy, get the middle points(1/4,3/4), that have a more fixed pattern int avg1 = stylusPoints1.Count; int avg2 = stylusPoints2.Count; double set1Angle = TrigonometricCalculationHelper.GetSlopeBetweenPoints(stylusPoints1[avg1 / 4], stylusPoints1[avg1 * 3 / 4]); double set2Angle = TrigonometricCalculationHelper.GetSlopeBetweenPoints(stylusPoints2[avg2 / 4], stylusPoints2[avg2 * 3 / 4]); double angularDiff = (set1Angle - set2Angle) * 180 / 3.14; if (angularDiff < 0) angularDiff = 180 + angularDiff; if (angularDiff > 180) angularDiff = angularDiff - 180; AngleBetween result = new AngleBetween(); result.Gesture1 = (j + 1) + ""; result.Gesture2 = (i + 1) + ""; result.Min = angularDiff; returnList.Add(result); } } } return returnList; }
public void Init(IPrimitiveConditionData ruleData) { _data = ruleData as AngleBetween; }