我试图以破碎的碎片打破图像,但我无法理解逻辑,请给我如何实现的方法。
我希望下面的图片可以提供我的想法,我想要的东西,将位图分成三角形或任何形状的破碎碎片。之后我会将这些位图形状改组,并让最终用户按顺序重新排列它们。
答案 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
形成了不相交的区域。
对于n
次,您随机选择位于矩形的4个边缘的两个端点
2a上。尝试加入这两点:从任一端点开始,如果你得到一个与之前画过的另一条线的交点,则停在十字路口,否则停在另一个终点
n+1
不相交的区域,其中n
行已绘制如果您对这些区域有特殊要求,可以约束您的线条。
有关实施细节,您可能需要查看dot product和euler's theorem