Algorithm 当我需要时,使用什么样的数据结构来存储矩形&;有效搜索至少包含给定大小的所有区域

Algorithm 当我需要时,使用什么样的数据结构来存储矩形&;有效搜索至少包含给定大小的所有区域,algorithm,Algorithm,所以我有一组不重叠的矩形,我想有效地确定一个给定大小的矩形可以放在哪里。哦,它还需要在更新时具有合理的效率,因为一旦我找到可能的有效位置,我将根据其他一些约束条件“分配”空间 “复杂部分”是指矩形可以接触(例如,一个(0,0)100单位宽、50单位高的矩形和一个(0,50)和50x50的第二个矩形允许在(0,0)到(0,20)之间拟合一个50宽、80高的矩形。寻找拟合可能需要“合并”两个以上的矩形 (注意:我将从一小部分相邻的矩形开始,大约3个,并在“分配”它们时删除矩形区域。我预计这些分配中的

所以我有一组不重叠的矩形,我想有效地确定一个给定大小的矩形可以放在哪里。哦,它还需要在更新时具有合理的效率,因为一旦我找到可能的有效位置,我将根据其他一些约束条件“分配”空间

“复杂部分”是指矩形可以接触(例如,一个(0,0)100单位宽、50单位高的矩形和一个(0,50)和50x50的第二个矩形允许在(0,0)到(0,20)之间拟合一个50宽、80高的矩形。寻找拟合可能需要“合并”两个以上的矩形

(注意:我将从一小部分相邻的矩形开始,大约3个,并在“分配”它们时删除矩形区域。我预计这些分配中的大量将不会完全覆盖现有的矩形,并将留给我另外两个较新的矩形。)

起初我认为我可以保留两个矩形的“视图”,一个更喜欢在y轴上打断以保持尽可能宽的矩形,另一个在x轴上打断以保持可能的计数,然后我可以做…嗯…一些聪明的搜索

然后我想,“嗯,人们在这方面已经做了很长时间了,只是因为我不知道如何构造正确的谷歌查询,这并不意味着这不是我忘记知道的四叉树或r列表的简单应用。”

那么,这个问题已经有了一个很好的解决方案了吗

(那么我到底在做什么??我在用激光切割盒子的底部。像“NxM圆直径为1.23英寸,直径为0.34英寸”分离。地板从一个矩形开始,小矩形已经从角落中移除,用于支撑。我目前保留一个未分配矩形列表,按y排序,以x为分界符,在某些有限的情况下,如果它产生足够大的结果以适合我当前的目标,我可以在该列表中的两个矩形之间进行合并我也可以手动放置这些功能,但我更愿意为此编写一个程序。)

(还有:我做了多少“事情”呢?到目前为止,我的盒子里有20到40个“功能”要放,而且计算机速度很快,所以一些效率很低的算法可能会很好地工作,但这是一个爱好项目,我不妨学点有趣的东西,而不是把一些代码粗略地拼凑在一起)

好吧,如果没有一个好的答案,我从另一个角度来看。 我看了一下我所有的政策,得出了一个很短的列表:“分配到适合的任何地方”、“分配到特定的x,y位置”和“分配到y>的任何地方(特定值)”

我决定用一个非常简单的数据结构进行测试。一个表示可分配空间的非重叠矩形列表。没有以任何特定方式进行排序、合并或组织。最有趣的是我跟踪矩形上的范围,以便快速检索最小/最大X或Y

我为自己制作了一个小函数,用于检查特定位置的分配,并返回一个阻止分配的矩形列表,所有矩形都修剪到与预期分配的交点(并生成一个新的自由列表,如果适用)。我将其用作实现所有3个策略的原语

“在特定的x,y位置分配”很简单,如果您没有看到分配成功的阻塞矩形,请使用原语

我将“allocate anywhere”实现为“allocate with y>N”,其中N是自由列表中的“最小y”

“在y>N的位置分配”从自由列表中的x=min-x开始,并检查其中的分配。如果未找到阻止程序,则完成分配。如果找到阻止程序,则将x移动到阻止程序列表的max-x。如果这使预期分配的右边缘超过自由列表的max-x,则自由列表的x将设置回min-x,y设置为al的最小值l自上次Y更改以来遇到的所有阻止列表中的最大Y

对于我的使用模式,我还通过记住上次失败分配的大小(N=minY)和快速失败(至少与上次失败一样宽/高)获得了一些里程


性能对于我的使用模式来说已经足够快了(自由列表从一到三个项目开始,分配从十到四十)。

(这个问题应该有一个更好的标题。我在计算几何的上下文中阅读了axis parallel rectangle(标记为Thous!)我过去习惯于用rect来做这个。如果我把宽度转换成,比如说,a坐标,把高度转换成b坐标怎么办:看起来像是一个范围搜索,但搜索的是邻接区域——其中可能有什么,n²?糟糕透了。)
update
是否完全删除某个矩形覆盖的区域,添加要分配的矩形或其他对象?这是一种双重问题:我将设置一个初始矩形列表(一个或三个矩形),从那时起,我将只删除。另一个适配问题是“找到适合的最大矩形”。我从来都不需要知道“最大”。嗯,就简化而言,我想我会倾向于“在另一个矩形下面,如果它合适的话,否则尽可能靠近左上角”,但我不确定这些是唯一有用的“策略”。我将对上面的问题补充一点。(这个问题应该有一个更好的标题。我在计算几何的背景下读过轴平行矩形(标记是!),我曾经被用来做这样的计算。如果我把宽度转换成,比如说,a坐标,把高度转换成b坐标,会怎么样:看起来像是一个范围搜索,但搜索的是邻接区域——其中可能有什么,n²?糟糕。)是否
update
删除某个矩形覆盖的区域,添加要从中分配的矩形或其他对象,