/// <summary> /// Remove all locations from the collection which overlap locations on the specified section /// </summary> /// <param name="locations">The collection to remove overlapping locations from</param> /// <returns>The removed locations which overlap</returns> private static List<Location_CanvasViewModel> RemoveOverlappingLocations(List<Location_CanvasViewModel> locations, int section_number) { List<Location_CanvasViewModel> listOverlappingLocations = new List<Location_CanvasViewModel>(locations.Count); for (int i = locations.Count - 1; i >= 0; i--) { Location_CanvasViewModel loc = locations.ElementAt(i); if (loc.TypeCode == LocationType.CIRCLE) { GridCircle locCircle = new GridCircle(loc.VolumePosition, loc.OffSectionRadius); foreach (long linked in loc.Links) { LocationObj LinkedObj = Store.Locations.GetObjectByID(linked, false); if (LinkedObj == null) continue; if (LinkedObj.Section == section_number) { if (locCircle.Intersects(LinkedObj.VolumePosition, LinkedObj.Radius)) { listOverlappingLocations.Add(loc); locations.RemoveAt(i); break; } } } } } return listOverlappingLocations; }
private static List<Location_CanvasViewModel> FindVisibleLocations(ICollection<Location_CanvasViewModel> locations, GridRectangle VisibleBounds) { GridCircle VisibleCircle = new GridCircle(VisibleBounds.Center, GridVector2.Distance(VisibleBounds.Center, new GridVector2(VisibleBounds.Left, VisibleBounds.Top))); List<Location_CanvasViewModel> listLocationsToDraw = new List<Location_CanvasViewModel>(locations.Count); foreach (Location_CanvasViewModel loc in locations) { if (loc == null) continue; if (!loc.VolumePositionHasBeenCalculated) continue; //Find out if we should draw the location if (loc.TypeCode == LocationType.CIRCLE) { if (VisibleCircle.Intersects(loc.VolumePosition, loc.Radius) == false) continue; } else if (loc.TypeCode == LocationType.POINT) { if (VisibleBounds.Contains(loc.VolumePosition) == false) continue; } else { Debug.Fail("Unknown location type"); } Structure ParentStructure = loc.Parent; if (ParentStructure == null) continue; if (ParentStructure.Type == null) continue; listLocationsToDraw.Add(loc); } return listLocationsToDraw; }