紙の上のルービックキューブを解像できる小さなアルゴを作りました。
実装したいのですが、満足のいくオブジェクト表現が見つかりません。
ルービックキューブオブジェクトと、面、角、またはエッジで実装できる「立方体」オブジェクトを簡単に見ることができます。
しかし、どの場所にどの立方体があるかを指定するために、間にいくつかのオブジェクトが必要です。
最終的な目標は、簡単に回転できるようにすることです。
これをどのように表現するかについてのアイデアはありますか?
どうもありがとうございます
紙の上のルービックキューブを解像できる小さなアルゴを作りました。
実装したいのですが、満足のいくオブジェクト表現が見つかりません。
ルービックキューブオブジェクトと、面、角、またはエッジで実装できる「立方体」オブジェクトを簡単に見ることができます。
しかし、どの場所にどの立方体があるかを指定するために、間にいくつかのオブジェクトが必要です。
最終的な目標は、簡単に回転できるようにすることです。
これをどのように表現するかについてのアイデアはありますか?
どうもありがとうございます
この CodeProject の記事はまさにあなたが必要としているものです。すべての動きとソルバー機能も備えています。
私はこのようなものを構築します:
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)
(または他の任意のタイルのコレクション)である可能性がありますが、これは意味がありません。しかし、これを行うのはばかげているでしょう…だからそれをしないでください;)
ルービック キューブを 5 x 5 x 5 の色のマトリックスで表します。ここで、6 つのマトリックス サーフェスのそれぞれの 3 x 3 の中心マトリックス位置のみを使用して色を表します。
ルービック キューブの境界スライスを回転させるには、マトリックスの 2 つの境界スライスを回転させる必要があります。中央のスライスは、1 つのマトリックス スライスのみを回転させることで回転できます。このアプローチの利点は、単純な行列の回転を実行できることと、3D で何でもできることです。フラットな 2D 投影から 3D の外観を再構築する必要はありません。
注: マトリックス セルごとに 1 つの色しか格納できないため、この「誇張された」サイズが必要です。2 つのマトリックス スライスをまとめると、エッジに 2 色、コーナーに 3 色を格納できます。