/// <summary> /// Given two shreds, calculate the offset value at which the two shreds are most similar /// </summary> /// <param name="first"> The first shred staged for comparison </param> /// <param name="second"> The other shred staged for comparison </param> /// <param name="directionA"> Direction of this shred to be compared </param> /// <param name="orientationA"> Orientation of this shred to be compared </param> /// <param name="directionB"> Direction of the other shred to be compared </param> /// <param name="orientationB"> Orientiation of the other shred to be compared </param> /// <returns> Tuple containing the max similarity value and the offset at which that occured </returns> public static MatchData CompareShred(Shred first, Shred second, Direction directionA, Orientation orientationA, Direction directionB, Orientation orientationB) { Side sideA = new Side(first, directionA, orientationA); Side sideB = new Side(second, directionB, orientationB); double penalty = 1.0; if (ORIENTATION_PENALTY) { if (first.TrueOrienation != null && second.TrueOrienation != null) { if (!( (first.TrueOrienation == orientationA && second.TrueOrienation == orientationB) || (first.TrueOrienation == Enumeration.Opposite(orientationA) && second.TrueOrienation == Enumeration.Opposite(orientationB)))) { penalty = 0.15; } } } if (NORMALIZATION_ENABLED) { double max = Chamfer.NormalizedSimilarity( first.GetChamfer(directionA, orientationA), second.GetChamfer(directionB, orientationB)); double[] scan = new double[1]; return(new MatchData(max * penalty, 0, scan, sideA, sideB)); } else { double[] scan = Chamfer.ScanSimilarity( first.GetChamfer(directionA, orientationA), second.GetChamfer(directionB, orientationB)); Tuple <double, int> maxData = Utility.Max(scan); double max = maxData.Item1; int best = maxData.Item2; return(new MatchData(max * penalty, best, scan, sideA, sideB)); } }