internal void Update(DISP_Car car, VmPolyline zone, MovedLocationCollection routeOpacited) { if (!car.Equals(SelectedCar)) { SelectedCar = car; } Application.Current.Dispatcher.BeginInvoke(new Action(() => CarsInOut.Clear())); foreach (var location in routeOpacited) { var inzone = CalcLeavingZone.Instance.FillContains(location, zone.MovedLocations); if (_findError) { if (inzone) { continue; } AddCarToErrorLog(car, zone, location.Dates); _findError = false; } else { if (!inzone) { continue; } AddBackCarToErrorLog(car, zone, location.Dates); _findError = true; } } }
public bool FillContains(Location point, MovedLocationCollection geometry) { Point Position = Transform(point); var Points = geometry.Select(l => new { X = Transform(l).X - Position.X, Y = Position.Y - Transform(l).Y, atan = Math.Atan2(Position.Y - Transform(l).Y, Transform(l).X - Position.X) }).ToList(); Points.Add(Points[0]); double result = 0; for (int i = 0; i < Points.Count() - 1; i++) { double atan = Points[i].atan - Points[i + 1].atan; if (Math.Abs(atan) > Math.PI) { atan -= Math.PI * Math.Sign(atan); } result += atan; } return(Math.Abs(result) > 1); }
public VmPolyline(int id, string name, string coordinate) { this.ID = id; this.Name = name; if (string.IsNullOrEmpty(coordinate)) { return; } MovedLocationCollection coord = MovedLocationCollection.Parse(coordinate); if (coord.Count <= 0) { return; } foreach (var el in coord) { AddLocation(el, false); } }