예제 #1
0
            public int[] FindPlace(Piece piece)
            {
                //Выполняет поиск места для блока и помечает это место как занятое
                //Возвращает координаты, оговоренные условием

                Dictionary<Axis, int> StartIndices = new Dictionary<Axis, int>(3);
                Dictionary<Axis, int> StopIndices = new Dictionary<Axis, int>(3);

                foreach (Axis axis in Enum.GetValues(typeof(Axis)))
                {
                    if (piece.AxisMask(axis, ".C"))
                    {
                        //Если блок должен прилегать к грани, удаленной от оси,
                        //начальный индекс поиска его места приравнивается к максимальному индексу
                        StartIndices[axis] = cutsLengths[axis].Count - 1;
                    }
                    else
                    {
                        StartIndices[axis] = 0;
                    }

                    if (piece.AxisMask(axis, "C."))
                    {
                        //Если блок должен прилегать к грани, проходящей через ось,
                        //конечный индекс поиска его места приравнивается к минимальному индексу плюс один
                        StopIndices[axis] = 1;
                    }
                    else
                    {
                        StopIndices[axis] = cutsLengths[axis].Count;
                    }
                }

                //Поиск места для блока полным перебором с промежуточными условиями,
                //Отражающими, подходит ли блок для данной плоскости(ряда) блоков
                for (int i = StartIndices[Axis.X]; i < StopIndices[Axis.X]; i++)
                {
                    if (cutsLengths[Axis.X][i] == piece.Measure[Axis.X])
                    {
                        for (int j = StartIndices[Axis.Y]; j < StopIndices[Axis.Y]; j++)
                        {
                            if (cutsLengths[Axis.Y][j] == piece.Measure[Axis.Y])
                            {
                                for (int k = StartIndices[Axis.Z]; k < StopIndices[Axis.Z]; k++)
                                {
                                    if (cutsLengths[Axis.Z][k] == piece.Measure[Axis.Z])
                                    {
                                        if (!Taken[i, j, k])
                                        {
                                            //Если блок подходит по размерам и это место еще не занято,
                                            //Оно занимается и возвращаются координаты, оговоренные условием
                                            Taken[i, j, k] = true;
                                            return new int[] { cutsPositions[Axis.X][i], cutsPositions[Axis.Y][j], cutsPositions[Axis.Z][k] };
                                        }
                                    }
                                }
                            }
                        }
                    }
                }

                //Если подходящий блок не найден, возвращаются нулевые координаты.
                return new int[] { 0, 0, 0 };
            }