我製作了一個小算法,它可以讓我在紙上解決魔方的問題。製作魔方的物體模型
我現在想要實現它,但我找不到滿足我的對象表示。
我很容易看到一個rubiksCube對象和一個「立方體」對象,它可以通過一個面,一個角或一個邊來實現。
但是我需要一些對象來指定哪個地方是哪個立方體。
最後的目標是我可以輕鬆地做一些旋轉。
你對如何表達這個想法有想法嗎?
非常感謝您
我製作了一個小算法,它可以讓我在紙上解決魔方的問題。製作魔方的物體模型
我現在想要實現它,但我找不到滿足我的對象表示。
我很容易看到一個rubiksCube對象和一個「立方體」對象,它可以通過一個面,一個角或一個邊來實現。
但是我需要一些對象來指定哪個地方是哪個立方體。
最後的目標是我可以輕鬆地做一些旋轉。
你對如何表達這個想法有想法嗎?
非常感謝您
This CodeProject's article看起來正是你需要的。它有所有的動作和求解器funcs。
我將建立這樣的事情:
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;
}
看看rotation matrices。旋轉矩陣的美妙之處在於它們總是圍繞座標系的中心旋轉(0,0,0),當你有一堆點時(比如這裏),旋轉更像是一個圓形運動。
如果設定θ來(在Rx)的90°你
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)
(或其他任意的瓷磚集合),這是沒有意義的。但是這樣做會很愚蠢......所以不要這麼做;)
用5 x 5 x 5矩陣的顏色表示Rubik的立方體,其中只使用6個矩陣表面中的每一個的3 x 3箇中心矩陣位置代表顏色。
爲了旋轉Rubic的立方體的邊界片,你將不得不旋轉矩陣的兩個邊界片。只有旋轉一個矩陣切片才能旋轉中心切片。這種方法的優點是可以執行簡單的矩陣旋轉,並且可以在3D中進行翻轉。您不必從一些平面2D投影重建3D外觀。
注意:由於每個矩陣單元格只能存儲一種顏色,因此需要「誇大」大小。將兩個矩陣切片放在一起,可以爲邊緣存儲兩種顏色,爲角落存儲三種顏色。
我會看看,但有幾件事我現在還不完全明白。謝謝 – J4N
這是一個只有鏈接的答案,它在SO上通常不被接受。 – Jashaszun