2011-07-30 24 views
2

我製作了一個小算法,它可以讓我在紙上解決魔方的問題。製作魔方的物體模型

我現在想要實現它,但我找不到滿足我的對象表示。

我很容易看到一個rubiksCube對象和一個「立方體」對象,它可以通過一個面,一個角或一個邊來實現。

但是我需要一些對象來指定哪個地方是哪個立方體。

最後的目標是我可以輕鬆地做一些旋轉。

你對如何表達這個想法有想法嗎?

非常感謝您

回答

3

This CodeProject's article看起來正是你需要的。它有所有的動作和求解器funcs。

+0

我會看看,但有幾件事我現在還不完全明白。謝謝 – J4N

+0

這是一個只有鏈接的答案,它在SO上通常不被接受。 – Jashaszun

2

我將建立這樣的事情:

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)(或其他任意的瓷磚集合),這是沒有意義的。但是這樣做會很愚蠢......所以不要這麼做;)

+0

我認爲使用這種結構很難做旋轉(這不是面向對象的) – J4N

+0

但我不明白如何建模方向。你只有x-y-z的位置,所以我們現在可以在W的位置上找到A片,但是哪張臉又有哪個方向? – J4N

+0

我希望我的最後一次編輯可以幫助您理解我的想法......我不模擬面孔,我只模擬了面磚(並且面部由9個面磚組成)。 –

2

用5 x 5 x 5矩陣的顏色表示Rubik的立方體,其中只使用6個矩陣表面中的每一個的3 x 3箇中心矩陣位置代表顏色。

enter image description here

爲了旋轉Rubic的立方體的邊界片,你將不得不旋轉矩陣的兩個邊界片。只有旋轉一個矩陣切片才能旋轉中心切片。這種方法的優點是可以執行簡單的矩陣旋轉,並且可以在3D中進行翻轉。您不必從一些平面2D投影重建3D外觀。


注意:由於每個矩陣單元格只能存儲一種顏色,因此需要「誇大」大小。將兩個矩陣切片放在一起,可以爲邊緣存儲兩種顏色,爲角落存儲三種顏色。