- 浏览: 13357 次
- 性别:
最新评论
分形浅谈——科赫曲线和L-System
- 博客分类:
- java语言
分形浅谈
开始接触到分行图时,感觉很难,无法下手,只能做出第一层或第二层,后续的就做不下去了。但是当你找出里面的规律之后就不一样了。分形,其本质可以说是迭代递归的一种运用。以下是我找出的一个分形制作的一个步骤:
一、观察分形图的结构,找出它的特点,也就是它的共同点,他可以有什么构成得到。
二、观察分形图的角度的变化。也就是说后面的一层是前面一层经过多少度的转角得到。
三、归纳出一个可行的递归方法体。
下面以科赫曲线来进行阐述。
我们先观察它的图形:
可以发现它是由下面这个简单的图形变化而来:
所以第一步先写出这个图形来。然后找出他接下来演变的规律。一般都是观察前后角度的变化规律。如下:
前后两个图形的变化可以看作是前面一个图形中间线段顺时针或逆时针旋转递归画图得到。接着,我们可以找出它的迭代递归的代码体:
public void draw(int x1,int y1,int x2,int y2,int deepth,Graphics g,double angle){ if(deepth<=0){ g.drawLine( x1,y1,x2,y2); } else{ int x3=x1+(x2-x1)/3; int y3=y1+(y2-y1)/3; int x4=x1+2*(x2-x1)/3; int y4=y1+2*(y2-y1)/3; int l=(int) Math.sqrt((x4-x3)*(x4-x3)+(y4-y3)*(y4-y3)); int x5=(int) (l*Math.cos(angle)+x3); int y5=(int) (y3- l*Math.sin(angle)); draw(x1,y1,x3,y3,deepth-1, g,angle); draw(x3,y3,x5,y5,deepth-1,g,angle+Math.PI/3); draw(x4,y4,x5,y5,deepth-1, g,angle); draw(x4,y4,x2,y2,deepth-1, g,angle); } } }
这样就完成了对科赫曲线的大概制作过程。
下面给出完整的科赫曲线代码:
public class DrawKoch extends JFrame{ double angle=Math.PI/3; Graphics g; public static void main(String args []){ DrawKoch dk= new DrawKoch(); dk.init(); } public void init(){ setSize(800,800); setLayout(new FlowLayout()); setDefaultCloseOperation(3); setVisible(true); } public void paint(Graphics g){ super.paint(g); draw(20,600,600,600,5,g,Math.PI/3); } public void draw(int x1,int y1,int x2,int y2,int deepth,Graphics g,double angle){ if(deepth<=0){ g.drawLine( x1,y1,x2,y2); } else{ int x3=x1+(x2-x1)/3; int y3=y1+(y2-y1)/3; int x4=x1+2*(x2-x1)/3; int y4=y1+2*(y2-y1)/3; int l=(int) Math.sqrt((x4-x3)*(x4-x3)+(y4-y3)*(y4-y3)); int x5=(int) (l*Math.cos(angle)+x3); int y5=(int) (y3- l*Math.sin(angle)); draw(x1,y1,x3,y3,deepth-1, g,angle); draw(x3,y3,x5,y5,deepth-1,g,angle+Math.PI/3); draw(x4,y4,x5,y5,deepth-1, g,angle); draw(x4,y4,x2,y2,deepth-1, g,angle); } } }
科赫曲线,已经完成,接下来就讲讲L-System的原理及写法。
L-System对于我们来说可能会觉得很陌生或是感觉做出这个很困难,但只要你找出他的规律以及F,+,-是如何定义和表示的就能迎刃而解了。
我用L-System原理来来描述上面的科赫曲线规律:
对于一个L-System来说,我们首先需要一个字符串。比如对于科赫曲线,就用字符串:F+F--F+F(其中定义"F"为画一条直线,定义"+","-"分别为逆时针旋60度,顺时针旋转60度。)来表示科赫曲线的一层,以F->F+F--F+F作为科赫曲线的演变规则,这样就可以简单的画出科赫曲线了。如果你改变F的演变规则,或是"+","-"的定义,可以得到意想不到的图形。
下面是一段关于F字符串的遍历递归:
public void production(){ //母串的获取 str=jt1.getText(); //字串的获取 str1=jt2.getText(); //递归层数的获取 count=Integer.parseInt(jt5.getText()); for(int j=0;j<count-1;j++){ char[] ch=str.toCharArray(); String str2=""; for(int i=0;i<ch.length;i++){ if(ch[i]=='F'){ str2+=str1; }else { str2=str2+ch[i]; } } str=str2; } //画图方法的调用 print(str,center.getWidth(),center.getHeight()); }F字符串的定义:
for(int i=0;i<ch.length;i++){ //F的定义 if(ch[i]=='F'){ double x2=x1+len*x; double y2=y1+len*y; Line l=new Line(x1,y1,x2,y2); x1=x2; y1=y2; list.add(l); } //-的定义 if(ch[i]=='-'){ double x_=x*Math.cos(rx)-y*Math.sin(rx); double y_=x*Math.sin(rx)+y*Math.cos(rx); x=x_; y=y_; } //+的定义 if(ch[i]=='+'){ double x_=x*Math.cos(-ry)-y*Math.sin(-ry); double y_=x*Math.sin(-ry)+y*Math.cos(-ry); x=x_; y=y_; } } }
这两段代码为主要代码,搞清楚思路之后就没问题了,不一定要照着这个方式写。
下面给出一些其他分形图:
发表评论
-
线程的同步通信与线程范围内的数据共享问题
2013-10-02 22:05 1324线程的同步通信与线程范围内的数据共享问题一、线程的同步通信 什 ... -
多线程初谈——线程的创建与互斥问题
2013-10-01 18:13 1400多线程初谈——线程的创建与互斥 对于线程起初也很是不 ... -
网络通信见解之谈
2013-07-17 13:38 616一、网络通信的基本原理 现如今,出现了各式各样的聊天平 ... -
简单的bmp文件打开与保存
2013-07-01 22:24 881简单的bmp文件打开与保 ... -
对关键字final、static的理解
2013-05-10 23:36 534一、final关键字 fin ... -
对关键字的理解——访问权限
2013-05-10 16:17 598关键字public、pr ... -
队列的定义及运用
2013-03-23 14:58 640队列简称队,是限制在表的一端进行插入操作,而在表的另一端进行删 ... -
重绘方法的重写利用
2013-03-22 21:44 616重绘是为了在画布上保留原始痕迹的一种方法,他的目的是用来保存你 ... -
数组的定义及递归的运用
2013-03-22 21:43 1020一、数组有一维数组、 ... -
监听器与变量的作用域
2013-03-22 21:41 703监听器是用来实现一些可控操作的工具,如你在打开一个QQ界面的时 ... -
java中的继承
2013-03-08 00:31 566Java中的接口 什么是接口?不是以class定义的类而是以i ... -
Java中类的继承、重写、自动转型以及多态
2013-03-06 01:13 716Java中类的继承、重写、自动转型以及多态 1) 类的继承 在 ... -
java的构造器方法、方法重载和引用传递
2013-03-04 23:55 729Java的构造器方法、方法重载与引用传递 一、 构造器方法 构 ... -
JAVA语言中的类与对象
2013-03-04 00:08 731Java语 ...
相关推荐
分形算法与程序设计——Visual Basic实现--源代码,光盘,文档
分形对象——形、机遇和维数. 分形创始人的力作
分形几何 教材 [分形几何——数学基础及其应用].(英国)Kenneth.Falconer-OCR
L-system也能用于生成自相似的分形,例如迭代函数系统。此代码就是用它生成自相似的分形。程序涉及到一个主函数,两个类。主函数主要的功能是描述绘制的规则和其操作,类的主要功能则是存贮信息,对输入的字符进行...
科赫曲线matlab程序代码,仅供了解原理,了解迭代过程。
分形理论是一种全新的股票投资理念,为你开启股市盈利大门
利用分形写的科赫雪花,可以进行拖动、拾取的功能,按N、M改变雪花的边数
分形曲线分形几何学之二-windfern.m 分形曲线 分形几何学之一: https://www.ilovematlab.cn/thread-88859-1-1.html 程序: lyapunovfractal2.m 结果: 1.gif ...
通过选择迭代次数生成科赫曲线(或科赫雪花)分形的应用程序。 只需解压缩并运行 Koch_curve_GUI.m 文件。
这是一个用MATLAB语言写的生成科赫曲线的程序,其中科赫曲线是分形理论中的常见图形。
分形曲线分形几何学之二-newtongallery[1].zip 分形曲线 分形几何学之一: https://www.ilovematlab.cn/thread-88859-1-1.html 程序: lyapunovfractal2.m 结果: 1....
分形曲线分形几何学之二-nmervis[1].zip 分形曲线 分形几何学之一: https://www.ilovematlab.cn/thread-88859-1-1.html 程序: lyapunovfractal2.m 结果: 1.gif ...
python设计科赫曲线分形树
包括二十多个分形程序,从最简单的科赫曲线到曼代尔波集合.内容参见 分形艺术程序设计>>. (运行程序时,右键点出快捷菜单.先选定图形再作图.看复平面上的分形时, 请将const int STEP=4改为1.) 本程序用CB5编写,在...
分形曲线分形几何学之二-lyapunovfractal2.m 分形曲线 分形几何学之一: https://www.ilovematlab.cn/thread-88859-1-1.html 程序: lyapunovfractal2.m 结果: 1.gif...
Godot-L-系统分形树 Godot L系统分形树具有L系统,乌龟和Verlet集成资源
分形高斯噪声与分形布朗运动序列的生成--及功率谱估计matlab "分数阶高斯噪声随机数据仿真系统的设计与实现.pdf" create_fgn.m degree_create.m degree_create_fbm_sucess.m EMD emd.m EMD.rar EMDfenshufourier.pdf...
分形曲线分形几何学之二-fractal_explorer.m 分形曲线 分形几何学之一: https://www.ilovematlab.cn/thread-88859-1-1.html 程序: lyapunovfractal2.m 结果: 1.gif...
基于VC++用递归的思想,按照经典的分形理论中的C曲线编写的程序,是很不错的分形程序设计的入门资料。