/// <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));
}
}