private void FindNearestItems(PointD position) { IEnumerable <ITileCoordinate <Tile> > result = TrackContent.Tiles.FindNearest(position, bottomLeft, topRight); if (result.First() != nearestGridTile) { nearestGridTile = result.First() as GridTile; } if (Scale < 1) { return; } double distance = double.MaxValue; foreach (TrackItemBase trackItem in TrackContent.TrackItems[nearestGridTile.Tile]) { double itemDistance = trackItem.Location.DistanceSquared(position); if (itemDistance < distance) { nearestTrackItem = trackItem; distance = itemDistance; } } distance = double.MaxValue; foreach (TrackSegment trackSegment in TrackContent.TrackSegments[nearestGridTile.Tile]) { double itemDistance = position.DistanceToLineSegmentSquared(trackSegment.Location, trackSegment.Vector); if (itemDistance < distance) { nearestTrackSegment = trackSegment; distance = itemDistance; } } distance = double.MaxValue; foreach (RoadSegment trackSegment in TrackContent.RoadSegments[nearestGridTile.Tile]) { double itemDistance = position.DistanceToLineSegmentSquared(trackSegment.Location, trackSegment.Vector); if (itemDistance < distance) { nearesRoadSegment = trackSegment; distance = itemDistance; } } }
private void AddTrackItems() { TrackItems = new TileIndexedList <TrackItemBase, Tile>(TrackItemBase.Create(trackDB?.TrackItems, SignalConfigFile, trackDB, TrackNodeSegments).Concat(TrackItemBase.Create(roadTrackDB?.TrItemTable))); }