/// <summary> /// Finds a tile and all its rotations, and sets their total frequency. /// </summary> public void SetFrequency(Tile tile, double frequency, TileRotation tileRotation) { var rotatedTiles = tileRotation.RotateAll(tile).ToList(); foreach (var rt in rotatedTiles) { int pattern = GetPattern(rt); frequencies[pattern] = 0.0; } var incrementalFrequency = frequency / rotatedTiles.Count; foreach (var rt in rotatedTiles) { int pattern = GetPattern(rt); frequencies[pattern] += incrementalFrequency; } }
public void Init(TilePropagator propagator) { ISet <Tile> actualEndPointTiles; if (TileRotation != null) { actualExits = new Dictionary <Tile, ISet <Direction> >(); foreach (var kv in Exits) { foreach (var rot in TileRotation.RotationGroup) { if (TileRotation.Rotate(kv.Key, rot, out var rtile)) { Direction Rotate(Direction d) { return(TopoArrayUtils.RotateDirection(propagator.Topology.AsGridTopology().Directions, d, rot)); } var rexits = new HashSet <Direction>(kv.Value.Select(Rotate)); actualExits[rtile] = rexits; } } } actualEndPointTiles = EndPointTiles == null ? null : new HashSet <Tile>(TileRotation.RotateAll(EndPointTiles)); } else { actualExits = Exits; actualEndPointTiles = EndPointTiles; } pathTileSet = propagator.CreateTileSet(Exits.Keys); pathSelectedTracker = propagator.CreateSelectedTracker(pathTileSet); endPointTileSet = EndPointTiles != null?propagator.CreateTileSet(actualEndPointTiles) : null; endPointSelectedTracker = EndPointTiles != null?propagator.CreateSelectedTracker(endPointTileSet) : null; graph = CreateEdgedGraph(propagator.Topology); tilesByExit = actualExits .SelectMany(kv => kv.Value.Select(e => Tuple.Create(kv.Key, e))) .GroupBy(x => x.Item2, x => x.Item1) .ToDictionary(g => g.Key, propagator.CreateTileSet); trackerByExit = tilesByExit .ToDictionary(kv => kv.Key, kv => propagator.CreateSelectedTracker(kv.Value)); }