Ejemplo n.º 1
0
        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();
                    }
                }
            }
        }
Ejemplo n.º 2
0
        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();
                    }
                }
            }
        }
Ejemplo n.º 3
0
        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();
                    }
                }
            }
        }
Ejemplo n.º 4
0
        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;
        }
Ejemplo n.º 5
0
        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;
                }
            }
        }
Ejemplo n.º 6
0
        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);
        }
Ejemplo n.º 7
0
        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;
        }
Ejemplo n.º 8
0
        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;
                        }
                    }
                }
            }
        }
Ejemplo n.º 9
0
        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;
        }