【发布时间】:2015-04-07 23:48:00
【问题描述】:
我有一个矩阵(0 表示什么都没有,1 表示地形)代表我游戏中的一个关卡。该矩阵对应于我的屏幕被分解成的网格,并指示我的地形走向。
我的地形实际上是由网格内每个块的角落中的 4 个点组成的。当您有多个连接的块时,我使用合并单元算法来删除重复点和任何内部点。结果是我最终得到了一个仅代表多边形外边缘的点列表。
要绘制这个多边形,我需要点按某种顺序(顺时针或逆时针),以便每个点后面跟着它的相邻点。显然,第一个点和最后一个点需要是邻居。由于这一切都在一个网格中,我知道相邻点之间的确切距离。
问题是我无法想出一种算法,该算法允许我在将点按顺序排列的同时“行走”在多边形的边缘。我相信应该有一种方法可以利用我拥有代表几何的矩阵这一事实,这意味着只有一种可能的方式来绘制多边形(即使它是凹面的)。
我尝试了几种使用贪心算法的方法,但似乎无法找到一种方法来在每种情况下都知道我想朝哪个方向行驶。鉴于任何特定点最多可以有 3 个邻居(第四个不包括在内,因为它是“起点”,这意味着我已经对其进行了排序)我需要一种知道要移动的方式。
更新
我一直在尝试的另一种方法是按它们的 X 对点进行排序(使用 Y 的决胜局),这给了我最上面/最左边的边缘。它还保证我从外缘开始。但是,我仍在努力寻找一种算法来保证我留在外面而不会越过。
这是一个示例矩阵:
0 0 0 0 0 0 0 0 0 0
0 0 0 1 1 1 0 0 0 0
0 0 0 0 0 1 0 0 0 0
0 0 0 0 0 1 1 1 0 0
与此相对应(黑点代表我的观点):
【问题讨论】:
-
您尝试基于此矩阵创建网格?
-
@AnthonyRaimondo 有点像。目前我只是在使用 actionscript/flash,所以只需要按正确的顺序排列点即可。但是,如果我想制作网格,我仍然需要按顺序排列它们,所以这并不重要。
-
是否可以先创建所有三角形,以便您有参考,然后合并所有点?动作脚本/闪存期望点的顺序是什么?三角带?
-
这是不可能的(据我所知),因为这是一个关卡编辑器,可以按任何顺序创建/销毁块。这意味着你可以从屏幕的一侧开始,然后随机连接块,直到你有一些奇怪的凹形。由于块共享点,因此不可能知道它们是按什么顺序创建的。我认为必须有一种简单的方法来利用我的矩阵来获得订单。对于 flash,我不知道底层绘图代码是什么(他们不提供访问权限或文档)。您只需开始填充,然后按顺序连接点。
-
我想到的最好的想法是洪水填充算法。 Here。基本上你通过矩阵。一旦你找到一个起点(理想情况下你会从上到下/从左到右来优化洪水填充),然后你从那个点开始洪水。然后,如果它们是周界点并且尚未添加,则插入新点。
+2偏移量是指元素的插入。请注意,插入索引(不是偏移量)还取决于您从最后一个正方形移动的方式。抱歉,如果这很难解释,只是现在时间紧迫,否则我会写下来。
标签: algorithm sorting math polygon