Questions tagged «graph»


6
一组图块边界的高效算法
想要改善这篇文章吗?提供此问题的详细答案,包括引文和答案正确的解释。答案不够详细的答案可能会被编辑或删除。 我有一个已知的有限大小的瓷砖网格,可以形成地图。地图内的某些图块放置在称为“区域”的集合中。该区域是相连的,但对其形状一无所知。在大多数情况下,它是一个相当规则的斑点,但它可能在一个方向上被拉长,甚至可能有孔。我有兴趣找到该领土的(外)边界。 也就是说,我想要一个列表,列出所有与区域中的某个区域相关但未在区域中的区域。找到这个的有效方法是什么? 额外的困难是,我的图块是十六进制的,但是我怀疑这并没有太大的区别,每个图块仍标记有x和y整数坐标,并且给定一个图块,我可以轻松找到它的邻居。下面是一些示例:黑色是领土,蓝色是我要查找的边界。 这本身并不是一个难题,用伪python的一种简单算法是: def find_border_of_territory(territory): border = [] for tile in territory: for neighbor in tile.neighbors(): if neighbor not in territory and neighbor not in border: border.add(neighbor) 但是,这很慢,我想要更好的东西。我在整个领土上有一个O(n)循环,在所有邻居上有另一个循环(虽然很短,但仍然),然后我必须检查两个列表的成员资格,其中一个列表的大小为n。这给定了O(n ^ 2)的可怕比例。我可以通过使用集而不是边界和地区列表来将其简化为O(n),以便快速检查成员资格,但这仍然不是很好。我希望在很多情况下,由于面积和线比例缩放的原因,领土很大但边界很小。例如,如果区域是半径为5的十六进制,则其大小为91,而边框的大小仅为36。 谁能提出更好的建议? 编辑: 要回答以下一些问题。区域的大小范围从20到100左右不等。形成区域的图块集是一个对象的属性,而这个对象需要所有边界图块的集合。 最初,领土是作为一个街区创建的,然后大部分都是一块一块地获得。在这种情况下,确实最快的方法是保留一组边界并仅在获得的图块上更新它。有时,可能会对该地区进行重大更改-因此需要重新计算。 我现在认为,执行简单的边界查找算法是最好的解决方案。这带来的唯一额外复杂性是确保可能需要每次都重新计算边界,但不超过此数目。我非常有信心可以在当前框架中可靠地完成此操作。 至于时间,在我当前的代码中,我有一些例程需要检查该区域的每个图块。不是每回合,而是在创作时以及随后的创作中。即使它只是完整程序的很小一部分,也要花费我的测试代码运行时间的50%以上。因此,我渴望尽量减少重复。但是,测试代码涉及的对象创建要比程序正常运行(自然)要多得多,因此我意识到这可能不太相关。

1
要场景图还是不场景图?
我一直在努力决定是否在游戏中实现场景图。我有一些使用这种工具的用例,但我无法获得一些实现细节。 背景知识:我正在写针对移动平台(主要是Android)的太空射击游戏,我的代码几乎完全是C ++。我没有使用任何中间件;渲染引擎和物理引擎特别是我自己的作品。我的物理引擎会根据力和脉冲来更新对象的位置。到目前为止,我还没有动画系统,但是可能会在某些时候访问它(可能与本次讨论无关)。 首先,我将描述一个很好的用例。我想拥有一个由几个独立的零件组成的老板,每个零件都可以独立损坏/破坏。例如,我可能有一个老板的胳膊可以独立于其他老板实体而受到伤害。当手臂被销毁时,位于凸台肩部的火焰微粒效应可能表明手臂已被销毁。 实际上,我决定尝试在物理引擎中解决具有约束的此类问题,以将此类复合对象保持在一起。一个这样的约束条件提供了0个自由度,并且本质上是一个变换矩阵。这实际上是在试图解决一个最终使我脱离场景图的问题的尝试,如下所述。 我不使用场景图的主要原因是因为我找不到在物理世界和渲染场景中都保留嵌套对象(从其父级继承了转换的对象)的有效方法。物理世界需要对象位于世界空间(或至少相同的空间)中,而渲染场景需要对象位于父空间中。跟踪两个空间中的位置可能会有所帮助(并且是不可避免的),但会引起自身的担忧,其中至少与性能有关。 但是,考虑到上述用例,我认为能够在父空间中“工作”将变得非常重要,而试图通过约束来迫使我的物理引擎保持这些关系将变得成问题。 给定上述用例和困境,我是否应该使用图结构将转换从一个对象传递到另一个对象?如果是这样,我的物理引擎应该如何计算新位置并针对不同空间中的对象执行相交测试?

3
确定网格上的一组拼贴是否形成封闭的形状
给定网格上的一组图块,我想确定: 如果瓷砖是一个封闭的图形 如果将板的侧面算作图形的边缘时,这些瓷砖形成一个封闭的图形 如果前两个陈述中的任何一个为真,则附加图块中的其他图块将形成初始图块。 玩家将首先按下一个图块,然后将其手指拖动到其他图块以创建一串相同颜色的图块。我将检查下一个磁贴是否有效。例如 如果玩家在红瓦开始,他们唯一的下一个有效的行动是到邻近的红瓦(对角线做计数)。当用户抬起手指时,我需要能够检查上述3个项目。 所以我最初的想法是,由于我每次走时都要检查链条的有效性,所以当玩家抬起手指时,我可以检查第一个和最后一个瓷砖是否相邻。(我已经知道它们是相同的颜色。)如果它们相邻,我会预感会做出一个封闭的图形,然后我要来这里尝试看看我是否丢失了一些大东西,并得到某种逻辑/数学证明,我的直觉是正确的(或一个例子证明它是错误的。) 但是那时候我想到了项目2:我还必须考虑使用木板边缘作为封闭图形侧面的链条。在这种情况下,链中的第一个项目和最后一个项目不会相邻,但是我仍然会附上一个数字。所以现在我回到正题。 我应该如何处理这一系列的网格坐标,以确定它们是否包含封闭的图形?有一次我不知道我有一个封闭的身影,那是什么让那个属于其范围内的所有瓷砖的附加列表的最佳方式? 上面我画了我期望该测试有4种可能结果的图片。 链没有附上数字。 链确实有一个封闭的数字。 如果将板的侧面算作图形的边缘(或一个以上的边缘),则链条会形成一个封闭的图形。 该链的确制作了一个封闭的图形,但是有一些额外的数据点(用户已有效选择作为链的一部分),这些数据点不属于所创建图形的一部分。 情况4是最棘手的,因为您必须提取“额外”链节以找到封闭的图形和落入其中的零件(但不能围绕“未封闭”的区域)。 所以...有人想办法解决这个问题,还是对我来说只是一个起点?在这一点上,我有点转圈,可以使用另一组眼睛。
10 algorithm  grid  graph 
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.