Exemplo n.º 1
0
 internal SignatureComparisonResult(SignatureComparisonFailureCollection failure)
 {
     _ = failure;
 }
 public void Dispose()
 {
     _     = null;
     index = 0;
 }
Exemplo n.º 3
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;
 }