Я бы построил что-то вроде этого:
class Cube
{
List<Tile> Tiles = new List<Tile>(){
// Front Face
new Tile(Color.blue, -1, 1, 2), //top left corner tile
new Tile(Color.blue, 0, 1, 2), //top middle tile
new Tile(Color.blue, 1, 1, 2), //top right corner tile
new Tile(Color.blue, -1, 0, 2), //middle left tile
new Tile(Color.blue, 0, 0, 2), //center tile of this face
new Tile(Color.blue, 0, 1, 2), //…
new Tile(Color.blue, -1,-1, 2),
new Tile(Color.blue, 0,-1, 2),
new Tile(Color.blue, 1,-1, 2), //bottom right corner tile
…
};
Центр куба будет (0, 0, 0), и вы можете представить, как эти точки плавают над реальным кубом.Маленькие тайлы абстрагируются от точек и поэтому не нуждаются в ориентации.Таким образом, все плитки лицевой стороны имеют координату z 2, все плитки верхней грани имеют координату y 2, все плитки левой грани имеют координату x -2 и т. Д.
IEnumerable<Tile> TopLayer
{
get
{
return Tiles.Where(f => f.Position.Y == 2 || f.Position.Y == 1);
}
}
IEnumerable<Tile> BottomLayer {…}
Color getTileColor(int x,int y,int z)
{
return Tiles.Single(t => t.Position.X == x && t.Position.Y == y && t.Position.Z == z).Color;
}
Взгляните на матрицы вращения .Красота матриц вращения заключается в том, что они всегда вращаются вокруг центра системы координат (0, 0, 0), и когда у вас есть несколько точек (как здесь), вращение больше похоже на круговое движение.
Если выустановите θ на 90 ° (в Rx), вы получите
1 0 0
0 0 -1
0 1 0
, который можно перевести на следующий метод:
static void rotateLayerX(IEnumerable<Tile> layer)
{
foreach (var tile in layer)
{
var x = tile.Position.X;
var y = tile.Position.Y;
var z = tile.Position.Z;
tile.Position = new Point3D(x, -z, y);
}
}
Чем вам нужно только позвонить Cube.rotateLayerX(cube.LeftLayer)
.
} // class cube
class Tile
{
public Tile (Color c, int x, int y, int z)
{
Color = c;
Position = new Point3D(x,y,z);
}
Color Color { get; private set; } // enum Color {...}
Point3D Position { get; set; }
}
Это просто цветное облако точек.
И вы правы, эта вещь не является строго типизированной, и ее можно назвать Cube.rotateLayerX(Cube.TopLayer)
(или другой произвольный набор плиток), что не имеет смысла.Но делать это было бы глупо ... так что не делай этого;)