public bool CanWork(IShift shift) { if (_rules == null) { throw new ArgumentNullException("IBusinessRules", "Business Rules object must be set before CanWork can be called"); } if (ShiftDuration >= MaxShiftDuration) { return(false); } if (!_rules.AllowConsecutiveDays) { if (Shifts.Any(s => s.Day == shift.Day - 1)) { return(false); } } if (Shifts.Count(s => s.Day == shift.Day) >= _rules.MaxShiftsPerDay) { return(false); } return(true); }
public Point GetShift(Position cursor_position) { LastPosition = cursor_position; CursorPositionUpdated?.Invoke(this, new EventArgs()); var closest_indices = GetClosestShiftIndexes(cursor_position, Options.Instance.calibration_mode.considered_zones_count); if (closest_indices == null) { Debug.Assert(Shifts.Count() == 0); return(new Point(0, 0)); } double sum_of_reverse_distances = 0; foreach (var index in closest_indices) { sum_of_reverse_distances += (1 / index.Item2); } Point resulting_shift = new Point(0, 0); foreach (var index in closest_indices) { resulting_shift.X += (int)(Shifts[index.Item1].Shift.X / index.Item2 / sum_of_reverse_distances); resulting_shift.Y += (int)(Shifts[index.Item1].Shift.Y / index.Item2 / sum_of_reverse_distances); } return(resulting_shift); }
private List <Tuple <int /*index*/, double /*distance*/> > GetClosestShiftIndexes(Position cursor_position, int number) { if (Shifts.Count() == 0) { return(null); } var retval = new List <Tuple <int, double> >(); for (int i = 0; i < Shifts.Count(); i++) { double distance = Shifts[i].Position.GetDistance(cursor_position); if (distance < 0.1) { distance = 0.1; } if (retval.Count == 0) { retval.Add(new Tuple <int, double>(i, distance)); continue; } int j = 0; for (; j < retval.Count; j++) { if (distance < retval[j].Item2) { retval.Insert(j, new Tuple <int, double>(i, distance)); break; } } if (j == retval.Count) { retval.Add(new Tuple <int, double>(i, distance)); } if (retval.Count > number) { retval.RemoveAt(retval.Count - 1); } } return(retval); }
public void AddShift(Position cursor_position, Point shift) { var indices = GetClosestShiftIndexes(cursor_position, 2); if (indices != null && indices[0].Item2 < Options.Instance.calibration_mode.zone_size) { Shifts[indices[0].Item1] = new ShiftItem(cursor_position, shift); if (indices.Count > 1 && indices[1].Item2 < Options.Instance.calibration_mode.zone_size) { Shifts.RemoveAt(indices[1].Item1); } } else if (Shifts.Count() < Options.Instance.calibration_mode.max_zones_count) { Shifts.Add(new ShiftItem(cursor_position, shift)); } else { Shifts[GetClosestPointOfHihestDensity(cursor_position)] = new ShiftItem(cursor_position, shift); } AsyncSaver.Save(Filepath, GetDeepCopy); NotifyOnChange(); }