예제 #1
0
        public void Flip(Axis _axis)
        {
            Vector3 sizeAll = SizeAll;

            for (int i = 0; i < MatrixList.Count; i++)
            {
                QbMatrix qm = MatrixList[i];

                for (int x = 0; x < (_axis == Axis.X ? qm.SizeX * 0.5f : qm.SizeX); x++)
                {
                    for (int y = 0; y < (_axis == Axis.Y ? qm.SizeY * 0.5f : qm.SizeY); y++)
                    {
                        for (int z = 0; z < (_axis == Axis.Z ? qm.SizeZ * 0.5f : qm.SizeZ); z++)
                        {
                            int ii = _axis == Axis.X ? (int)qm.SizeX - x - 1 : x;
                            int jj = _axis == Axis.Y ? (int)qm.SizeY - y - 1 : y;
                            int kk = _axis == Axis.Z ? (int)qm.SizeZ - z - 1 : z;
                            int _b = qm.Voxels[x, y, z];
                            qm.Voxels[x, y, z]    = qm.Voxels[ii, jj, kk];
                            qm.Voxels[ii, jj, kk] = _b;
                        }
                    }
                }
                qm.PosX       = _axis == Axis.X ? (int)sizeAll.x - qm.PosX - (int)qm.SizeX : qm.PosX;
                qm.PosY       = _axis == Axis.Y ? (int)sizeAll.y - qm.PosY - (int)qm.SizeY : qm.PosY;
                qm.PosZ       = _axis == Axis.Z ? (int)sizeAll.z - qm.PosZ - (int)qm.SizeZ : qm.PosZ;
                MatrixList[i] = qm;
            }
        }
예제 #2
0
        public void Rotate(Axis _axis, bool reverse = false)
        {
            for (int index = 0; index < MatrixList.Count; index++)
            {
                QbMatrix qm = MatrixList[index];

                int _newSizeX = qm.SizeX;
                int _newSizeY = qm.SizeY;
                int _newSizeZ = qm.SizeZ;
                int _newPosX  = qm.PosX;
                int _newPosY  = qm.PosY;
                int _newPosZ  = qm.PosZ;
                int[,,] _newByte = null;

                switch (_axis)
                {
                case Axis.X:
                    _newSizeY = qm.SizeZ;
                    _newSizeZ = qm.SizeY;
                    _newPosY  = qm.PosZ;
                    _newPosZ  = qm.PosY;
                    _newByte  = new int[_newSizeX, _newSizeY, _newSizeZ];
                    for (int i = 0; i < qm.SizeX; i++)
                    {
                        for (int j = 0; j < qm.SizeY; j++)
                        {
                            for (int k = 0; k < qm.SizeZ; k++)
                            {
                                _newByte[i, k, j] = qm.Voxels[i, j, k];
                            }
                        }
                    }

                    qm.SizeY          = _newSizeY;
                    qm.SizeZ          = _newSizeZ;
                    qm.PosY           = _newPosY;
                    qm.PosZ           = _newPosZ;
                    qm.Voxels         = _newByte;
                    MatrixList[index] = qm;
                    break;

                case Axis.Y:
                    _newSizeX = qm.SizeZ;
                    _newSizeZ = qm.SizeX;
                    _newPosX  = qm.PosZ;
                    _newPosZ  = qm.PosX;
                    _newByte  = new int[_newSizeX, _newSizeY, _newSizeZ];
                    for (int i = 0; i < qm.SizeX; i++)
                    {
                        for (int j = 0; j < qm.SizeY; j++)
                        {
                            for (int k = 0; k < qm.SizeZ; k++)
                            {
                                _newByte[k, j, i] = qm.Voxels[i, j, k];
                            }
                        }
                    }
                    qm.SizeX          = _newSizeX;
                    qm.SizeZ          = _newSizeZ;
                    qm.PosX           = _newPosX;
                    qm.PosZ           = _newPosZ;
                    qm.Voxels         = _newByte;
                    MatrixList[index] = qm;
                    break;

                case Axis.Z:
                    _newSizeX = qm.SizeY;
                    _newSizeY = qm.SizeX;
                    _newPosX  = qm.PosY;
                    _newPosY  = qm.PosX;
                    _newByte  = new int[_newSizeX, _newSizeY, _newSizeZ];
                    for (int i = 0; i < qm.SizeX; i++)
                    {
                        for (int j = 0; j < qm.SizeY; j++)
                        {
                            for (int k = 0; k < qm.SizeZ; k++)
                            {
                                _newByte[j, i, k] = qm.Voxels[i, j, k];
                            }
                        }
                    }
                    qm.SizeX          = _newSizeX;
                    qm.SizeY          = _newSizeY;
                    qm.PosX           = _newPosX;
                    qm.PosY           = _newPosY;
                    qm.Voxels         = _newByte;
                    MatrixList[index] = qm;
                    break;
                }
            }


            switch (_axis)
            {
            case Axis.X:
                if (reverse)
                {
                    Flip(Axis.Z);
                }
                else
                {
                    Flip(Axis.Y);
                }
                break;

            case Axis.Y:
                if (reverse)
                {
                    Flip(Axis.X);
                }
                else
                {
                    Flip(Axis.Z);
                }
                break;

            case Axis.Z:
                if (reverse)
                {
                    Flip(Axis.Y);
                }
                else
                {
                    Flip(Axis.X);
                }
                break;
            }
        }