设计图片拼图

时间:2010-10-31 06:58:32

标签: java algorithm puzzle

我打算开发一款拼图益智游戏。 现在我已经有了图像和图像片段,因此我们不需要算法来分割图像。

在UI方面,将有两个部分

  1. 第一部分按随机顺序包含损坏的图像。
  2. 第二部分包含完整图像的轮廓。用户需要将剪切图像拖放到轮廓图像上。
  3. 我不确定如何在轮廓图像上匹配这些碎片? 关于算法或起始指针的任何想法?

5 个答案:

答案 0 :(得分:2)

允许用户将每个片段拖动到轮廓区域。允许工件以90度的增量旋转。

选项1: 如果一件作品位于整个拼图中的正确位置,并且角度正确,并且连接到另一件,则用一些用户反馈将其卡入到位。拼图的外边缘可以计算与边缘部分的连接。

选项2: 拼图组装时,邻居是相邻的拼图。当拼图碎片混淆时,它们仍然具有相同的邻居。每个拼图(边缘部分除外)都有四个邻居。

如果一块相对于该邻居以一个正确的角度靠近其中一个邻居,则将其捕捉到另一块。然后允许两个(或更多)件作为一个单元被拖动,就像单件一样。这将允许用户在任何区域组装拼图的子部分,就像使用物理拼图一样,并将子部分彼此连接。

您可以检查要移动到其四个邻居的棋子,看看它们是否足够靠近以便咬合在一起。如果一块有适当的边缘足够接近其相邻边缘,以相同的角度,则它们匹配。

有几种方法可以检查相对位置。一种方法是暂时旋转您正在测试的棋子的坐标,使其垂直,然后将所有所需邻居的坐标(也是暂时的)旋转到相同的角度。 (对所有旋转使用相同的旋转中心。)然后,您可以轻松测试它们是否足够接近匹配。如果用户正在拖动子装配,则需要检查子装配中每个不匹配的边。

选项2更复杂,更现实。通过省略片段的旋转并使每个片段初始成为适当的角度,可以进一步简化选项1。

答案 1 :(得分:1)

对于常规形状,您可以使用矩阵。我推荐这是第一种方法。划分拼图就像定义矩阵的X,Y维一样简单。对于每件作品,你有一系列的四个值,然后每一个都有一个,说明它是否平坦,指出或指向。这将为你提供一个非常经典的拼图设置。

这些碎片实际上看起来是一个严格的GUI事物。现在,对于初稿,我建议让它使用完美的方块。在任何GUI框架中都可以轻松获取图像的矩形位。

要进入异形件,您需要一系列模板。这些将成为您应用于图像的蒙版。每个面具都会剪掉图像的一小部分来制作你的作品。您可能需要动态创建蒙版以使其适合拼图。首先从简单的三角形连接开始。一旦你有了工作,你可以做数学,以获得漂亮的球形连接器形状。在GUI框架中查找“剪辑”和“掩码”。

如果你想做不符合一般矩阵布局的不规则多边形形状,那么你需要做更多的工作。这就是为什么我建议首先将广场作为一个好例子。现在,您需要深入研究图论和分区。拿起一些有关3D编程的书籍 - 专注于算法,因为他们一直在进行分区。虽然我不怀疑是否有一本书中有这个确切的主题。

玩得开心。

答案 2 :(得分:0)

数据结构很简单我猜 - 每个和平都会指向它的邻居并保持实际的形状来显示。

在应用程序的MMI(UI)上 - 您的开发环境是什么? 如果它是窗口 - 我会用c#和winforms甚至更好的wpf。 如果它是unix,你必须得到别人的建议,因为我不是那里的专家。

答案 3 :(得分:0)

1)如何将图像分成随机多边形

看来你已经弄明白了这一部分。 (来自:“现在我已经有了图像和图像片段,所以我们不需要算法来分割图像。”)

2)什么样的数据结构可以解决问题

您可以在this示例中创建类似Scribble类的Class Piece,并且您的部分将是Piece类的对象数组。 那么,你将有两个数组, (i)实际图像片阵列 (ii)图像片段轮廓阵列

因此,每当您将一个片段拖放到图像的完整轮廓上时,它将检查图像片段对象是否超过80%的intersecting和实际图像的ID(片段对象的成员变量)片和图像片大纲匹配,然后你在正确的地方得到了正确的一块......

3)UI实现

检查this

答案 4 :(得分:0)

您可以创建“PuzzleTile”类的对象数组

每个这样的图块都有一个图像和一个整数
每次移动后,检查整数是否正确排序,意味着:
123个
456个
789

你可以为返回bool的函数创建一个函数。

注意:我目前正在使用C#进行开发,这就是为什么在C#下特别容易实现这个概念的原因,尽管其他平台几乎不需要对此进行一些修改。