我正在制作游戏,我需要在一些聪明的数据结构中代表一个“分层”的圈子。
圆圈可以包含任意数量的图层。每层都有许多“切片”,它们可以具有不同的长度,并且可以丢失碎片。最内层始终是一个完整的圆圈。每个片段都有一个颜色,相同颜色的多个片段可以彼此相邻。
circle with layers http://webbfarbror.se/dump/datastructure.gif
实际上,一个圆圈不会有超过40层或大约1500个单独的切片。
我需要能够轻松地找到特定部件的相邻部件,看看是否“悬挂在自由空气中”(想象重力朝向中心),并移除在其位置留下孔的碎片。
我已经有了一些关于如何存储它的想法,但我认为这是一个有趣的问题,所以我想我会在这里发布它。
我将在Actionscript 3.0中对此进行编码,但您可以随意发布任何语言的想法。
答案 0 :(得分:3)
想想墨卡托投影的北半球地图(或者你更喜欢南半球)。画出一些经度和纬度。现在,请记住,标准墨卡托投影无法显示+/- 90 lat认为最顶层的纬度带代表地图极点周围的圆圈。为您的目的绘制足够的网格。现在你有一个漂亮的平面2D数组,用你想要的邻接属性来表示你的数据(记住在主要的反子午线上包裹)。您必须通过为它们分配一些空值来表示空切片。
我希望这个相当匆忙的解释已经足够了,如果2D数组不是一个足够聪明的数据结构,我很抱歉。
答案 1 :(得分:3)
快速思考这个问题,我可以看到某种带有不同边缘的有向图。 可能是这样的
Node:
+ List<Node *> ParentLevel: a list of nodes at the level above (ie. more external)
+ List<Node *> ChildrenLevel: a list of nodes at the level below (ie. more internal)
+ Node * ClockwiseNeighbourgh
+ Node * AntiClockwiseNeighbourg
您将有两个设定节点,一个是中心圆,另一个代表一个虚构的最外圈。
然后,您可以轻松地在各个层面之间导航,从邻居到邻居的任何方向。要查找“在空中”的所有切片,您可以从内部或外部节点开始,找到没有父项或子项的任何切片。
唯一不能处理的是分层圆圈有两个分离部分的情况,即。完全缺少图层。它可以通过在边缘上添加权重来表示距离来支持它。
答案 2 :(得分:1)
这是一个有趣的问题。我正在工作,所以此刻我将不得不给出快速回答,但今晚将对此进行测试。
我想知道圆形链表的数组/列表是否有效?您可以使用一些标识符标记列表中的每个元素,以显示它位于切片中。添加到外部数组的元素越多,您拥有的层数就越多。它不是太有趣但很简单。您应该能够以这种方式轻松找到相邻的部分。
答案 3 :(得分:1)
只是大声思考而不是一个完整的解决方案,但对于每个乐队,有360个空插槽可以填充(对应于度数)。想一想,为什么要将它限制在360度整数度。但无论如何,你可以通过仅检查他们在每个级别上占用的范围来确定相邻级别上的段是否触及。 因此,如果级别n上的段x占用120-240并且段z在级别n + 1上占用80-300,则它们是相邻的。
想想看,你的应用程序如何真正依赖于同心圆的属性,甚至是圆圈的属性。看起来你可以想象一堆堆叠在一起的环形成一个管子,甚至一堆线性行堆叠在一起形成一个墙壁,数据结构在所有这些情况下都是相同的(鉴于我可以从你对问题的描述中收集到的东西。)那么它只是最有效地实现链表或其他东西。
答案 4 :(得分:1)
您没有说明切片和图层的行为,这对于开发一个代表比赛场的纯几何结构的数据结构非常重要。
制作图层列表。图层[0]是最里层。
每个图层都是切片列表。每个切片由其起始角度和颜色定义。如果图层中有一个切片,则会围绕整个图层。如果有更多切片,则每个切片从起始角度开始并在下一个切片开始处结束,而不会冗余地存储数据。洞是一种特殊的颜色。如果切片下方的层在其开始和结束角度上着色为“空”,则切片悬挂在空中。同一层上的相邻切片是切片列表中的下一个索引,或列表中的最后一个和第一个切片。在切片的起始端角度上再次找到其他层中的相邻切片。
答案 5 :(得分:1)
为什么不使用graph(来自图论)。只需为每个顶点(游戏板上的每个彩色空间)添加边(彩色空间之间的连接链接)。图形的设计使其易于检索相邻顶点列表(在您的情况下为彩色空格)。
答案 6 :(得分:1)
只是一个简单的想法,没有冒犯,如果它是愚蠢的 - 它已经很晚了:P
在开始时,每个图层可以包含一个单件(比率为1)。
如果你现在决定在偏移量为.25的情况下将一个比例为.5(180º)的蓝色部分添加到空图层,这将替换空的创建3件:
...所以递归,所以你最终会得到:
假设您想要与此互动... 如果你想要一些空间是静态的而其他调整,或者如果你想要一个相邻的颜色块是磁性的,你只需要检查它们之间的比例是否为零或足以吸引另一个没有不得不做任何额外的计算。 基本上好的是,当一块被改变时,计算将完成。其余的只是逻辑。假设一块被移动,你只需要知道左/右空的空间比率值,并且不需要迭代其余的计算角度。它会以某种方式与弹性UI实际调整的方式非常相似。