Нужна помощь в объединении некоторых прямоугольников


Скриншот того, что у меня есть (слева) и чего я пытаюсь достичь (справа)

Привет, у меня есть этот беспорядок слева, это в значительной степени массив прямоугольников с некоторыми отверстиями (отмеченными красным цветом). Я ищу способ объединить их таким образом, чтобы у меня получилось как можно меньше прямоугольников, и желательно, чтобы большинство из них были как можно ближе к квадратам. Посмотрите на изображение справа, это то, что я пытаюсь сделать, просто немного красивее и предпочтительно немного более автоматически.

Мне это нужно для игры, и это не будет так что скорость на самом деле не проблема (если только это не очень медленно, потому что мне приходится делать это на довольно большой площади), но мне никогда не приходилось делать что-то подобное раньше, и я честно не знаю, с чего даже начать.

Я уже пробовал bruteforcing свой путь через массив, начиная с верхнего левого квадрата и типа слияния, пока не останется ничего, чтобы объединить, но это действительно не так эффективно, так как он не может рассмотреть слияние прямоугольников 3x2, 4x3 и т. д..

Если вы можете указать мне на любые алгоритмы, которые могут справиться с такого рода вещами или иметь представление о том, как это может быть достигнуто, это будет очень ценно. Спасибо!

1 6

1 ответ:

Вы можете попробовать жадный алгоритм. Конечно, он не будет оптимальным (ну, вы не определили критерий оптимальности строго). Но, может быть, он будет работать достаточно хорошо для ваших нужд.

Итак, вы можете попробовать:

  • Найдите пару прямоугольников, которые можно объединить с максимальной общей площадью
  • Замените их на новые-результат операции слияния
  • повторяйте, пока не найдете подходящую пару

Если вы также заботитесь о том, чтобы результирующие прямоугольники были близки к квадрат вы можете попытаться максимизировать что-то вроде a * totalArea + (1 - a) * (min_resulting_side/max_resulting_side) с подходящим значением для 0