如何在android中将图像分解为破碎的形状

时间:2014-03-10 07:22:27

标签: android algorithm

我试图以破碎的碎片打破图像,但我无法理解逻辑,请给我如何实现的方法。  enter image description here

我希望下面的图片可以提供我的想法,我想要的东西,将位图分成三角形或任何形状的破碎碎片。之后我会将这些位图形状改组,并让最终用户按顺序重新排列它们。

2 个答案:

答案 0 :(得分:1)

好吧,如果你想重新排列碎片(比如拼图),那么每个三角形/多边形都必须出现在一个带有透明背景的矩形位图中,因为这是绘制位图在Java / Android(以及其他大多数)中的工作原理环境)。

有一种方法可以在Android中进行这种屏蔽,称为porter-duff合成。 Android文档很难不存在,但有很多关于它在Java中使用的文章。

基本上你创建了一个足够大的矩形透明位图来保存你的剪切。然后,在此位图上绘制一个填充三角形(透明度非零),表示切出。它可以是你喜欢的任何颜色。然后使用Porter-Duff模式在正确的位置在源图像的顶部绘制剪切,该模式复制透明度数据,但不复制RGB数据。您将在透明背景下留下剪影。

如果使剪切位图与源图像的大小相同,则会更容易。我建议先让这个工作。这方面的缺点是双重的。首先,您将移动大位图以移动小切口,因此UI将更慢。其次,你将为位图使用大量内存,而在某些版本的Android上你可能会耗尽内存。

但是一旦你有了与源图像大小相同的位图,那么将其更改为适用于较小的位图应该非常简单。你的大部分“捣蛋”都将在寻找和使用正确的Porter-Duff模式。因为它们中只有16个,所以不必费力地尝试所有它们并看看它们的作用。他们可能会提出其他难题。

我注意到你的镂空部分都是多边形。只需要很少的额外复杂性,你就可以制作出你喜欢的任何形状,包括看起来像普通的拼图。为此,请使用Path类定义用于剪切的形状。 Path类适用于Porter-Duff合成,允许几乎任何形状的切口都可以想象。我在我的一个应用程序中广泛使用它。

答案 1 :(得分:0)

我不确定你想要制作什么益智游戏,但如果破碎碎片没有特殊要求, 只有它们可以跨越整个矩形的总数,您可以尝试执行以下步骤, 这个想法基本上是通过知道具有两个端点的n非相交线位于矩形的4个边缘中的任何一个上,n+1形成了不相交的区域。

  1. 创建数组并存储行信息
  2. 对于n次,您随机选择位于矩形的4个边缘的两个端点

    2a上。尝试加入这两点:从任一端点开始,如果你得到一个与之前画过的另一条线的交点,则停在十字路口,否则停在另一个终点

  3. 您将获得n+1不相交的区域,其中n行已绘制
  4. 如果您对这些区域有特殊要求,可以约束您的线条。

    有关实施细节,您可能需要查看dot producteuler's theorem