在Swing中自动组装拼图游戏带有矩形方块的简单算法的问题

问题描述

我需要设计用于拼图的求解器,该求解器分为以下几个矩形块(几行和几列):

          BufferedImage subImage = 
          image.getSubimage(y,x,dWidth,dHeight) 

 

然后按某些比例

BufferedImage resized = new BufferedImage(newWidth,newHeight,original.getType());

我的算法背后的想法是将当前图块侧的所有适当像素与所有其他相对的图块侧之间的差求和- 例如右边缘-我定义了这样的代码

for(Side s:reverseSides) { ...
{for(int i=0;i<height;i++) //checking current tile's right side
int rgbValue1=image.getRGB(width-1,i); //right side rgb values of current tile
int rgbValue2=imageN.getRGB(0,i); //left side rgb values of other tiles
....
int diff=|rgbValue1-rgbValue2|;
sum+=diff;
}
}
  • 根据某种算法,我从某边开始求和, rgbvalues位于所有此类总和的整个范围的中间 边(sortinglistBySum / 2)。然后我找到所有的最小和 对面,然后遍历此Tile的所有其他3个面,然后转到 对于已存储在其中至少有一个已处理面的图块 排队直到所有方面都以连续方式处理。

  • 但是第一个大问题是没有预料到的,因为 大约80像素(宽或高)约为50-700000000 单位(RGB),当最大值可能超过1000000000。所以这 最小和,甚至一个差异,例如第一/第二/ N像素 getRGB(width-1,1)-getRGB(0,1)-足够大。确实在分裂之前- 相邻边缘像素位置之间的差异 应该只有1个像素?

  • 因此,在这种情况下,如果左图块“ right index”的宽度-1 = 80,则为0 右图块的匹配左侧的索引应为81。或至少 如果图像丢失一条垂直像素线,则差异可能为2 被分割,图像宽度除以列数 不产生整数值(我想这不是真实的图像,所以没有 像素应该在技术上,只是在数学上丢失)。

  • 但是当我计算diff的总和时。两个相邻的垂直(或 一个瓦片中的水平像素行-getRGB(width-2,i)- getRGB(width-1,i)-产生低得多的值-大约5-7 000 000. getRGB(width-3,i)-getRGB(width-1,i)-30-40 000000。所以我不理解为什么相邻像素集之间的差异如此之大 原始图片

  • 一个问题是当我发现反面最小时 差额我检查这对边的最小差额总和 带有反面-仅在总和相互匹配的情况下 的差异我将这些边定义为相邻边,如果 公共最小和小于定义的阈值 以我自己的经验为依据-在我的情况下,我认为约为1500万 (RGB差异),但这只是一个近似值。

  • 但是还有第三个,可能是最困难的问题-如何检查 匹配的一面不是整个图像的边缘,即使有 总和的相互匹配,小于阈值,但实际上 两侧不匹配,因为它们在原始位置不相邻 图片?!

  • 方法相对较好,除了需要注意的许多方面 考虑到以及移动和更改网格的困难 Java Swing布局中的单元格。例如“单边”的匹配 问题发生在我的第三个测试映像中,在最后一个 迭代,但也可能在一开始就发生。阈值是 在上述某些情况下,对于没有算术的一方来说(确实是 相互匹配且金额最小),或根据实际匹配 侧面。

那么简单的建议和参考是什么 算法,使用哪些更可靠的边缘检查和图案?为什么相邻边的rgb值之差这么大? 我什至以前都读过,它应该求和rgb平方值之和,但是它会发生什么变化?另请阅读有关采用一些基于统计的算法的建议,以便可能检查所有组合-检查从每个当前边(不只是一个边)遍历的边组合,然后选择最佳组合。

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)