我现在继续我的等值线追踪算法系列中的最后一个话题,等值线的填充。
等值线一系列的问题中,严格上讲,真正是我做的还只有我要讲到的填充了,我前面也说过,算法是比较会让人
头疼的一种东西,等值线的填充也是,前面的那两个追踪和光滑多多少少都有文章啦,源码呀来给我参考,虽然
说并没有做的比较好,但还是有个参考做的还基本达到了项目的要求了,但这个填充呢,资料非常的少,更不要
说源码了,我做出来的这个例子其实只是一个示例,它还有一些问题没有解决,就是颜色的梯度变化,比如说中间
填了60这个颜色,上面究竟填55,还是填65的问题,就没有解决,当时做完了这个示例,老师就让我去做三维的控件
了,也就没有深入的解决这个问题,如果网友谁做好了,不知道可否发我一分,大家交流交流。
说到三维控件,我就多说几句,三维这方面的资料也象那些什么样的算法一样少的可怜,最烦人的就是没有人教,
学起来非常的痛苦,记得其中有两个问题,一个就是平移的问题,就是三维空间中的物体要鼠标移动到哪里,物体
就移动到哪里,这个问题在我学习MDX的两个月中一直都没有做好,这当中我也问了好多人,别人没有一个人回答的,
记得只有CSDN中有一个网友提供了一个方法,思路比较好,可是还是没有解决问题,这个问题还是后来我无意中看到
浙大老师的一个示例时才想到的,没有想到非常的简单,只要一句代码就好了。所以说有人教的话,也不会拖两个多月了,
还有一个问题就是旋转,也是一个烦人的问题,这个可不是说一句代码就可以做好的,也是做了好久才做好的,以后
我也写一个什么系列,只写这两个问题,就平移和旋转,因为我们这学Directx时这两个问题烦了人两个多月,我一直
想在别人游戏公司这两个问题肯定不是问题,可是别人就是不告诉你,唉。
回到主题上来,做等值线方面的人一定会有“等值线生成与填充算法”,孙桂茹写的那篇论文,我的填充算法就是根据
那个做出来的,当然我也找了一些这方面资料对比以后才用这个方法的,不过也好,这样我的查阅资料的能力也提高了
不少,越是资料少就越对人的查阅能力要求更高,没有人教就越对人的自学能力要求更高。在那篇论文中,她的算法
思路大概就是:
等值线只会有上面的a), b), c), d)这四类,它们的覆盖关系为: a 区内部决不会出现b 区, b 区内部决不会出现c 区。
因此, 在填充时只要依据一定的顺序依次填充第三(c)、第二(b)、第一种等值线(a)与网格边界所围的区域, 然后按照由
外层向内层的顺序填充第四种等值线(d)所围的区域就可以完成对整个区域的填充。
整个算法的基本描述如下:
1) 按起点纵坐标从下至上的顺序对起点在左边界上的等值线排序;
2) 按起点横坐标从左至右的顺序对起点在上边界上的等值线排序;
3) 按起点纵坐标从上至下的顺序对起点在右边界上的等值线排序;
4) 按起点横坐标从右至左的顺序对起点在下边界上的等值线排序;
5) 按起点横坐标从左至右的顺序对内部封闭的等值线排序;
6) 填充第三种等值线与网格下边界或左边界以及起点和终点所在的边界所围的区域。对最后一条等值线, 则还需填充
与网格上边界或右边界所围的区域;
7) 填充第二种等值线与起点和终点所在的边界以及这二边界相交的顶点所围的区域;
8) 填充第一种等值线与起点和终点所在的边界的顶点所围的区域;
9) 填充内部封闭等值线所围的区域.
按着这个做下去就可以达到目的,算法无论别人怎么讲,你都是学不会的,只有你自己悟到
了,才能算自己真正的学会了,我这里就不贴代码了。但我告诉大家一个比较好的方法,就是
找一个要填充的等值图,按照上面给的方法,在纸上把它们里面的规律找出来,然后自己写程序
就可以了。这个我现在没有讲清楚是因为过两天老师回来以后,我就会去更加深入的做一下,前面也说了,我只做了一个
示例,后来我就没有做这个了,而由老师接手,想把这个集成到我们的项目里面去,可是时间太紧,别人不停地催老师
小结报告,老师没有办法,就只好将这个功能推迟,现在老师回来了,也就到了时候将这个深入下去了,当我做好了以后,
我会把整套的程序完整的上传上来,也将这篇文章重新写一下。
我做的示例:
http://files.cnblogs.com/ouzi/等值线/ContourFill01.rar