Вот алгоритм для того, что вам нужно сделать:
- Пока есть соприкасающиеся фигуры, определите крайнюю правую фигуру (ту, которая имеет наибольшую правую x-координату), которая касается другой фигуры. Переместите его так, чтобы его левый край находился справа от самой правой формы, к которой он просто прикасался.
- Хотя рядом с чем-то слева от них есть фигуры, определите фигуру с наименьшей левой x-координатой, которая не находится рядом с чем-то слева от нее. Переместите его так, чтобы его левый край находился справа от фигуры с наибольшей правой x-координатой, лежащей в диапазоне y объекта.
Достаточно просто? Ну, вот упрощенная версия:
- Пока фигуры касаются друг друга, переместите крайнюю правую, чтобы она не касалась других фигур.
- Хотя есть фигуры, не прилегающие друг к другу, переместите крайнюю левую, чтобы она прилегала к ближайшей фигуре.
Редактировать: Например ...
Предположим, я взял квадрат 3 и положил его поверх квадрата 1 и квадрата 2:
1111 44
1111 44
1133333
1133333
33333
3333322
3333322
2222
2222
Шаг 1. Найдите самую правую фигуру, которая что-то пересекает. В данном случае это форма 2. Переместите ее вправо от того, что она пересекает.
1111 44
1111 44
1133333
1133333
33333
333332222
333332222
2222
2222
Есть ли трогательные фигуры сейчас? Да, и самый правый из них - фигура 3. Переместите ее вправо от фигуры, которой она касается, фигура 1:
1111 44
1111 44
111133333
111133333
33333
3333322
3333322
2222
2222
Есть ли трогательные фигуры сейчас? Да, и самый правый из них - фигура 2. Переместите ее вправо от фигуры, которую она касается, фигура 3:
1111 44
1111 44
111133333
111133333
33333
333332222
333332222
2222
2222
Есть ли фигуры, соприкасающиеся сейчас? Итак, мы сделали шаг 1.
Шаг 2: Найдите крайнюю левую фигуру, которая ни к чему не прилегала. В этом случае крайняя левая, не прилегающая к чему-либо, - это фигура 4. Переместите ее влево, чтобы она находилась справа от самой правой фигуры слева от нее, которая существует в тех же координатах y, что и она:
111144
111144
111133333
111133333
33333
333332222
333332222
2222
2222
Что-нибудь не прижалось к чему-нибудь? Нету! Итак, вы сделали!
Как видите, в основном есть фаза расширения и фаза сокращения. Вы делаете фазу расширения справа налево, чтобы ничто не расширилось прямо через что-то еще. Вы выполняете фазу сокращения слева направо, чтобы ничто не сжималось через что-то еще.