private void ReflectRecursive( List<Tile> tiles, Dictionary<Vector3D,bool> completed )
{
// Breadth first recursion.
if( 0 == tiles.Count )
return;
List<Tile> reflected = new List<Tile>();
foreach( Tile tile in tiles )
{
// We don't want to reflect tiles living out at infinity.
// Strange things happen, and we can still get the full tiling without doing this.
if( tile.HasPointsProjectedToInfinity )
continue;
// Are we done?
if( m_tiles.Count >= this.TilingConfig.MaxTiles )
return;
for( int s=0; s<tile.Boundary.NumSides; s++ )
{
Segment seg = tile.Boundary.Segments[s];
if( !NewTileAfterReflect( tile, seg, completed ) )
continue;
Tile newBase = tile.Clone();
newBase.Reflect( seg );
if( TransformAndAdd( newBase ) )
{
Debug.Assert( !completed.ContainsKey( newBase.Boundary.Center ) );
reflected.Add( newBase );
completed[newBase.Boundary.Center] = true;
}
}
}
ReflectRecursive( reflected, completed );
}