35 lines
1.7 KiB
C#
35 lines
1.7 KiB
C#
namespace View_by_Distance.Shared.Models.Stateless.Methods;
|
|
|
|
internal abstract class Closest
|
|
{
|
|
|
|
private static int Get(List<double> faceDistances) => (int)(Math.Round(faceDistances.Average(), Stateless.IClosest.Digits) * Stateless.ILocation.Factor);
|
|
|
|
private static Models.Closest Get(Models.Face face, DateTime minimumDateTime, FaceDistance faceDistance)
|
|
{
|
|
Models.Closest result;
|
|
int average = Get(faceDistance.Distances);
|
|
double minimum = faceDistance.Distances.Min();
|
|
long? ticksDelta;
|
|
if (faceDistance.IsWrongYear is null || faceDistance.IsWrongYear.Value)
|
|
ticksDelta = null;
|
|
else
|
|
{
|
|
ticksDelta = Math.Abs(faceDistance.MinimumDateTime.Ticks - minimumDateTime.Ticks);
|
|
if (faceDistance.MinimumDateTime < faceDistance.Mapping.PersonBirthday.Value)
|
|
ticksDelta *= 2;
|
|
}
|
|
if (face.Location?.NormalizedPixelPercentage is null)
|
|
throw new NullReferenceException(nameof(face.Location.NormalizedPixelPercentage));
|
|
result = new(average, face.Location.NormalizedPixelPercentage.Value, faceDistance.IsWrongYear, faceDistance.Mapping, minimum, faceDistance.MinimumDateTime, ticksDelta);
|
|
return result;
|
|
}
|
|
|
|
internal static Models.Closest[] GetCollection(Models.Face face, DateTime minimumDateTime, List<FaceDistance> faceDistances)
|
|
{
|
|
Models.Closest[] results;
|
|
Models.Closest[] closestCollection = (from l in faceDistances select Get(face, minimumDateTime, l)).ToArray();
|
|
results = (from l in closestCollection orderby l.Average, l.TicksDelta.HasValue, l.TicksDelta select l).ToArray();
|
|
return results;
|
|
}
|
|
} |