I’d like to place an arbitrary number of rectangles into a fixed size parent such that they are:
- Randomly placed
- Randomly rotated to within a give degree range
- Nicely dispersed around the center point (not all clumped into one corner)
- Not overlapping unless necessary due to lack of space
- With minimum overlap when it’s necessary
To help you visualize the problem, I would like to scatter images inside a window for the user to choose one.
Googling had led me do various algorithms for packing etc, but nothing really addresses my requirements.
Does anyone have any good ideas?
It shouldn’t be much more complicated than:
In any case you’ll want to try and keep the number of rectangles small, because the number of comparisions can quickly get really big. Using a short-circuit (such as “if they’re halfway across the screen then don’t bother looking closely”) may help but isn’t guarenteed.
EDIT: Okay, so requirement #5. Chances are that the push-both-rectangles-until-they-no-longer-collide-recursively method of adding new rectangles will end up being the simplest way to do this – just cut off the loop after a few thousand iterations and everything will have attempted to move as far away from everything else as possible, leaving minimum overlap. Or, leave the method running in a seperate thread so that the user can see them spreading out as more are added (also stopping it from looking like it’s locking up while it’s thinking), stopping once no rectangle has moved more than X units in one iteration.