Я считаю, что это можно решить как ограниченную задачу минимизации, которая требует некоторого базового исчисления.,
Определения:
a, l -> rectangle sides
k -> number of squares
s -> side of the squares
Вы должны минимизировать функцию:
f[s]:= a * l/s^2 - k
с учетом ограничений:
IntegerPart[a/s] IntegerPart[l/s] - k >= 0
s > 0
Я запрограммировалмаленькая функция Mathematica, чтобы сделать трюк
f[a_, l_, k_] := NMinimize[{a l/s^2 - k ,
IntegerPart[a/s] IntegerPart[l/s] - k >= 0,
s > 0},
{s}]
Легко читается, так как уравнения те же, что и выше.
Используя эту функцию, я составил таблицу для выделения 6 квадратов
, насколько я вижу, результаты верны,
Как я уже сказал, вы можете использовать стандартный пакет исчисления для вашей среды, или вы можете также разработать свой собственный алгоритм и программы минимизации.Позвоните в звонок, если вы выберете последний вариант, и я предоставлю несколько хороших указателей.
HTH!
Редактировать
Просто для удовольствияЯ сделал сюжет с результатами.
И для 31 плитки:
Редактировать 2: Параметры характеристик
Задача имеет три характерных параметра:
- Итоговый размер плиток
- Количество плиток
- Отношение l / a окружающего прямоугольника
Возможно, последнее может несколько удивить, но это легко понять: если у вас есть проблема с прямоугольником 7х5 и размещением 6 плиток, посмотрите в приведенной выше таблице размер квадратовбудет 2,33.Теперь, если у вас есть прямоугольник 70x50, очевидно, что получающиеся плитки будут иметь размер 23,33, масштабируясь изометрически с проблемой.
Итак, мы можем взять эти три параметра и построить трехмерный график их взаимосвязи и в конечном итоге сопоставитькривая с некоторой функцией, которую легче вычислить (например, используя наименьшие квадраты или вычисляя области значений iso).
В любом случае, получающийся масштабированный график будет иметь вид: