public static void FillDay(DayOfTrip dayOfTrip, List <ActivityPoint> remainedActivities, Dictionary <eActivityType, int> preferences) { TimeWindow timeWindow; //sort first by near to main acitivity then by user prefrences //TODO: add sort by rank var sortedByLocationAcitivities = remainedActivities.OrderBy(a => LocationUtils.HaversineDistance(new Location(a.GEPSLatitude, a.GEPSLongtitude), new Location(dayOfTrip.MainActivity.Activity.GEPSLatitude, dayOfTrip.MainActivity.Activity.GEPSLongtitude))) .ThenByDescending(a => GetMatchGrade(a, preferences)).ToList(); while ((timeWindow = dayOfTrip.GetNextEmptyTimeWindow()) != null) { List <ActivityTimeSlot> activities = null; foreach (var activity in sortedByLocationAcitivities) { if ((activities = TryFindTimeForActivityAndTravel(activity, timeWindow)) != null) { dayOfTrip.AppendActivities(activities); sortedByLocationAcitivities.Remove(activity); remainedActivities.Remove(activity); break; } } if (activities == null) { dayOfTrip.AddActivity(new ActivityTimeSlot(timeWindow.TimeSlot, null)); } } dayOfTrip.SortedActivities.RemoveAll(a => a.Activity == null && a.IsTraveling == false); //Remove empty time slots }
public static bool IsNearBy(ActivityPoint activityPoint, Location startPoint, int nearByDistanceKm) { return(LocationUtils.HaversineDistance(new Location(activityPoint.GEPSLatitude, activityPoint.GEPSLongtitude), startPoint) <= nearByDistanceKm); }