所以我在考虑制作一个不同形状的矩形而不仅仅是正方形的建筑游戏,但我无法找到一种有效的方法来做到这一点。 例如,我不希望有像俄罗斯方块一样的瓷砖网格组成每个形状。 我希望每件作品都是一个宽度和高度的物件。 例如,2 * 3件不会占用6个瓷砖,它只是一个矩形。 我必须能够有效地整理作品并能够以一定的坐标获得作品。 如果我只使用二维数组的瓷砖,它将使用我不需要的内存。
如何有效地存储矩形网格?
How can I efficiently store a grid of rectangles?
===============>>#1 票数:2 已采纳
无论你如何操作,在任何给定坐标上获取矩形都是非常昂贵的,但最有效的方法可能是创建矩形不受限制的松散网格。 每当一个棋子移动时,它将更新一个二维数组,并在其全部或部分包含的所有正方形中引用它。 每当给定坐标时,计算坐标所在的网格中的哪个方格,然后从中可以进行更广泛的计算以检查坐标是否实际位于矩形内部。
===============>>#2 票数:1
我想早点发布这个,我知道你已经接受了答案,但你可能想要考虑以下内容。
我想我明白你在问什么。 您想通过检查矩形边界来检查图块属于哪个矩形(如果有)。 因此,要检查是否在这个广场右上角瓷砖属于任何矩形任何地方-
是不属于任何矩形瓷砖
a a a -
a a a b
a a a b
a a a b
你会检查矩形a
和矩形b
是否为tile (0,3)
并看到它既不属于它。
您要避免的替代方法是将每个图块设置为属于矩形:
(0, 0).parent = 'a'
(0, 1).parent = 'a'
...
(2, 2).parent = 'a'
等等
或类似的东西。
每种解决方案的权衡都是不同的“
在第一个中,每次想要找到图块所属的矩形时,您将不得不进行大量的比较。 O(n)
的比较,在这里将比较n
在最坏情况下的时间, 1
在最好的情况下,和n/2
平均(比较如果每一瓦片具有属于一个矩形,这是不正确的的机会相等类似俄罗斯方块的游戏)。
在第二个解决方案中,您必须将父变量存储到每个磁贴。 这增加了内存使用量,但时间复杂度始终保持为O(1)
。
根据您的网格设置方式,每一个都可能更好:
a a a a a a a a a a a b d d d d d d d d
a a a a a a a a a a a b d d d d d d d d
a a a a a a a a a a a b d d d d d d d d
a a a a a a a a a a a b d d d d d d d d
a a a a a a a a a a a b d d d d d d d d
a a a a a a a a a a a b d d d d d d d d
a a a a a a a a a a a - e e e e e e e e
a a a a a a a a a a a c e e e e e e e e
a a a a a a a a a a a c e e e e e e e e
a a a a a a a a a a a c e e e e e e e e
检查特定磁贴的父级非常快:您只需检查5个矩形,如果磁贴不在任何区域,则它没有父级。
检查图块是否具有父图标同样快。
但是,当你开始有越来越多的矩形......
a b c d e f g h i j k l m n o p q r s t
A B C D E F G H I J K L M N O P Q R S T
u v w x y z U V W X Y Z 1 2 3 4 5 6 7 8
9 0 ...
...
您必须进行大量比较以查找特定磁贴是否具有父级。 您不必精确定位坐标并检查其父值,而是必须检查每个矩形以查看切片是否位于其中任何一个中。
我建议您只使用NxN网格并为每个图块存储父矩形值(第一个解决方案),除非您知道您不会使用那么多矩形或网格将主要填充空白空间。
===============>>#3 票数:0
我只想创建一个带宽度和高度的类Rectangle ,然后我会使用这个类'实例的数组。
===============>>#4 票数:0
矩形是否重叠? 如果没有,你可以在这里使用RectangleGrid类: https : //github.com/eyal0/OctoPrint-Slicer/blob/master/src/RectanglePacker.js#L10
添加矩形可能很慢,但对于您的用例可能会有效。 查询给定位置的矩形是O(nlogn)。