Это не должно быть намного сложнее, чем:
- Поместите новый прямоугольник в случайное место со случайным вращением. Это следует сделать, просто используя три случайных значения (x, y, r), если только вам не нужен случайный размер (в этом случае вам также понадобятся w и h). Это не должно приводить к сбою углов (случайным является случайный).
- Для каждого уже размещенного прямоугольника проверьте наличие столкновений. Вот один из способов. Также проверьте наличие столкновений со стороной окна (если вы не хотите, чтобы объекты выходили за пределы экрана); размещение четырех фиктивных прямоугольников вокруг границы может быть дешевым способом сделать это.
- Если есть какие-либо столкновения, то есть два варианта: либо переместить новый прямоугольник в новое случайное место, либо переместить новый прямоугольник и блокирующий прямоугольник друг от друга, пока они больше не соприкасаются. И то, и другое имеет и «да», и «нет» - перемещение нового происходит быстрее и проще, хотя, возможно, он не найдет место, которое подходит, если страница действительно заполнена; перемещение обоих почти наверняка будет успешным, но это займет больше времени и может привести к столкновениям с цепной реакцией, которые должны были бы быть отсортированы рекурсивно.
В любом случае вы захотите сохранить небольшое количество прямоугольников, потому что количество сравнений может быстро стать действительно большим. Использование короткого замыкания (например, «если они находятся на полпути по экрану, тогда не пытайтесь внимательно посмотреть») может помочь, но не гарантировано.
РЕДАКТИРОВАТЬ: Хорошо, поэтому требование № 5. Скорее всего, рекурсивный метод добавления новых прямоугольников методом push-оба-прямоугольника до тех пор, пока он не перестанет сталкиваться, окажется самым простым способом сделать это - просто обрезать цикл после нескольких тысяч итераций, и все будет пытались отойти как можно дальше от всего остального, оставляя минимальное перекрытие. Или оставьте метод запущенным в отдельном потоке, чтобы пользователь мог видеть, как они растекаются по мере добавления новых (также не давая ему выглядеть так, будто он блокируется, пока думает), останавливаясь, когда ни один прямоугольник не переместился больше, чем на X единиц в одном итерации.