物体的二维几何布局

时间:2016-01-06 18:00:42

标签: c++ algorithm

所以我有这个课程:

________
| t     |
| t  jj |
| t  jj |
_________

我的问题是我需要创建一个容器类型类,以某种方式可以保存多个不同大小的“Piece”对象的布局(注意Piece只能表示矩形)。

示例:

{{1}}

我的目标是能够“填充”一个带有多个“Piece”对象的空矩形,但能够知道“Piece”是否适合。

我正在用C ++开发它。我开始使用最逻辑的解决方案,我认为是使用矢量的“矩阵”(矢量< vector< Piece *>> mat),但这不起作用因为我说“Piece”对象可以有不同的大小

我希望你能提供一些关于如何为此获得解决方案的提示,或者它是否存在一些lib或open-sorce项目链接。

谢谢。

修改

我忘记了这一点:我事先知道容器的尺寸和插入(验证后)是顺序的(一件一件),没有预定义的方向。

1 个答案:

答案 0 :(得分:1)

如果您事先不知道网格的大小,可以使用Piece p [width] [height]并使用memset制作全零或使用std :: vector。然后你可以检查(在某个位置(x,y)添加一个新的棋子),如果在它的任何子方位上已经有一些其他的棋子。

编辑:你可以使用矩阵char mem [sqrt(width)] [sqrt(height)];和一个Pieces的矢量。然后使用矩阵,如果有可能的碰撞,如果没有,只需添加一块。否则,你遍历所有现有的并检查碰撞。

如果你想让程序更快(这个程序只适用于小网格),那么你需要使用更多" advanced"数据结构。我建议你学习2D BIT(或fenwick)树(google上有很多资源)。您还可以使用2D细分树。然后,当在位置(x,y)处添加新的棋子时,检查其中所有正方形的总和(例如,从(x,y)到(x +宽度,y +高度))。如果该总和为零,那么新的棋子不会与之前的棋子碰撞,然后在你的棋子中的所有正方形上添加1时更新网格(我的意思是2D段树中的相应值)。否则,如果总和大于零,则意味着会有一些重叠,然后您必须丢弃新的部分。