1

假设我有一张代表室内地图的图像。在这张地图上,某些区域是“允许的”,而其他区域则不是。然后我会定期获得一组坐标(x,y),并需要检查它们是否在“允许”区域内。

目前,我用一个boolean[][] map变量来表示这张地图,这true意味着允许。要检查,然后我只需检查map[x][y]

但是,我所代表的图像可能会变得非常大,比如说最大 5000x5000 像素。结果,我的map变量在内存中变得太大(在这种情况下为 25MB,假设 aboolean大约需要 1 个字节)

有没有更好的数据结构来解决我的问题?我已经思考了一段时间,但我看不到任何会占用更少空间的东西。

提前致谢!

4

1 回答 1

2

这种情况的常见场景是使用结构数组ListRect然后,您定义这样的矩形定义了“允许”的区域。

然后,给定一个点,(x, y)您只需遍历数组/列表并检查该点是否位于集合中的任何矩形内。您可以简单地使用Rect.contains(x,y)它。您回答true是否有任何Rect包含问题的点,false否则。

这应该会给你一个非常不错的性能/内存消耗比。它通常用于您的应用程序中,假设“区域”是矩形的(或者每个区域可以表示为 - 理想情况下 - 少量矩形的联合)。

另一种选择(假设矩形不是一个选项)是使用谨慎的多边形来表示区域。如果这是可行的,您可以使用此处介绍的简单算法:http: //alienryderflex.com/polygon/它可以让您及时测试给定点是否在多边形内部(甚至非常复杂),O(n)其中n所有顶点的数量是定义地图区域的所有多边形。

如果您的区域非常分散(即很难使用偶数多边形的矩形来表示它们),那么您可能没有其他简单的选择。您可以做的是(例如)创建一个包含行允许信息的数组。对于每一行,您将有一个数组int[],其中每个int包含 32 位,每个位表示boolean连续列的值。这与您已经拥有的非常相似,但是您的内存占用会小 8 倍,因为每个值只占用一位而不是整个字节。

于 2013-02-01T04:26:30.653 回答