40 lines
1.9 KiB
C#
40 lines
1.9 KiB
C#
namespace View_by_Distance.Shared.Models.Stateless.Methods;
|
|
|
|
internal abstract class Sorting
|
|
{
|
|
|
|
internal static Models.Sorting Get(int faceDistancePermyriad, double rangeDistanceTolerance, Models.FaceDistance faceDistanceEncoding, Models.FaceDistance faceDistanceLength, List<(long lcl, long minimum, long maximum, long ucl)> personKeysRangesCollection)
|
|
{
|
|
Models.Sorting result;
|
|
if (faceDistanceLength.Length is null)
|
|
throw new NotSupportedException();
|
|
if (faceDistanceLength.NormalizedPixelPercentage is null)
|
|
throw new NotSupportedException();
|
|
if (faceDistanceEncoding.MinimumDateTime is null || faceDistanceLength.MinimumDateTime is null)
|
|
throw new NotSupportedException();
|
|
List<int> withinRanges = new();
|
|
long ticks = faceDistanceEncoding.MinimumDateTime.Value.Ticks;
|
|
TimeSpan timeSpan = new(faceDistanceLength.MinimumDateTime.Value.Ticks - ticks);
|
|
bool older = timeSpan.TotalMilliseconds < 0;
|
|
int daysDelta = (int)Math.Round(Math.Abs(timeSpan.TotalDays), 0);
|
|
int distancePermyriad = (int)(faceDistanceLength.Length.Value / rangeDistanceTolerance * faceDistancePermyriad);
|
|
if (!personKeysRangesCollection.Any())
|
|
withinRanges.Add(0);
|
|
else
|
|
{
|
|
foreach ((long lcl, long minimum, long maximum, long ucl) in personKeysRangesCollection)
|
|
{
|
|
if (ticks > minimum && ticks < maximum)
|
|
withinRanges.Add(0);
|
|
else if (ticks > lcl && ticks < ucl)
|
|
withinRanges.Add(1);
|
|
else
|
|
withinRanges.Add(2);
|
|
}
|
|
}
|
|
int withinRange = withinRanges.Max();
|
|
result = new(daysDelta, distancePermyriad, faceDistanceLength.Id, faceDistanceLength.NormalizedPixelPercentage.Value, older, withinRange);
|
|
return result;
|
|
}
|
|
|
|
} |