private double ComputeScore() { const int minSupportingEdges = 1; const double distanceErrorFlatness = 0.69; const double angleErrorFlatness = 0.27; const double pairCountFactor = 0.032; const double pairFractionFactor = 8.98; const double correctTypeFactor = 0.629; const double supportedCountFactor = 0.193; const double edgeCountFactor = 0.265; const double distanceAccuracyFactor = 9.9; const double angleAccuracyFactor = 2.79; var score = pairCountFactor * PairCount; score += pairFractionFactor * (PairCount / (double)Template.Minutiae.Count + PairCount / (double)Candidate.Minutiae.Count) / 2; for (var i = 0; i < PairCount; ++i) { var pair = PairList[i]; if (pair.SupportingEdges >= minSupportingEdges) { score += supportedCountFactor; } score += edgeCountFactor * (pair.SupportingEdges + 1); if (Template.Minutiae[pair.Pair.Probe].Type == Candidate.Minutiae[pair.Pair.Candidate].Type) { score += correctTypeFactor; } } var innerDistanceRadius = Convert.ToInt32(distanceErrorFlatness * MaxDistanceError); var innerAngleRadius = Convert.ToInt32(angleErrorFlatness * MaxAngleError); var distanceErrorSum = 0; var angleErrorSum = 0; for (var i = 1; i < PairCount; ++i) { var pair = PairList[i]; var probeEdge = new EdgeShape(Template, pair.Reference.Probe, pair.Pair.Probe); var candidateEdge = new EdgeShape(Candidate, pair.Reference.Candidate, pair.Pair.Candidate); distanceErrorSum += Math.Abs(probeEdge.Length - candidateEdge.Length); angleErrorSum += Math.Max(innerDistanceRadius, Angle.Distance(probeEdge.ReferenceAngle, candidateEdge.ReferenceAngle)); angleErrorSum += Math.Max(innerAngleRadius, Angle.Distance(probeEdge.NeighborAngle, candidateEdge.NeighborAngle)); } if (PairCount < 2) { return(score); } var maxDistanceError = MaxDistanceError * (PairCount - 1); score += distanceAccuracyFactor * (maxDistanceError - distanceErrorSum) / maxDistanceError; var maxAngleError = MaxAngleError * (PairCount - 1) * 2; score += angleAccuracyFactor * (maxAngleError - angleErrorSum) / maxAngleError; return(score); }
private static int HashShape(EdgeShape edge) { return(((edge.ReferenceAngle / MaxAngleError) << 24) + ((edge.NeighborAngle / MaxAngleError) << 16) + edge.Length / MaxDistanceError); }