`
xiaozhouzhou
  • 浏览: 13936 次
  • 性别: Icon_minigender_1
社区版块
存档分类
最新评论

分形浅谈——科赫曲线和L-System

 
阅读更多
分形浅谈
开始接触到分行图时,感觉很难,无法下手,只能做出第一层或第二层,后续的就做不下去了。但是当你找出里面的规律之后就不一样了。分形,其本质可以说是迭代递归的一种运用。以下是我找出的一个分形制作的一个步骤:
一、观察分形图的结构,找出它的特点,也就是它的共同点,他可以有什么构成得到。
二、观察分形图的角度的变化。也就是说后面的一层是前面一层经过多少度的转角得到。
三、归纳出一个可行的递归方法体。
下面以科赫曲线来进行阐述。
我们先观察它的图形:

可以发现它是由下面这个简单的图形变化而来:

所以第一步先写出这个图形来。然后找出他接下来演变的规律。一般都是观察前后角度的变化规律。如下:

前后两个图形的变化可以看作是前面一个图形中间线段顺时针或逆时针旋转递归画图得到。接着,我们可以找出它的迭代递归的代码体:
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_;
			}
		}
		
	}  

这两段代码为主要代码,搞清楚思路之后就没问题了,不一定要照着这个方式写。
下面给出一些其他分形图:



  • 大小: 3.2 KB
  • 大小: 2.2 KB
  • 大小: 2.1 KB
  • 大小: 23.1 KB
  • 大小: 30.1 KB
分享到:
评论

相关推荐

    L-system-31.rar_L-Studio_L-system_L-system-31_L_system_Studio

    《L-System 3.1:探索模型世界的神奇工具》 L-System,全称是“Lindenmayer System”,是一...无论你是生物学家、计算机科学家、艺术家还是对分形几何感兴趣的业余爱好者,L-System 3.1都能为你带来无尽的乐趣和启示。

    分形算法与程序设计——Visual Basic实现--光盘文件

    分形(Fractal)是一种在数学、几何学和计算机科学中具有广泛应用的复杂形状或结构,它们具有自相似性,即在不同尺度上保持相似的特性。在编程领域,分形算法是通过计算机程序来生成这些图案的关键工具,Visual ...

    l-sys-code_L-system_

    L-系统(L-system或 Lindenmayer system)是一种形式语法,由生物学家 Aristid Lindenmayer 在1968年提出,主要用于描述植物生长和分形几何的数学模型。这个模型通过一套简单的规则来生成复杂图形,常用于计算机图形...

    分形对象——形、机遇和维数.pdf

    分形对象——形、机遇和维数. 分形创始人的力作

    计算机图形学期末大作业-构建L-system分形树.zip

    # 构建L-system分形树 ## 一、基本概念### 1、L-system&emsp;Lindenmayer系统,简称L系统,是由荷兰乌特勒支大学的生物学和植物学家,匈牙利裔的林登麦伊尔(Aristid Lindenmayer)于1968年提出的有关生长发展中的...

    分形几何——数学基础及其应用

    本书《分形几何——数学基础及其应用》(第二版)由英国数学家Kenneth Falconer编写,是一部经典的教材和参考资料。该书首次出版于2003年,并由John Wiley & Sons, Inc.出版。中文版由人民邮电出版社出版,译者为曾...

    JAVA实现L-System树形绘制

    - 创建 `Lstate` 和 `Lsystem` 实例,并执行绘图操作。 2. **`main` 类详解**: - 初始化时设置了一些默认值,如初始规则为 `"FF+[+F-F-F]-[-F+F+F]"`。 - 主函数内部循环迭代生成新字符串。 - 调用 `Lsystem` ...

    计算机图形学实验——科赫雪花

    利用分形写的科赫雪花,可以进行拖动、拾取的功能,按N、M改变雪花的边数

    Godot-L-System-Fractal-Trees:Godot L系统分形树

    总的来说,Godot-L-System-Fractal-Trees项目提供了一个学习和实践GDScript以及分形几何、乌龟绘图和物理模拟的宝贵平台。它展示了Godot引擎的强大功能,以及如何用编程语言来创造艺术和自然界中的美丽现象。对于...

    L-System算法的美英文版

    此外,L-System算法允许通过调整生成规则中的参数来控制分形图形的复杂度和形态。 该算法在数学和艺术领域中都得到了广泛应用,因为它能够在计算机中生成具有高度复杂性和美观性的图案,与自然界中的植物形态有着...

    分形初论--------分形的初步介绍

    ### 分形初论——分形的初步介绍 #### 一、引言 分形是一种复杂的几何形状或图案,它在各个尺度上都表现出自相似的性质。这种自相似性不仅体现在数学模型上,而且广泛存在于自然界和社会现象之中。本文旨在通过对...

    Koch.rar_科赫曲线MATLAB_科赫曲线及其他迭代分形代码

    科赫曲线matlab程序代码,仅供了解原理,了解迭代过程。

    java 实现L-system系统

    void draw(LSystem lSystem, int iterations) { String currentString = lSystem.getAxiom(); for (int i = 0; i ; i++) { currentString = lSystem.applyRules(currentString); } for (char c : current...

    FGN分形高斯噪声与FBM分形布朗运动序列的生成--及功率谱估计matlab

    分形高斯噪声与分形布朗运动序列的生成--及功率谱估计matlab "分数阶高斯噪声随机数据仿真系统的设计与实现.pdf" create_fgn.m degree_create.m degree_create_fbm_sucess.m EMD emd.m EMD.rar EMDfenshufourier.pdf...

    L-system2.zip_C++_zip

    - **分形艺术**:例如,著名的科赫曲线、树状分形等都可以通过L-系统生成。 - **建筑设计**:在计算机辅助设计(CAD)中,L-系统可以用于生成有规律的几何结构。 6. **扩展功能**: - **颜色和厚度变化**:在L-...

    计算文档.zip_W-M_W-M 分形函数_W-M分形函数_w-m分形

    根据W-M的分形函数,生成W-M函数的曲线,请批评指教。

    科赫曲线:用于生成科赫曲线的接口-matlab开发

    科赫曲线,也被称为科赫雪花,是一种经典的分形几何形状,由德国数学家费迪南德·冯·科赫在1904年提出。它通过一系列迭代过程从简单的直线段逐步演变而来,每一步迭代都将一条直线段替换为四个相同长度的线段,每个...

    分形市场分析——将混沌理论应用到投资与经济理论上

    分形理论是一种全新的股票投资理念,为你开启股市盈利大门

    分形曲线分形几何学之二-windfern.m

    分形曲线分形几何学之二-windfern.m 分形曲线 分形几何学之一: https://www.ilovematlab.cn/thread-88859-1-1.html 程序: lyapunovfractal2.m 结果: 1.gif ...

Global site tag (gtag.js) - Google Analytics