gpt4 book ai didi

c++ - 将大矩形分割成小矩形(2D 打包)

转载 作者:IT老高 更新时间:2023-10-28 23:20:45 30 4
gpt4 key购买 nike

我需要将静态大小的大矩形分割成小矩形的算法。对我来说完美的实现如下所示:

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)
}

所以我需要 GetRectFreeRect 方法的算法。任何想法和链接将不胜感激。

最佳答案

您正在尝试做的是在线 2D 装箱。它是在线的,因为在您尝试将它们打包成大图片之前,您手头没有所有的小图片。此外,一些小图片将被“释放”并释放它们的空间。另一方面,离线算法允许您在打包之前对小图片从大到小进行排序。

这是一篇综述 2D 包装技术现状的文章: Survey on two-dimensional packing 。这很理论。

这篇文章 A New Upper Bound on 2D Online Bin Packing 引用了其他描述在线 2D 打包算法的文章。

游戏界的人们和你有类似的问题;他们称之为纹理包装 texture atlas 。但是,他们使用离线算法。

John Ratcliff 发布了 blog article关于纹理包装。

另请参阅 gamedev 上的相关问题:https://gamedev.stackexchange.com/questions/2829/texture-packing-algorithm

关于c++ - 将大矩形分割成小矩形(2D 打包),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6098607/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com