Кто-нибудь хочет поиграть в Тетрис (часть вашей проблемы)?
Это известно как проблема с упаковкой .Не зная, с какими формами вы, вероятно, столкнетесь раньше времени, может быть очень трудно, если не невозможно, придумать алгоритм, который даст вам лучший ответ.Скорее всего, если ваши полигоны не являются «хорошими» полигонами (кружками, квадратами, равносторонними треугольниками и т. Д.), Вам, вероятно, придется согласиться на эвристику, которая в большинстве случаев дает вам примерное наилучшее решение.Общая эвристика (хотя далеко не оптимальная в зависимости от формы входного многоугольника) будет заключаться в том, чтобы упростить задачу, нарисовав прямоугольник вокруг многоугольника так, чтобы прямоугольник был достаточно большим, чтобы покрыть многоугольник.(В качестве примера на диаграмме ниже мы рисуем красный прямоугольник вокруг синего многоугольника.)
Как только мы это сделаем, мы можем затем взять этот прямоугольник и попытаться уместить его.как можно больше этого прямоугольника в большой прямоугольник.Это упрощает проблему в проблему упаковки прямоугольника, которую легче решить и обернуть голову вокруг.Пример алгоритма для этого находится по следующей ссылке:
Эффективный подход рекурсивного разбиения для упаковки одинаковых прямоугольников в прямоугольник .
Теперь, очевидно, эта эвристикане является оптимальным, когда рассматриваемый многоугольник не похож на форму прямоугольника, но дает минимальную базовую линию для работы, особенно если у вас мало знаний о том, как будет выглядеть ваш многоугольник (иливысокая дисперсия в том, как будет выглядеть многоугольник).Используя этот алгоритм, он заполнил бы большой прямоугольник следующим образом:
Вот то же изображение без промежуточных прямоугольников:
Для случая этих Т-образных многоугольников эвристика не самая лучшая (на самом деле это может быть почти наихудший сценарий для этого предложенного приближения), но она будет очень хорошо работать для других типовмногоугольники.