Я предлагаю:
Начните с установки многоугольника с четырьмя вершинами, которые нужно съесть с кусочками прямоугольника различного размера (вплоть до макс.):
public double[] fillBoard(double width, double height, double maxside) {
double[] dest = new int[0];
double[] poly = new int[10];
poly[0] = 0; poly[1] = 0; poly[2] = width; poly[3] = 0;
poly[4] = width; poly[5] = height; poly[6] = 0; poly[7] = height;
poly[8] = 0; poly[9] = 0;
...
return dest; /* x,y pairs */
}
Затем выберите случайную вершину, найдите линии многоугольника в пределах (включительно) 2 X максимальной стороны линии.
Найти значения x всех вертикальных линий и значения y всех горизонтальных линий. Создайте оценки для «правильности» выбора каждого значения x и y, а также уравнения для создания оценок для значений между значениями. Добротность измеряется как уменьшение количества линий в оставшемся многоугольнике. Сгенерируйте три варианта для каждого диапазона значений между двумя координатами x или двумя координатами y, используя псевдослучайный генератор. Оцените и выберите пары значений x и пары y на основе средневзвешенного значения, опираясь на хорошие варианты. Примените новый прямоугольник к списку, вырезав его форму из массива poly и добавив координаты прямоугольника к массиву dest.
В вопросе не указан минимальный побочный параметр. Но если это необходимо, алгоритм должен (при попадании в заминку с слишком маленьким зазором) не включать слишком малые кандидаты в списки выбора (что иногда делает их пустыми) и отменять выбор количества окружающих прямоугольников в определенном радиусе проблема с размером и выполнить новые попытки регенерации этой области, и, надеюсь, проблемной области, пока критерии не будут выполнены. Рекурсия может удалить постепенно увеличивающиеся области, если меньшая ретрансляция тайлов не удалась.
EDIT
Проведите тестирование на попадание, чтобы устранить возможные совпадения. И есть шпинат, прежде чем начать печатать. ;)