我有固定区域2d空间填充矩形。我想移动矩形,添加新的,删除一些,但不允许它们重叠。如果所有的rects都是相同的高度和宽度(50x50px),我应该使用什么数据结构来存储它们的位置以及它们使用的空间以及在向场景中添加新的rects时我应该使用哪种查找方法来对付该结构? / p>
答案 0 :(得分:1)
这是经典collision detection问题的简单部分。大多数AABB Trees(不确定是否是最佳链接,但无论如何都是名称)用于有效地解决它,但查找任何碰撞检测算法用于边界框碰撞检测。 AABB(轴对齐边界框)树用于“对齐”的矩形 - 即无法旋转的矩形。
对于非对齐矩形,只需获取包含旋转矩形的最小轴对齐矩形。实际上,AABB树用于加速任意多边形的碰撞检测,通过采用它们的边界框。如果轴对齐的边界框等于所有对象,则更好。
但是,如果你不介意性能,使用矩形的平面列表并进行O(n 2 )搜索真的会更容易:伪代码:
function intersection_free(rectangles)
for rect in rectangles
for rect2 in rectangles
if intersects(rect, rect2)
return false;
return true;
简单是件好事,不是吗?
答案 1 :(得分:1)
通常,在处理这些问题时应使用多维数据结构。 kd-tree和R-tree是学习该主题的良好起点。由于这些结构相对复杂,因此只有在需要处理1000个矩形/进行快速计算时才考虑使用它。
但是,在您的特定情况下 - 如果平面大小有限 - 您可以使用网格(比如100x100)的单元格划分平面,并根据顶部存储每个单元格中的矩形列表-left corrdinates每个矩形。搜索冲突时,只搜索相关单元格中的邻居。由于您的矩形大小不变,这可能是您的最佳解决方案。 请注意,您可以将2D数组存储在一维数组中,其中每个网格单元索引为100X + Y.现在,您可以将网格单元格存储在地图中以节省内存。
如果您正在处理小/慢比例问题,只需将矩形存储在列表中并遍历列表以搜索碰撞。
答案 2 :(得分:0)
我不确定我是否完全了解您的环境,但您可以考虑使用基本上是矩阵的二维数组。每个点都代表2D空间中的一个正方形。