所以我在考虑制作一个不同形状的矩形而不仅仅是正方形的建筑游戏,但我无法找到一种有效的方法来做到这一点。 例如,我不希望有像俄罗斯方块一样的瓷砖网格组成每个形状。 我希望每件作品都是一个宽度和高度的物件。 例如,2 * 3件不会占用6个瓷砖,它只是一个矩形。 我必须能够有效地整理作品并能够以一定的坐标获得作品。 如果我只使用二维数组的瓷砖,它将使用我不需要的内存。

===============>>#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)。

  ask by user3466304 translate from so

未解决问题?本站智能推荐:

1回复

用2x1和1x2多米诺骨牌禁止位置放置2xN网格的方法有几种?

我很想知道解决这个问题的算法。 问题陈述的正式描述是这样的-给定N(<100)和2x1和1x2的多米诺骨牌,我必须找到可能的不同网格拼贴的数量。 此处的区别是某些单元格将变黑以表示禁止位置。 输入中的0表示一个空单元格,而1个禁止的单元格。 我在“ 六角网格拼贴”中发现了类似
3回复

如何使用指针到指针存储Polyomino的对称性?

好的,我正在研究离散的平铺问题。 我正在存储名为polyomino的对象,如下所示: 然后,我将生成所有8个可能的方向(正方形的对称组 )并将它们存储到其他7个双指针中。 我想知道是否有一种方法可以使大小为8的数组保存每个双指针的地址。 如果我能做到这一点,那么在检查要平铺的木
1回复

传单-使用图块图层时如何保持原始坐标系有效?

在我的Leaflet应用程序中,我曾经显示带有ImageOverlay的背景层。 但是,由于图像太大,导致Leaflet处理变慢,因此我改用平铺方法。 我使用gdal2tiles-leaflet生成了我的图块。 它工作正常。 但是现在我的笛卡尔坐标系统我的背景层被投影(我使用Leaf
2回复

平铺不同大小的矩形

我正在寻找一些指向算法的指针,这些算法应该允许平铺不重叠不同大小的矩形。 给定一组不同大小的矩形,将它们平铺在大小为H x W且没有重叠的区域上。 目标是最大化使用的空间或相反 - 最小化间隙面积。 如果没有足够的空间,请继续进行相同大小的第二个区域,依此类推。 假设每个矩形的宽
2回复

将矩形分成最大大小较小,相等的整数矩形/平铺

我需要以非常大的分辨率创建屏幕截图。 由于分辨率大于渲染器支持的分辨率,因此需要将其拆分为较小的分辨率,然后再将其缝合在一起。 我已经弄清楚了矩形的拼接/渲染部分,但是我一直在努力寻找用于每个图块的最佳矩形分辨率。 我的渲染器的限制为4096x4096。 对于16384x16
3回复

数学上产生球形六边形网格

我正在尝试创建一个类似于此的形状,具有12个五边形的六边形,任意大小。 ( 图片来源 ) 唯一的问题是,我完全不知道生成它需要什么样的代码! 目标是能够在3D空间中获取一个点并将其转换为网格上的位置坐标,反之亦然,并获取网格位置并获取绘制网格的相关顶点。 我甚至不知
2回复

计算表格布局的最佳列数 - 仅给出表格宽度和矩形列表

我有一个不同尺寸的矩形列表。 rects = [100x20, 30x10, 10x10, 70x20, 40x30, 50x10] 我试图从这些矩形渲染表。 如果我有一个固定数量的列,我只需计算行数和每行和列的大小,如下所示: 现在我希望我的表由最大行宽配置。 列数取决
1回复

如何有效地存储航点

我有一个地图很大的游戏,我需要存储很多航路点(数百万个,如果不是十亿个),然后使用A *算法将其用于寻路。 我需要的: 一种有效的存储方式 通过A *算法直接访问它们的快速方法。 起初我想使用一个简单的向量,但这很快就会使用所有可用的内存。 然后我以为我应该使用
1回复

如何使用cgal创建矩形网格?

我目前正在尝试创建2D杆。 因此,它基本上是一个具有长度和宽度的矩形。 现在,我想使用三角形和正方形(或小矩形)对这个矩形进行网格化。 我正在尝试使用cgal实现此任务。 我知道我们可以使用CGAL::Constrained_Delaunay_triangulation_2来生成三角
1回复

绘制简单的2D矩形网格

基本上,我想实现的是一个矩形的集合,它们可以彼此相邻,可以从数组中进行控制。 在如此简单的事情上,我似乎找不到任何可靠的信息,因为大多数教程对我来说太大了,对我没有帮助。 到目前为止,我什至无法获得渲染网格的效果,它绘制的网格非常大。 (由于某些原因?) 来源 看起来像什么