平铺算法/数据结构?

时间:2011-08-16 01:42:01

标签: c# algorithm

我正在考虑创建一个让我玩游戏或解决幻灯片拼图的程序,比如krazydad.com。它由4,5,6,7和8面的瓷砖组成。除了七面砖之外的所有瓷砖似乎都具有相同长度的侧面,其中两侧在两个七面砖之间(因此将五面砖连接到四面砖)具有大约正常长度的70%的边。正如您在下图中所看到的,八边形被交替的五边形和六边形包围。它们通过六边形的远侧连接到其他人。连接到五边形的尖端的是较小的线,连接到连接到其他组的方块。然后在正方形周围形成具有两个短边的七边形图形。我认为外边缘是通过省略距离中心太远的瓷砖来定义的。

enter image description here

对于数据结构,我认为我需要一个连接所有节点的图表。我可以让用户点击在最近的链接上放置一条实线,我可以检查循环或太多行很容易进入节点。我还需要创建切片并将线条关联到它们,内线被分配给两个切片,但被视为一条线。

至于设置,我正在考虑手动计算出点并定义重复图块的最小集合(1 8,4 5,4 6,4 7和1 4),然后将它们放在一起。放置时,我会检查我正在放置的每个关闭点,如果找到则合并它们。然后我需要检查重复的行并合并它们。

是否有更简单或更简洁的方法来生成平铺或B)在进行平铺时合并节点和链接?

1 个答案:

答案 0 :(得分:3)

一些可能有帮助的观察结果:

  • 如果您加入相邻多边形的中心,则会进行delaunay三角剖分(1)。

  • delaunay三角剖分的双重(2)是上图(边长略有不同,但必要时可以调整)

  • 这里有一个关于如何从delaunay三角测量生成图形的讨论(3

所以,把它放在一起,你可以:

  • 生成瓷砖的中心(见下文)

  • 从瓷砖中心构建delaunay三角剖分(通过加入neigbours)。

  • 找到双重来获得你想要的图形(找到双重的过程应该由一个好的图形库支持)

生成图块中心的图案,取最小集合并从中心开始8.对于那里每旋转90度,添加(旋转)最小集合(除了正在旋转的那个之外还加上8)周围),删除重复。然后在你添加的8s上做同样的事情(递归或使用堆栈)。

一旦你拥有了这些中心,我不确定连接邻居的最佳方式是什么 - 你想要一些有效的方法来生成一组候选人。但这不是一个难题,只是繁琐(一个“奇特的”解决方案将是四叉树或空间哈希,但只是粗略的分类可能就足够了。)