`
univasity
  • 浏览: 809691 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

[图形算法]J2me上的凹凸拼图实现思路

阅读更多

出于个人兴趣,简单研究了一下凹凸拼图的实现。以下为本人的实现思路,多多交流。


以下来逐步讲解各个流程
 
生成拼图模板:


 
  
线框图形的填充需要用到填充算法,比较简单的是“种子填充算法”,但对于J2ME来说过多的递归会导致内存溢出。我测试了一下,如果使用8向连同方式,填充72X72的区域就会导致溢出了。
种子填充算法的相关链接:
 
对此我绕了个大弯,通过改良了一下广度优先搜索算法来实现。我们的目的就是填充一个指定的区域,给定一个起始点(先前我们生成模板时做的记录),然后以线框边界为障碍,遍历填充线框内的每个点。而搜索算法本身的作用是给定一个起始点和终点,然后搜索可行路径,在搜索的过程中是试探式的,也就说如果一直没有找到终点,就会一直遍历下去,直到所有点都被尝试过了。我们这里就利用这点,让他找不到终点,然后试图遍历所有的点来达到填充的目的。而我们也得设定结束的条件,对此我用步数来限定(限定为图块像素的数量,这样做不一定合理,但能保证完全遍历,因为遍历的范围不会超出这个区域,而遍历过的路径也不会重复)。
这里给出一个实现:
/**
     * 使用指定颜色填充多边形
     * @param shape 包含多边形的图片
     * @param sx    多边形区域内的任意一点X坐标
     * @param sy    多边形区域内的任意一点Y坐标
     * @param borderColor   多边形的边界颜色
     * @param fillColor     希望填充的颜色
     */
	public static void fillPolygonWithColor(CustomImage shape, int sx, int sy,
			int borderColor, int fillColor) {

		int w = shape.getWidth();
		int h = shape.getHeight();

		int size = w * h;

		/*************************************
		 * 下面是通过广度优先搜索算法进行遍历
		 */
		int[][] pFace = { { 0, -1 }, { -1, 0 }, { 0, 1 }, { 1, 0 } };

		int maxStep = size;
		int[] path = new int[maxStep];

		boolean AllComplete = false;
		int LevelNow = 1;
		int Act = 0;
		int ActBefore = 0;
		int MaxAct = pFace.length;
		int ActNow = 0;
		int sID = sy * w + sx;

		int[] LevelFoot = new int[maxStep];
		int[] Table = new int[maxStep];

		// 参数初始化
		LevelNow = 1;
		LevelFoot[1] = 0;
		LevelFoot[0] = -1;
		path[0] = sID;

		while (!AllComplete) {
			LevelNow++; // 进入下一层搜索
			if (LevelNow >= maxStep)
				break;
			LevelFoot[LevelNow] = LevelFoot[LevelNow - 1];
			for (ActBefore = LevelFoot[LevelNow - 2] + 1; 
             ActBefore <= LevelFoot[LevelNow - 1]; ActBefore++) {
				// 遍历预设的几个方向
				int srow = path[ActBefore] / w;
				int scol = path[ActBefore] % w;
				for (Act = 1; Act <= MaxAct; Act++) {
					if (!AllComplete) {
						// 试探下一步是否可行
						int trow = srow + pFace[Act - 1][0];
						int tcol = scol + pFace[Act - 1][1];

						if (trow < 0 || trow >= h || tcol < 0 || tcol >= w)
							continue;

						int tID = trow * w + tcol;

						if (tID < 0 || tID >= size) {
							continue;
						}
						if (Table[tID] == 1) {
							continue;
						} else {
							Table[tID] = 1;
						}
						if (shape.getRGB()[tID] == borderColor) {
							continue;
						}
						// 标记当前状态
						sID = tID;
						LevelFoot[LevelNow]++;
						ActNow = LevelFoot[LevelNow];
						path[ActNow] = sID;
						shape.getRGB()[sID] = fillColor;
						// 检测结束条件
						if (LevelNow >= maxStep)
							AllComplete = true;
					}
				}
			}
		}
	}
 
我们在遍历的同时提取填充为新的图片,而不直接在模板上填充。生成独立的模板便于后续的操作。
 
接下来我们通过蒙板从原图中提取不规则图块,这类似于DirectX中用实现图片透明的做法。需要一个填充为纯色的底图(蒙板),然后同时遍历蒙板和原图进行像素提取,生成新的图块。
 
具体思路可参考:
 
当蒙板生成后,就可以根据当初记录的起始坐标从原图中提取出对应的图块。


 
一个简单的实现(主要是当做练习和确定某些想法是否可行,所以实现不是很完整。顽童能跑):
  • 大小: 208.9 KB
  • 大小: 97.1 KB
  • 大小: 67.9 KB
5
0
分享到:
评论
4 楼 clarketang 2010-09-14  
大大,PuzzleGame_09.08.04.jar的源码可不可以分享下啊。
我邮箱 clarkehunter@126.com
万分感谢!
3 楼 稻-草 2010-04-20  
有没有具体代码可以分享下?
2 楼 univasity 2010-04-19  
稻-草 写道
赞一个。

问下博主,图片处理后,图片边缘的下凹效果和阴影效果是如何实现的?


观察得很仔细
这需要找到边界的点,再将颜色转为HSL,改变其亮度。目前我只是简单的判断了左右来处理明暗,立体效果还不是很强。至于阴影,按着图块的形状直接填充一张黑色的图即可,但比较毫内存,有更好的处理可以说说,呵呵。
1 楼 稻-草 2010-04-19  
赞一个。

问下博主,图片处理后,图片边缘的下凹效果和阴影效果是如何实现的?

相关推荐

    基于J2ME的简单拼图游戏

    这款基于J2ME的简单拼图游戏展示了如何利用Java语言在小型设备上实现交互式娱乐功能。 **1. J2ME基础** J2ME包含了一套运行时环境和一组可扩展的框架,用于在不同类型的设备上构建和部署应用程序。它主要由配置...

    基于J2ME的智能拼图游戏的设计与实现java毕业论文.docx

    本资源主要介绍了基于 J2ME 的智能拼图游戏的设计与实现的 Java 毕业论文,涵盖了 J2ME、手机游戏、算法、智能拼图等知识点。 知识点一:J2ME 技术概述 J2ME(Java 2 Platform Micro Edition)是一种 Java 平台,...

    j2me 实现拼图 一共三个类

    总结来说,这个J2ME拼图游戏项目涵盖了基本的图形用户界面设计、事件处理、游戏逻辑实现和资源管理。对于学习J2ME开发的初学者,这是一个很好的实践项目,因为它涉及到许多关键概念,如对象模型、图形绘制、用户输入...

    J2ME拼图游戏源代码【内附指导书】

    4. 图形处理:J2ME提供Canvas类,可以自定义绘制图形,实现拼图的显示和动画效果。 5. 用户界面:使用Form或Alert等组件构建简单易用的交互界面,供玩家操作。 三、源代码分析 在"PinTu"文件中,我们可以找到游戏的...

    J2ME小游戏 拼图

    通过分析这个"J2ME小游戏 拼图"项目,不仅可以学习到基本的J2ME编程技巧,还能深入理解游戏开发中的图形处理、用户交互和资源管理等多个方面,对于提升移动开发能力具有很大帮助。如果你对这个项目感兴趣,可以从源...

    java基于J2ME的智能拼图游戏的设计与实现源码.rar

    Java基于J2ME的智能拼图游戏是一种在移动设备上实现的经典娱乐应用,它利用了Java Micro Edition(J2ME)平台的特性,为用户提供了一种互动式的游戏体验。J2ME是Java的一个子集,专门针对嵌入式设备和移动设备设计,...

    J2ME拼图游戏

    - 性能优化:由于J2ME运行在资源有限的设备上,开发者需要考虑内存管理和图形渲染效率,避免无谓的计算和资源浪费。 总的来说,J2ME拼图游戏展示了移动开发的灵活性和多样性。通过合理利用J2ME提供的API,开发者...

    A算法使用j2me实现

    根据提供的文件信息,我们可以深入探讨A*算法在J2ME平台上的实现方法和技术要点。首先,需要明确的是,A*算法是一种广泛应用于路径查找和图遍历中的算法,它能够找到从起点到终点的最短路径。而在本例中,我们关注的...

    基于J2ME的智能拼图系统的设计与实现论文.docx

    "基于J2ME的智能拼图系统的设计与实现" J2ME技术概述 J2ME(Java 2 Platform, Micro Edition)是一种专门为移动设备和嵌入式系统设计的Java平台。它提供了一个灵活的开发环境,允许开发者创建可以在各种移动设备上...

    WTK_pt.rar_J2ME 拼图游戏_拼图 j2me

    本项目“WTK_pt.rar”是一个基于J2ME的拼图游戏,通过面向对象编程技术实现,展现了在移动平台上开发游戏的基本流程和技巧。 一、J2ME基础 J2ME由配置(Configurations)、简表(Profiles)和功能包(Packages)...

    J2ME实现的九宫格拼图

    基于JDK1.3的J2ME的九宫格拼图,资源为源码,属于src下的com.homework3中,注意图片资源需要放在src目录下,并且大小调整为210*210(必须被三整除),代码中有判断逆序数的函数,即随机生成的拼图必须可解,可参考我...

    j2me 开发的 拼图小游戏 源代码

    Java ME(J2ME)是Java平台的一个子集,主要用于移动设备、嵌入式系统和其他有限资源的设备上的应用程序开发。这个"j2me 开发的 拼图小游戏 源代码"是一个适合初学者学习的例子,它可以帮助开发者了解如何在Java ME...

    J2ME 拼图游戏源码

    4. **图形渲染**:J2ME使用` Graphics `对象进行绘图,开发者需要创建一个类来负责画布上的所有图形操作,包括绘制拼图块、背景、边框等。可能有一个名为` GameView `的类,它继承自` Canvas `或` Displayable `,并...

    j2me拼图游戏源码

    在移动设备上实现游戏,尤其是像拼图游戏这样简单而有趣的智力游戏,是J2ME应用的一个典型场景。本文将深入探讨基于J2ME的拼图游戏源码,带你走进这个小型但充满挑战的游戏世界。 首先,我们来看一下拼图游戏的基本...

    J2ME插值算法实现图片的放大缩小方法

    J2ME虽然资源有限,但仍然可以通过使用插值算法来实现高质量的图像缩放。插值算法是一种用于提高图像分辨率的方法,它通过在原始像素之间插入新的像素值来实现平滑的放大效果,避免像素化的现象。本文将深入探讨J2ME...

    J2ME 手机 拼图 游戏

    综上所述,这个J2ME手机拼图游戏的实现涉及了J2ME的基础架构、游戏逻辑、数据持久化和图像处理等多个核心知识点。通过理解并分析这些组件,我们可以学习到如何在移动平台上构建一个完整的互动娱乐应用。对于想要深入...

    j2me可以用ZIP算法

    综上所述,J2ME 提供了对 ZIP 和 GZIP 压缩格式的支持,开发者可以通过 `java.util.zip` 包中的类实现文件的压缩和解压缩功能,这对于在有限存储空间的设备上处理大量数据非常有用。在实际应用中,需要根据具体需求...

    net.npaka.puzzlegame.rar_java 拼图_拼图_拼图 j2me_拼图游戏

    本文将深入探讨一款基于Java技术的拼图游戏,特别关注其在J2ME(Java Micro Edition)平台上的实现,以及如何通过该平台带给用户独特的拼图游戏体验。这款名为"net.npaka.puzzlegame"的游戏,以其精美的动漫美女拼图...

    j2me拼图游戏+游戏动画

    2. 图形平移:在拼图游戏中,当用户移动一块图像时,需要实现平滑的过渡效果。利用坐标变换,计算出每次移动的距离,然后逐步更新图像位置。 3. 缓动算法:为了增加游戏的流畅感,可以引入缓动函数,使图像块在移动...

    J2ME插值算法实现图片的放大缩小

    本文主要讨论如何使用插值算法在J2ME环境中实现图片的放大和缩小。首先,我们需要理解图像缩放的基本原理。 1. 图像缩放的基本思想: 图像放大或缩小涉及到图像坐标系统的变换。在放大图像时,新的目标图像坐标可能...

Global site tag (gtag.js) - Google Analytics