JAVA分形图像生成研究报告.docx
《JAVA分形图像生成研究报告.docx》由会员分享,可在线阅读,更多相关《JAVA分形图像生成研究报告.docx(24页珍藏版)》请在冰点文库上搜索。
JAVA分形图像生成研究报告
安徽农业大学
毕业论文<设计)
论文题目基于JAVA的分形图像生成技术的研究
姓名李万奎学号05138047
院系信息与计算机学院专业计算机科学与技术
指导教师魏雅鹛职称讲师
中国·合肥
二oo九年六月
安徽农业大学学士学位论文<设计)开题报告
课题名称
基于JAVA技术分形图像生成技术的研究
课题来源
指导老师
学生姓名
李万奎
专业
计算机科学与技术
学号
05138047
指导教师姓名
魏雅鹛
职称
讲师
研究内容
该课题深入研究了分形理论并基于分形理论生成各种形式的分形图像,使用Java进行编程,完成如下功能
1.L系统和Koch曲线实现图像公里
2.利用Java代码编写L系统和Koch曲线公里
3.JavaApplet技术处理Java代码
4.运行程序显示分形图像
研究计划
2009.3.1~3.20做整体的需求分析并完成开题报告
2009.3.21~4.4完成各模块的设计方案
2009.4.5~5.10分别编写各模块的代码、调试程序、方案实现
2009.5.11~5.20总结毕业设计结果并书写毕业设计说明书
2009.6月初撰写毕业设计论文
特色与创新
用JavaApplet来处理L系统图像和Koch曲线分形理论算法,同时Java技术解决了跨平台的问题。
指导教师意见
教研室意见
学院意见
主要领导签名:
年月日
目录
1引言-1-
2设计思想-2-
3系统的总体设计-3-
3.1系统分析-3-
3.2系统功能设计-5-
3.3系统流程设计-5-
4系统实现-5-
4.1L系统算法设计-5-
4.2Koch曲线算法设计-11-
4.3Applet模块设计-14-
5小结-16-
参考文献-16-
英文摘要-16-
致谢-17-
附录-17-
基于JAVA的分形图像生成技术的研究
学生:
李万奎指导老师:
魏雅鹛
(安徽农业大学信息与计算机学院合肥230036>
摘要:
分形是描述自然界和非线性系统中不光滑和不规则几何形体的有力工
具。
大量事实表明,分形广泛存在于自然界,分形涉及的领域已遍及数学、理、化学、材料科学、生物与医学、地质和地理学、地震和天文学以及计算机科学等。
分形的研究既有重要的理论意义,又有广泛的应用价值。
分形理论与计算机科学理论的结合为实现图像数据压缩提供了新的途径。
其中分形理论包括几种分形算法:
字符串替换算法、随机迭代算法、逃逸时间算法、反函数迭代算法、分形插值算法、动力系统迭代等等,使大量复杂的信息资料由“分形理论中最基本运算”进行图像压缩处理,提高计算机信息储存功能,具有重要的理论和经济意义。
本课题就是研究分形理论结合Java技术、L系统算法和Koch曲线实现分形图像的生成。
关键字:
JAVA;分形;L系统;Koch曲线
1引言
自然界是宇宙万物的总称,是各种物质系统相互作用相互联系的总体,它包括大至宇宙天体的形成演化,小到微观世界中基本粒子的运动。
随着牛顿经典力学的创立,爱因斯坦相对论,以及量子力学的发展,人类在自然科学方面已经取得了辉煌的成就;随着天体物理学以及其他相关学科的迅速发展,人类已经登上月球,进入太空;人类对微观世界由质点组成的简单系统的运动规律也有了全面而正确的认识。
尽管如此,如果人们稍微注意一下周围环境中发生的大量非线形不可逆现象,就会发现,人们对这些现象知之甚少,对许多问题甚至于束手无策。
当你仰望蔚蓝的天空,常常可以看到天空中漂浮着一团团白云,尽管它的形态是千变万化的,但是如果用不同倍数的望远镜来观察云团时,它的形态几乎是保持不变,也既是说白云的形态和望远镜的放大倍数无关[1]。
分形理论使人们能以新的观念,新的手段来处理这些难题,透过扑朔迷离的无序的混乱现象和不规则的形态,揭示隐藏在复杂现象背后的规律,局部和整体之间的本质联系。
分形理论在某些学科的成功尝试,极大地激发了科学研究工作者的兴趣,他们把分形理论逐渐扩展到其它的学科领域,更进一步的促进了分形学的发展。
分形作为一门新兴学科,其应用潜力是巨大的,尤其是在计算机模拟方面更是具有很大的实用价值。
所以,学习和研究分形,实现分形在实际生活中的应用,都具有一定很强的诱惑力。
JAVA是一种简单的,面向对象的,分布式的,解释型的,健壮安全的,结构中立的,可移植的,性能优异、多线程的动态语言。
同时java平台也具有跨平台的功能,使用Java语言编写的程序,不需要任何改动,就可以移植到另一个平台上运行。
在JavaApple中,可以实现图形绘制、字体和颜色控制、动画和声音的插入、人机交互及网络交流等功能.Apple还提供各种名为抽象窗口工具箱(AWT>的窗口环境开发工具,但是AWT的设计是存在缺陷的,取而代之的Swing技术为JavaGUI足见的轻量组建。
它们利用用户计算机的GUI元素,可以建立标准的图形用户界面,如窗口、按钮、滚动条等等。
目前,在网络上用Applet来生动地展现这些功能越来越多。
L系统通过对植物对象生长过程的经验式概括和抽象,初始状态与描述规则,进行有限次迭代,生成字符发展序列以表现植物的拓扑结构,并对产生的字符串进行几何解释,就能生成非常复杂的分形图形
2设计思想
本研究课题主要的功能是分形图像生成,主要表现为:
第一:
分形理论的图像的生成
分形的概念是美籍数学家曼德布罗特(B.B.Mandelbort>首先提出的.它也是当今科学很有影响的,自相似原则和迭代生成原则是分形理论的重要原则。
分形形体中的自相似性可以是完全相同,也可以是统计意义上的相似。
对分形的研究极大的赋予人们对自然界想象和认识。
分形研究不断发现很多美丽的图像,让人联想起现实世界的复杂多变的自然结构,利用的价值就会很高。
比较典型的生成分形图像方法,L系统。
L系统是美国生物学家AristidLinderMayer于1968年提出的.L-系统的本质是一个重写系统,通过对植物对象生长过程的经验式概括和抽象,初始状态与描述规则,进行有限次迭代,生成字符发展序列以表现植物的拓扑结构,并对产生的字符串进行几何解释,就能生成非常复杂多变的分行图像.L系统是极其有趣的,1,这种方法能够生成许多经典的分形,2.用它可以模拟生物形态,特别是能表达植物的分枝结构。
就因为是L系统本质是一个字符串重写系统,我们把字符串解释成曲线(更准确地说,称作图形>,于是只要能生成字符串,也就等于生成了图形。
L系统的工作原理非常简单,仅仅是对几个简单的字符进行操作。
L系统是一个简单由“F”,“+”,“-”等字符组成的字符串,串的形成前提是必须具备的条件,并且按照一定的规则替换。
母串中的字母“F”可以被子串替代,这样就完成了一次替换,依此类推,就可以完成L系统的迭代。
比如:
公理:
F
规则:
F-F++F-F
第一次迭代:
F-F++F-F
第二次迭代:
F-F++F-F-F-F++F-F++F-F++F-F-F-F++F-F
……………………………………………………………
……………………………………………………………
……………………………………………………………
生成原理是:
F表示向前画一条线段。
“+”表示旋转+N°,“-”表示旋转-N°,每作用一级,所画线段的长度变为上一级的三分之一,其中N表示多少度。
从一个初始串(叫做公理>开始,将变换规则多次作用于其上,最后产生一个较长的命令串,用它来绘图。
作用一次,称作一级(order>,一般说来选择的级数不宜太高,通常选2-8级,最多15级[6]。
L系统细说起来也有若干种,通常指“0L系统”。
0L系统可定义为一个三元组〈V,ω,P〉,设V表示“字母表”(alphabet>,V^*表示V上的所有“单词”(words>,ω∈V^*是一个非空的单词,称作公理(axiom>,P包含于V×V^*是产生规则的有穷集。
<见附录B)
因此,理论上由L系统产生的分形曲线,又叫Koch曲线,同时实际上也是一个无限迭代的过程。
第二 用随机L系统表示植物分形信息
自然界中的物质不是固定不变化的,几乎都是随机的,世界上也不可能又2种生物是完全一样的,尽管是相同的植物,同样也会存在差异。
环境改变了形态变异,为了产生细节上的不同变化,能让植物够逼真,就引入随机L系统[5]。
随机的L系统是有序的四元素集,表达式为:
G其中V,ω的意义和三元式一样的。
P是随机的生产规则集,π为函数。
3系统的总体设计
3.1系统分析
本课题研究分行理论分形图像技术的研究,现实的形态多种多样,如果都用图片收藏的话,会占用很多空间,同样使用起来也不方便,所以要引用分形图像,同时分形图像也很形象,使用起来也很方便。
功能包括如下几个方面的要求:
1、分形的定义组成部分某种方式和整体相似的形体。
分形图像的方法很多种,常见的用的L系统、三分康托集、Julia集、Koch曲线等等,本课题使用的是L系统和Koch曲线。
2、L系统的定义和算法,主要随机L系统的四元素集
3、Koch曲线的算法主要分三步,第一步:
初始图行一条线段。
第二步:
将线段的中心三分之一向外折起来。
第三步:
把第二步的得到的线段继续将该线段三分之一向外折起来,一次下去,无限进行下去就能到一个图像了。
4、编写JAVA语言,利用JavaApplet处理L系统和Koch曲线的计算方法。
根据以上要求,所以这个课题是建立在计算机基础上的。
其实现的功能是用户能看见形象化的分形图像,比如植物,曲线等等,都比较逼真,和现实社会会有些差别,但是应用是很方便的也很广泛的,对植物的全面的形象化有了未来的设想,同样对研究植物的人来说是一个很好的助手。
图1流程图
3.2系统功能设计
本课题的功能主要分为以下几个方面:
第一:
Koch曲线的算法。
Koch曲线的生成过程是很简单的,但是Koch曲线是很复杂的,因为由一个线段无限的迭代,有很多折点,折点也是不能忽略的,这些线段的大小是可以修改的,大小决定分形图像的形态。
第二:
L系统的算法。
L系统其实是一个字符串重写系统,同样L系统的工作原理也是很简单的,利用字符串生成各种各样的不同的图行,每一个图形都是符合一个公式的,一个复杂的植物也能用L系统生成[4]。
第三:
Java编程处理分形理论。
利用JavaApplet处理L系统算法和Koch曲线算法,编写程序处理分形理论算
法,实现分形图像的生成。
3.3系统流程设计
系统的整体流程是:
用分形理论L系统和Koch曲线获得分形图像的算法,然后,利用Java编写Applet程序处理分形理论的算法,最后得到分形图像。
因为用到Java环境,同时也解决了跨平台问题。
4系统实现
4.1L系统算法设计
L系统主要侧重拓扑植物结构的表达,用抽象的规则描述植物的形态和生长规律,L系统结构化比较简单,很容易现实,而且定义也很简洁。
把计算机生成分形图像的算法通常叫做:
“迭代”,程序中实现的形式是“递归”调用,因为递归程序很难用一般的方法来控制它的流程。
但是它的优点是算法比较简单些[2]。
定义1如果一个集合在欧氏空间中的Hausdorff维数DH恒大于其拓扑维数DT即DH>DT则称该集合为分形集,简称为分形。
定义2组成部分以某种方式与整体相似的形体叫分形。
对于定义1的理解需要一定的数学基础,不仅要知道什么是Hausdorff维数,
而且要知道什么是拓扑维数,看起来很抽象,也不容易推广。
定义1.2比较笼统的说明了自然界中的物质只要局部和局部或者局部和整体之间存在自相似性,那么这个物质就是分形。
正是这一比较“模糊”的概念被人们普遍接受,同时也促进了分形的发展。
L系统的公理和产生式都是由字符串描述的,并且要使字符串
和图形联系起来,就要把每个字符赋予特定的含义。
现在采用龟形加以说明。
将龟形形态定义为三元素集合(x,y,a>,其中(x,y>是用笛卡儿坐标表示的龟图位置,a表示龟图的方向,给定步长d和角度增量d。
F(d>:
向前移一步,步长为d,龟形形态变为(x',y',a>,其中x'=x+dcosa,y'=y+dsina,在点(x,y>和(x',y'>之间画一直线段。
+(d>:
向左旋转d,龟形的下一个状态为(x,y,a+d>,角的正向为逆时针方向。
-(d>:
向右旋转d,龟形的下一个状态为(x,y,a-d>,角的负向为顺时针方向。
L系统算法的关键在于字符串的生成,其中有很多变量。
参数如下:
startX:
整型变量,起始点的X坐标位置
startY:
整型变量,起始点的Y坐标位置
initDirection:
整型变量,开始绘画时的初始方向角
direction:
双精度变量,是角度变化的中间变量,记录当前角度值
lengthF:
双精度变量,每步步长(即画一条线段的长度>
rotation:
双精度变量,作图中的旋转角度
startDepth:
整型变量,画图迭代次数
ruleNumber:
整型变量,规则数
sStart:
字符串变量,公理(即生成元>
sRule[][]:
字符串变量,规则数组
doublePoint:
记录线段的两点,由类定义
用递归的方法,先入栈、后出栈。
入栈
aPoint.addElement(a>。
sDirection=String.valueOf(direction>。
aDirection.addElement(sDirection>。
出栈
a=(doublePoint>(aPoint.elementAt(aPoint.size(>-1>>。
sDirection=(String>(aDirection.elementAt(aDirection.size(>-1>>。
direction=Double.valueOf(sDirection>.doubleValue(>。
aPoint.removeElementAt(aPoint.size(>-1>。
aDirection.removeElementAt(aDirection.size(>-1>。
然后记录坐标点类:
类函数doublePoint(doublex2,doubley2>
参数:
x2点的x坐标
y2点的y坐标
树的形成:
先设置好参数,参数设置不同,形成的图像也不同。
图2树的参数
图3树的算法
图4生成的树分形图像
部分代码如下:
booleancolorLock=true。
intstartX=200。
//起始点
intstartY=10。
doubleinitDirection=90。
//作画时的初始方向
doubledirection。
//中间变量
doublelengthF=0.3。
//每步步长
doublerotation=30。
//作图中给定的转角
intstartDepth=10。
//画图迭代次数
intDepth=0。
intruleNumber=2。
//规则数
StringsStart。
//公理;即所要画的字符串
StringsRule[][]。
//规则数组
doublePointa,b。
//画线段的两点,由类定义
Graphicsg。
Choicechoice。
java.awt.Choicechoice3。
Buttonstep。
Panelp。
publicvoidinit(>
{
this.setLayout(newBorderLayout(>>。
sRule=newString[6][2]。
//初始化为"树"规则
sStart="X"。
sRule[0][0]="X"。
sRule[0][1]="F[+X]F[-X]+X"。
sRule[1][0]="F"。
sRule[1][1]="FF"。
choice=newChoice(>。
choice.addItemListener(this>。
step=newButton("单步执行">。
step.addActionListener(this>。
p=newPanel(>。
p.setLayout(newFlowLayout(>>。
p.add(step>。
add(p,"South">。
this.setSize(600,500>。
//主窗大小
reinit(>。
}
再如,树枝的分形图像,第一步先设置参数;
图5树枝的参数
第二步设置树枝算法:
图6树枝的算法参数
图7树枝的分形图像
4.2Koch曲线算法设计
Koch曲线的构造过程主要分为三大步:
第一步,给定一个初始图形一条线段;第二步,将这条线段中间的三分之一处向外折起;第三步,按照第二步的方法不断的把各段线段中间的三分之一处向外折起。
这样无限迭代的进行下去,最终就能构造出Koch曲线。
图8Koch曲线三次迭代过程
图9Koch曲线最终迭代过程
图8代码如下:
booleancolorLock=true。
intstartX=200。
//起始点
intstartY=2。
doubleinitDirection=60。
//作画时的初始方向
doubledirection。
//中间变量
doublelengthF=6。
//每步步长
doublerotation=60。
//作图中给定的转角
intstartDepth=7。
//画图迭代次数
intDepth=0。
intruleNumber=1。
//规则数
StringsStart。
//公理;即所要画的字符串
StringsRule[][]。
//规则数组
doublePointa,b。
//画线段的两点,由类定义
Graphicsg。
Choicechoice。
java.awt.Choicechoice3。
Buttonstep。
Panelp。
publicvoidinit(>
{
this.setLayout(newBorderLayout(>>。
sRule=newString[2][2]。
//初始化为"线段"规则
sStart="F"。
sRule[0][0]="F"。
sRule[0][1]="F-F++F-F"。
choice=newChoice(>。
choice.addItemListener(this>。
step=newButton("单步执行">。
step.addActionListener(this>。
p=newPanel(>。
p.setLayout(newFlowLayout(>>。
p.add(step>。
add(p,"South">。
this.setSize(600,500>。
//主窗大小
reinit(>。
}
首先,它有很多个折点,而且这些折点是不可微的,当然也就没有切线了。
其次,Koch曲线在许多方面的性质与三分康托集列出的那些性质类似,它由四个与总体相似的“四分之一”部分组成,但是比例系数是1/3。
它在任何尺度下的不规则性反映了它的精细结构,但是这样错综复杂的构造却出自于一个基本的简单结构。
现在把图8的初始图形改换成三角形,再按照上述的方法进行折叠,那么会得到另外一个分形,也既是Koch雪花。
其他部分分形图像:
图10环形分形图像
图11灌木丛分形图像
4.3Applet模块设计
本课题用javaApplet处理分行理论的算法,设计Applet主要程序和界面[7]:
packageByapplet。
//Byapplet包
importjava.awt.*。
importjava.awt.event.*。
importjava.util.Vector。
//java:
Vector类可以实现自动增长的对象数组<1.方便程序可读,2.程序直接调用Vector,既直接调用你要用的类)
importjava.util.Date。
//java包下util包下的Date<日期)这个类
importjava.applet.Applet。
图12Applet设计主界面
其中Test是主工程,Byapplet是包;Myhuanzhengfangxing.java、Myshu.java、Myshuzhi.java、Myxianduan.java、Myduichenshu、Myguangmucong是显示分形图像的六个Applet小程序。
部分代码:
确定起始坐标和起始方向。
start=false。
g=this.getGraphics(>。
g.clearRect(0,0,517,550>。
a=newdoublePoint(startX,startY>。
//起始点
direction=initDirection。
//起始的方向
HuiHua(g,sStart,startDepth>。
g.finalize(>。
running=false。
}
保存双精度
classdoublePoint
{//为保存双精度的点而新建一个类
doublex。
doubley。
doublePoint(doublex1,doubley1>
{x=x1。
y=y1。
}
}
}
5小结
本论文的主要工作与成果:
分形是描述自然界和非线性系统中不光滑和不规则几何形体的有力工具,大量事实表明,分形广泛存在于自然界,分形涉及的领域己遍及数学、物理、化学、材料科学、表面科学、生物与医学、地质和地理学、地震和天文学以及计算机科学等。
分形的研究既有重要的理论意义,又有广泛的应用价值。
因为用到Java技术,同时也解决了跨平台的问题。
参考文献
[1]《JAVA编程思想(第4版>》 作者:
(美>BRUCE ECKEL,译者:
陈昊鹏,出版日期:
2007-6-1,出 版 社:
机械工业出版社
[2]曾文曲.植物的枝的分形算法.《分形理论与分形的计算机模拟》.
[3]王方石.《L-系统在植物模拟中的作用》.北京:
北方交通大学学报,1998.6第三期,第22卷
[4]L-SystemExplorer.LastupdatedDecember28,2003at21:
34:
45.
[5]Inducibleexpressionofthe2-5Asynthetase/RNaseLsystemresultsininhibitionofvacciniavirusreplication.Diaz-GuerraM,RivasC,EstebanM.CSIC,CampusUniversidadAutonoma,Madrid,28049,Spain.
[6]RNaseLsystemresultsininhibitionofvacciniavirusreplication.
[7]APISpecificationofJ2SEVersion1.5(中文版>.SunMicrosystems,2004
英文摘要
JAVA-