Я работал над чем-то похожим. Я отдаю приоритет простоте, а не получаю максимально возможное соотношение сторон. Это должно (в теории) работать. Протестировано на бумаге для некоторых значений N от 1 до 10.
N = общее количество создаваемых ректов,
Q = max (ширина, высота) / min (ширина, высота),
R = N / Q
Если Q> N / 2, разбить прямоугольник на N частей вдоль его самой длинной стороны.
Если Q <= N / 2, разделите прямоугольник на R (округленные int) части вдоль его самой короткой стороны.
Затем разделите субрекции на N / R (округленные до int) части вдоль его самой короткой стороны.
Вычтите округленное значение из результата следующего подразделения subrects. Повторите эти действия для всех подразделов или до тех пор, пока не будет создано необходимое количество повторений. </p>