private static void RotateTopLayer <T>(DataCube <T> cube, int top) { if (top < 0 || top > cube.Size) { throw new ArgumentOutOfRangeException("top"); } int max = cube.Size - 1; for (int i = 0; i < cube.Size / 2; i++) { for (int j = i; j < max - i; j++) { T temp = cube[j, top, i]; cube[j, top, i] = cube[i, top, max - j]; cube[i, top, max - j] = cube[max - j, top, max - i]; cube[max - j, top, max - i] = cube[max - i, top, j]; cube[max - i, top, j] = temp; } } for (int i = 0; i < cube.Size; i++) { for (int j = 0; j < cube.Size; j++) { IRotatable rotatable = cube[i, top, j] as IRotatable; if (rotatable != null) { rotatable.RotateAroundTop(); } } } }
private static void RotateDepthLayer <T>(DataCube <T> cube, int depth) { if (depth < 0 || depth > cube.Size) { throw new ArgumentOutOfRangeException("depth"); } int max = cube.Size - 1; for (int i = 0; i < cube.Size / 2; i++) { for (int j = i; j < max - i; j++) { T temp = cube[i, j, depth]; cube[i, j, depth] = cube[max - j, i, depth]; cube[max - j, i, depth] = cube[max - i, max - j, depth]; cube[max - i, max - j, depth] = cube[j, max - i, depth]; cube[j, max - i, depth] = temp; } } for (int i = 0; i < cube.Size; i++) { for (int j = 0; j < cube.Size; j++) { IRotatable rotatable = cube[i, j, depth] as IRotatable; if (rotatable != null) { rotatable.RotateAroundDepth(); } } } }
private static void RotateLeftLayer <T>(DataCube <T> cube, int left) { int max = cube.Size - 1; for (int i = 0; i < cube.Size / 2; i++) { for (int j = i; j < max - i; j++) { T temp = cube[left, i, j]; cube[left, i, j] = cube[left, max - j, i]; cube[left, max - j, i] = cube[left, max - i, max - j]; cube[left, max - i, max - j] = cube[left, j, max - i]; cube[left, j, max - i] = temp; } } for (int i = 0; i < cube.Size; i++) { for (int j = 0; j < cube.Size; j++) { IRotatable rotatable = cube[left, i, j] as IRotatable; if (rotatable != null) { rotatable.RotateAroundLeft(); } } } }
public RubiksCube(int size, Color[] colorMap) { if (size <= 0) throw new ArgumentOutOfRangeException("size", "size must be > 0."); if (colorMap == null) colorMap = defaultColors; if (colorMap.Length < 7) { throw new ArgumentException( "colorMap.Length must be not less than 7 (non-color + face colors)."); } dataCube = GetDefaultCube(size); view = new CubeView<DefaultCubePart>(dataCube, colorMap, true); this.colorMap = colorMap; }
public static void Rotate <T>(this DataCube <T> cube, Axis axis, int layer, bool clockwise) { if (cube == null) { throw new ArgumentNullException("cube"); } if (layer < 0 || layer >= cube.Size) { throw new ArgumentOutOfRangeException("layer"); } switch (axis) { case Axis.Left: RotateLeftLayer(cube, layer); break; case Axis.Top: RotateTopLayer(cube, layer); break; case Axis.Depth: RotateDepthLayer(cube, layer); break; } if (!clockwise) { switch (axis) { case Axis.Left: RotateLeftLayer(cube, layer); RotateLeftLayer(cube, layer); break; case Axis.Top: RotateTopLayer(cube, layer); RotateTopLayer(cube, layer); break; case Axis.Depth: RotateDepthLayer(cube, layer); RotateDepthLayer(cube, layer); break; } } }
public object Clone() { DataCube <T> clone = new DataCube <T>(Size); for (int i = 0; i < data.Length; i++) { ICloneable clonable = data[i] as ICloneable; if (data[i] != null) { clone.data[i] = (T)clonable.Clone(); } else { clone.data[i] = data[i]; } } return(clone); }
public void ReplaceCube(DataCube<SmallCube> newCube) { if (newCube == null) throw new ArgumentNullException("newCube"); if (newCube.Size != Size) throw new ArgumentException("newCube.Size must equals Size.", "newCube"); var replacer = new DataCube<SmallCube>(newCube.Size); int maxIndex = newCube.Size - 1; foreach (var coords in CubeCoords.EnumerateCube(Size)) { bool isOuterCube = coords.Left == 0 || coords.Left == maxIndex || coords.Top == 0 || coords.Top == maxIndex || coords.Depth == 0 || coords.Depth == maxIndex; if (isOuterCube) { if (newCube[coords] == null) { throw new ArgumentException( "Outer cube element at (" + coords.ToString() + ") is null.", "newCube"); } replacer[coords] = (SmallCube)newCube[coords].Clone(); } } if (view.AnimationInProgress) view.EndAnimation(); var viewReplacer = new CubeView<DefaultCubePart>( replacer, colorMap, true); viewReplacer.World = view.World; viewReplacer.Up = view.Up; viewReplacer.Look = view.Look; viewReplacer.Right = viewReplacer.Right; dataCube = replacer; view = viewReplacer; }
public CubeView(DataCube <SmallCube> model, Color[] colorMap, bool removeBlackParts) { if (colorMap == null) { throw new ArgumentNullException("colorMap"); } viewCube = new DataCube <CubePart>(model.Size); var partTransform = MatrixHelper.CreateScale(0.9f * 2f / model.Size); EmptyCubePart emptyPart = new EmptyCubePart(); int maxIndex = model.Size - 1; for (int i = 0; i < model.Size; i++) { for (int j = 0; j < model.Size; j++) { for (int k = 0; k < model.Size; k++) { bool isInnerCube = i != 0 && j != 0 && k != 0 && i != maxIndex && j != maxIndex && k != maxIndex; if (model[i, j, k] == null || removeBlackParts && isInnerCube) { viewCube[i, j, k] = emptyPart; } else { CubePart part = new TPart(); PaintCubePart(part, model[i, j, k], colorMap); part.World *= partTransform; part.Position = CoordsHelper.GetPositionFromCoords( new CubeCoords(i, j, k), model.Size); viewCube[i, j, k] = part; } } } } }
public static DataCube<SmallCube> GetDefaultCube(int size) { if (size <= 0) throw new ArgumentOutOfRangeException("size", "size must be > 0."); var bigCube = new DataCube<SmallCube>(size); int maxIndex = bigCube.Size - 1; for (int i = 0; i < bigCube.Size; i++) { for (int j = 0; j < bigCube.Size; j++) { for (int k = 0; k < bigCube.Size; k++) { SmallCube cube = null; if (i == 0) SetCubeSide(ref cube, CubeSide.Left, 1); if (i == maxIndex) SetCubeSide(ref cube, CubeSide.Right, 2); if (j == 0) SetCubeSide(ref cube, CubeSide.Up, 3); if (j == maxIndex) SetCubeSide(ref cube, CubeSide.Down, 4); if (k == 0) SetCubeSide(ref cube, CubeSide.Front, 5); if (k == maxIndex) SetCubeSide(ref cube, CubeSide.Back, 6); bigCube[i, j, k] = cube; } } } return bigCube; }