Partitioning big rectangle to small ones (2D Packing)
Asked Answered
H

1

12

I need algorithm which splits big static sized rectangle to small ones. A perfect implementation for me look like this:

struct RECT
{
  int l,t,r,b;
};

class BigRect
{
public:
  // width and height of big rect
  BigRect( unsigned width, unsigned height );

  // returns -1 if rect cannot be allocated, otherwise returns id of found rect
  int GetRect( unsigned width, unsigned height, RECT &out );

  // returns allocated rect to big rectangle
  void FreeRect( int id );
};

void test()
{
  BigRect r( 10, 10 );

  RECT out;
  r.GetRect( 4, 4, out ); // rect found ({0,0,4,4} for example), returns 1
  r.GetRect( 5, 5, out ); // rect found ({4,0,9,5} for example), returns 2

  r.GetRect( 6, 6, out ); // no place found for rect, returns -1
  r.FreeRect( 2 );        // add {4,0,9,5} back to rect

  r.GetRect( 6, 6, out ); // rect found (4,0,10,6)
}

So I need algorithm for GetRect and FreeRect methods. Any ideas and links would be appreciated.

Haily answered 23/5, 2011 at 14:28 Comment(20)
Are there any restrictions on how the sub-rectangles are to be allocated? E.g. is there a goal to pack rectangles efficiently, or can you just stick them anywhere they will fit?Diabolo
@Jean-Paul Calderone. It's not homework. @veredesmarald of course it would be better to allocate them efficiently.Haily
@Jean-Paul Calderone, I'm not sure it can be a homework. It looks he need some sort of allocator on 2D heap, it could be pretty complicate to develop an efficient implementation that will minimize fragmentation.Roethke
What are l,t,r,b? Can rectangles overlap?Institutionalize
@Emile Cormier, they mean "left,top,right,bottom". No, they can't overlap. As Kirill V. Lyadvinsky said it is sort of allocator on 2D heap.Haily
Can you specify any restrictions to the order in which the rectangles may be allocated or does this need to work on random input?Unopened
@Axel, I don't understand your question. They can be allocated anywhere inside big rectangle, they just can't overlap.Haily
So really this is a tessellation / packing problem?Irritant
@pure cuteness: I think what Alex means is is it's possible to sort rectangles from largest to smallest before trying to allocate them. In other words, is it an online or offline bin packing problem.Institutionalize
@pure cuteness: You might get more help at the comp-sci stack exchange: cstheory.stackexchange.comInstitutionalize
Well, I think it is better to explain background of problem. I need to place small pictures inside a big texture. So that is why I need to split it to small rectangles.Haily
@pure cuteness: In that case, it's an offline bin packing problem. You have all the small pictures at your disposal before packing them into the big picture, right?Institutionalize
I found some information here: csc.liv.ac.uk/~epa/surveyhtml.html . It's pretty theoretical, though.Institutionalize
@Emile Cormier, yep. It looks like something I need. Thank you, I'll check it.Haily
Why the close votes? He's looking for 2D packing algorithms.Institutionalize
I vote to re-open as well, it seems a valid question to me.Audra
@pure cuteness: If you search for "texture packing" you'll also find some useful information. People in the gaming world have the same problem as you do. This guy posted some sample code: codesuppository.blogspot.com/2009/04/…Institutionalize
See also: gamedev.stackexchange.com/questions/2829/…Institutionalize
Searching for "texture atlas" might also be helpful.Institutionalize
@Emile Cormier, damn, you are really cool, many thanksHaily
I
7

What you're trying to do is online 2D bin packing. It's online because you don't have all your small pictures in hand before you attempt to pack them into the big picture. Furthermore some small pictures will be "deallocated" and their space will be freed up. On the other hand, an offline algorithm allows you to do things like sort your small pictures from largest to smallest before packing them.

Here's an article that surveys the state of the art in 2D packing: Survey on two-dimensional packing. It's quite theoretical.

This article A New Upper Bound on 2D Online Bin Packing cites other articles that describe online 2D packing algorithms.

People in the gaming world have a similar problem as you do; they call it texture packing or texture atlas. However, they use offline algorithms.

John Ratcliff posted a blog article on texture packing.

See also this related question on gamedev: https://gamedev.stackexchange.com/questions/2829/texture-packing-algorithm

Institutionalize answered 23/5, 2011 at 15:52 Comment(6)
As far as I understood, in offline packing I can't add some freespace back to rectangle (BigRect::FreeRect in my sample)? I'm really confused now.Haily
Oops, it's online packing then. Edited answer.Institutionalize
I just read your answer again. I don't have all images at start. So I think I need some online algo rather than offline.Haily
Yes, it's online. My bad. The stuff from gaming world might not be so useful then because they have textures at their disposition before building texture atlases.Institutionalize
Anyway thanks. At least now I know in what direction to dig in.Haily
Found this article: A New Upper Bound on 2D Online Bin Packing (arxiv.org/abs/0906.0409). It cites other articles that describe online 2D packing algorithms.Institutionalize

© 2022 - 2024 — McMap. All rights reserved.