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 }; }