все очень просто. с начало добавляем рект на все поле в некий лист nodes. потом бежим по всем ректам которые есть на поле, пусть он будет CurrentRect, и для каждого выполняем алгоритм:
бежим по всем nodes от i = 0 до nodes.Count - 1 (во время пробегания nodes.Count может меняться)
{
Берем nodes[i] и если он пересекается с CurrentRect (именно пересекается а не касается) выполняем следующее:
{
Обрезаем его по CurrentRect. как именно: с начало снизу, если есть что резать пихаем в nodes новый рект а текущий урезаем по CurrentRect, и так по всем сторонам
Первый в прогоне запоминаем как основной, который в итоге останется на месте CurrentRect, если он меньше CurrentRect, растягиваем его по CurrentRect.
Все остальные после разрезаний удаляем (куски которые будут лежать в CurrentRect, они лишние) и делаем i--
}
}
Далее можно сделать оптимизацию, найти ректы с одинаковыми гранями и объединить их. Еще можно что-то придумать. Но это уже задачка по легче