internal SignatureComparisonResult(SignatureComparisonFailureCollection failure) { _ = failure; }
public void Dispose() { _ = null; index = 0; }
/// <summary> /// Compares two Signature objects. /// </summary> /// <param name="original">The original recorded signature.</param> /// <param name="attempt">The attempt to compare.</param> /// <returns>The result of the comparison.</returns> static public SignatureComparisonResult Compare(Signature original, Signature attempt) { SignatureComparisonFailureCollection result = new SignatureComparisonFailureCollection(); if (original._c == attempt._c) { for (int i = 0; i < original._c; ++i) { SignatureData o = original._[i], a = attempt._[i]; double time = o.TimeOffset / a.TimeOffset; if (time <1 / Config.tt | time> Config.tt) { result.Add(new SignatureComparisonFailure(SignatureComparisonFailureCode.Timing, i)); } if (Math.Max(o.Length, a.Length) < Config.dst) { goto skip; } double length = o.Length / a.Length; if (length <1 / Config.lt | length> Config.lt) { result.Add(new SignatureComparisonFailure(SignatureComparisonFailureCode.Length, i)); } if (Math.Max(o.AngleChange, a.AngleChange) >= Config.mact) { double angleChange = o.AngleChange / a.AngleChange; if (angleChange <1 / Config.act | angleChange> Config.act) { result.Add(new SignatureComparisonFailure(SignatureComparisonFailureCode.AngleChange, i)); } double angleWobble = o.AngleWobble / a.AngleWobble; if (angleWobble <1 / Config.adt | angleWobble> Config.adt) { result.Add(new SignatureComparisonFailure(SignatureComparisonFailureCode.AngleWobble, i)); } } double startingAngle = Math.Abs(o.StartingAngle - a.StartingAngle); if (startingAngle > Config.sat) { result.Add(new SignatureComparisonFailure(SignatureComparisonFailureCode.StartingAngle, i)); } skip: if (Math.Max(o.PressureChange, a.PressureChange) >= Config.mpct) { double pressureChange = o.PressureChange / a.PressureChange; if (pressureChange <1 / Config.pct | pressureChange> Config.pct) { result.Add(new SignatureComparisonFailure(SignatureComparisonFailureCode.PressureChange, i)); } double pressureWobble = o.PressureWobble / a.PressureWobble; if (pressureWobble <1 / Config.pdt | pressureWobble> Config.pdt) { result.Add(new SignatureComparisonFailure(SignatureComparisonFailureCode.PressureWobble, i)); } } double startingPressure = Math.Abs(o.StartingPressure - a.StartingPressure); if (startingPressure > Config.spt) { result.Add(new SignatureComparisonFailure(SignatureComparisonFailureCode.StartingPressure, i)); } double startPoint = Math.Sqrt(Math.Pow(Math.Abs(o.Start.X - a.Start.X), 2) + Math.Pow(Math.Abs(o.Start.Y - a.Start.Y), 2)); if (startPoint > Config.set) { result.Add(new SignatureComparisonFailure(SignatureComparisonFailureCode.StartPoint, i)); } double endPoint = Math.Sqrt(Math.Pow(Math.Abs(o.End.X - a.End.X), 2) + Math.Pow(Math.Abs(o.End.Y - a.End.Y), 2)); if (endPoint > Config.set) { result.Add(new SignatureComparisonFailure(SignatureComparisonFailureCode.EndPoint, i)); } double directLinearSize = Math.Sqrt(Math.Pow(Math.Abs(o.Start.X - o.End.X), 2) + Math.Pow(Math.Abs(o.Start.Y - o.End.Y), 2)) / Math.Sqrt(Math.Pow(Math.Abs(a.Start.X - a.End.X), 2) + Math.Pow(Math.Abs(a.Start.Y - a.End.Y), 2)); if (directLinearSize <1 / Config.edt | directLinearSize> Config.edt) { result.Add(new SignatureComparisonFailure(SignatureComparisonFailureCode.DirectLinearSize, i)); } } } else { result.Add(new SignatureComparisonFailure(SignatureComparisonFailureCode.SegmentCount)); } return(new SignatureComparisonResult(result)); }
public Enumerator(SignatureComparisonFailureCollection collection) { _ = collection; }