`
陌陌天使
  • 浏览: 22525 次
  • 性别: Icon_minigender_2
  • 来自: 长沙
社区版块
存档分类
最新评论

公式和递归实现的初步分形【2-递归篇】

 
阅读更多

上一篇介绍了一些有数学公式实现分型的例子,下面将介绍一些由递归实现的分形。

由递归实现分形是应该注意:1.一定要用一个标志来结束循环,不然会系统会抛出堆溢出错误

                                              

 

                                             2.尽量把思路理清,把代码简化

谢宾斯基三角形



 升级版谢宾斯基三角形,有3D效果



 

谢宾斯基地毯



 

科赫曲线



 

科赫雪花



 

package cn.kml.递归20130706;

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;

public class Triangle extends JFrame{
	
	//窗体可见后,获取窗体上的画布对象
	private Graphics g;
	
	//程序的入口主函数
	public static void main(String[] args) {
		
		
		Triangle tr = new Triangle();
		tr.unitUI();
	}   
		public void unitUI(){
			this.setTitle("Recursion");
			this.setSize(900,700);
			//在窗体上实例化一个面板对象
			JPanel jp = new JPanel();
			//设置面板的大小
			jp.setPreferredSize(new Dimension(150,0));
			//在面板上加一个按钮对象
			JButton bu = new JButton("Sierpinske");
			JButton bu1 = new JButton("Rectangle");
			JButton bu3 = new JButton("Koch-Snow");
			JButton bu2 = new JButton("Koch Curve");
			JButton bu4 = new JButton("Tree");
			jp.add(bu);
			jp.add(bu1);
			jp.add(bu2);
			jp.add(bu3);
			jp.add(bu4);
			bu.setForeground(Color.BLUE);
			bu1.setForeground(Color.BLUE);
			bu2.setForeground(Color.BLUE);
			bu3.setForeground(Color.BLUE);
			bu4.setForeground(Color.BLUE);
			bu.setBackground(Color.LIGHT_GRAY);
			bu1.setBackground(Color.LIGHT_GRAY);
			bu2.setBackground(Color.LIGHT_GRAY);
			bu3.setBackground(Color.LIGHT_GRAY);
			bu4.setBackground(Color.LIGHT_GRAY);
			//把面板加到窗体上
			this.add(jp,BorderLayout.EAST);
			this.setLocationRelativeTo(null);
			this.setDefaultCloseOperation(3);
			this.getContentPane().setBackground(Color.BLACK);//设置背景颜色
			this.setVisible(true);
			//窗体可见后,获取画布对象
			g= this.getGraphics();
			RecuesionListener rl = new RecuesionListener(g);
			bu.addActionListener(rl);
			bu1.addActionListener(rl);
			bu2.addActionListener(rl);
			bu3.addActionListener(rl);
			bu4.addActionListener(rl);
		}
		
		
}

 

package cn.kml.递归20130706;

import java.awt.Color;
import java.awt.Graphics;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

public class RecuesionListener implements ActionListener{
	private Graphics g;
	static int state=10;
	static int state1=6;
	static int state2=2;
	static int state3=7;
	static int state4=7;
	static int state5=10;
	
	public RecuesionListener(Graphics g){
		this.g=g;
	}
	public void actionPerformed(ActionEvent e) {
//		g.clearRect(0, 0, 750, 690);
		if(e.getActionCommand().equals("Sierpinske")){
			g.setColor(Color.WHITE);
			draw(350, 60, 50, (int)(50+300*Math.sqrt(3))+10, 650, (int)(50+300*Math.sqrt(3))+10, state);
//			g.setColor(new Color(210,210,200));
//			draw(340, 65, 40, (int)(50+300*Math.sqrt(3))+15, 640, (int)(50+300*Math.sqrt(3))+15, state);
//			g.setColor(new Color(180,180,170));
//			draw(330, 70, 30, (int)(50+300*Math.sqrt(3))+20, 630, (int)(50+300*Math.sqrt(3))+20, state);
			
		}
		
		if(e.getActionCommand().equals("Rectangle")){
			drawRec(50,50,650,state1);
		}
		if(e.getActionCommand().equals("Koch Curve")){
			drawKoch(50,600,700,600,state3);
		}
		if(e.getActionCommand().equals("Koch-Snow")){
			drawSnow(700,550,400,(int)(550-Math.sqrt(3)*300),100,550,state4);
		}
		if(e.getActionCommand().equals("Tree")){
			drawTree1(300,600,100,5,1);
		}
	}
	public void draw(int x1,int y1,int x2,int y2,int x3,int y3,int state){
		state--;
		if(state>0){
		//画出最外面的三角形
			g.drawLine(x1, y1, x2, y2);
			g.drawLine(x1, y1, x3, y3);
			g.drawLine(x2, y2, x3, y3);
			//算出任意两点的中点坐标
				int x12=(int)((x1+x2)/2);
				int y12=(int)((y1+y2)/2);
				int x23=(int)((x2+x3)/2);    
				int y23=(int)((y2+y3)/2);
				int x13=(int)((x1+x3)/2);
				int y13=(int)((y1+y3)/2);
				g.drawLine(x12, y12, x13, y13);
				g.drawLine(x12, y12, x23, y23);
				g.drawLine(x13, y13, x23, y23);
	
	//递归调用
	draw(x1,y1,x12,y12,x13,y13,state);
	draw(x12,y12,x2,y2,x23,y23,state);
	draw(x13,y13,x23,y23,x3,y3,state);
	}else{
		return;
	}
	}
	
	public void drawRec(int x1,int y1,int x2,int state1){
		state1--;
		//先画出最外围的正方形
		g.drawLine(50,50,650,50);
		g.drawLine(50,50,50,650);
		g.drawLine(650,50,650,650);
		g.drawLine(50,650,650,650);
		//循环化出里面的正方形
		if(state1>0){
			int x11=(int)((x2-x1)/3+x1);
			int x22=(int)(2*(x2-x1)/3+x1);
			int y11=(int)((x2-x1)/3+y1);
			int y22=(int)(2*(x2-x1)/3+y1);
			g.fillRect(x11, y11, x22-x11,x22-x11);
		//递归调用函数
			drawRec(x1,y1,x11,state1);
			drawRec(x22,y1,x2,state1);
			drawRec(x1,y22,x11,state1);
			drawRec(x22,y22,x2,state1);
			drawRec(x11,y1,x22,state1);
			drawRec(x22,y11,x2,state1);
			drawRec(x11,y22,x22,state1);
			drawRec(x1,y11,x11,state1);
		}else{
			return;
		}
	}
	
	public void drawKoch(int x1,int y1,int x2,int y2,int state3){
		int x3 = (2*x1+x2)/3;
		int x4 = (x1+2*x2)/3;
		int y3 = (2*y1+y2)/3;
		int y4 = (y1+2*y2)/3;
		int x5=0,y5=0;
		g.setColor(Color.BLUE);
		if(y1 == y2){
			x5 = (x3+x4)/2;
			y5 = (int)(y1-Math.sqrt(3)*(x4-x3)/2);
		}else if(y1>y2){
			if(x1<x2){
				x5 = x1;
				y5 = y4;
			}else if(x1>x2){
				x5 = x2;
				y5 = y3;
			}
			}else if(y1<y2){
				if(x1>x2){
					x5 = x1;
					y5 = y4;
				}else if(x1<x2){
					x5 = x2;
					y5 = y3;
				}
			}
		if(state3==1){
			g.drawLine(x1, y1, x2, y2);
			}
		if(state3<=0){
			return;
		}
		drawKoch(x1,y1,x3,y3,state3-1);
		drawKoch(x3,y3,x5,y5,state3-1);
		drawKoch(x5,y5,x4,y4,state3-1);
		drawKoch(x4,y4,x2,y2,state3-1);
		}
	public void drawSnow(int x1,int y1,int x2,int y2,int x3,int y3,int state4){
		g.setColor(Color.BLUE);
		if(state4>0){
		drawKoch(x2,y2,x1,y1,state4-1);
		drawKoch(x3,y3,x2,y2,state4-1);
		drawKoch(x1,y1,x3,y3,state4-1);
		}else{
			return;
		}
		
	
	}

	}

 

  • 大小: 3 KB
  • 大小: 12.9 KB
  • 大小: 24 KB
  • 大小: 14 KB
  • 大小: 3.7 KB
  • 大小: 16.8 KB
分享到:
评论

相关推荐

    turtle-递归美学-分形树-draw_branch.rar

    在这个分形树的实现中,递归是一个关键概念。递归是指一个函数或过程调用自身的过程,通常用于解决具有重复子问题的问题。在分形树的例子中,我们从一个简单的树干开始,然后每次递归调用都会创建更小的分支,这些...

    opengl L系统递归算法实现分形树

    在这个"opengl L系统递归算法实现分形树"的例子中,我们将深入探讨如何利用OpenGL和L系统来创建具有自相似性的分形树。 1. **OpenGL基础知识**: - OpenGL是跨语言、跨平台的图形API,用于渲染2D、3D矢量图形。 -...

    通过递归实现分形图形绘制

    分形(Fractal)是一种在数学、艺术以及...通过阅读和运行这些文件,你可以更深入地理解和学习如何使用递归实现分形图形的绘制。同时,这也是一个很好的实践项目,可以帮助你将理论知识转化为实际操作,提升编程能力。

    经典的分形程序--C曲线的递归算法

    C曲线,全称为Cantor曲线,是...通过学习和实现C曲线的递归算法,不仅可以掌握递归编程思想,还能深入理解分形的美妙世界。这个程序对于初学者来说是一个很好的实践项目,可以锻炼编程技巧,同时增进对分形几何的理解。

    VC 递归法图形分形算法.rar

    在计算机科学领域,...通过这个实例,开发者不仅可以学习到递归算法的概念和应用,还可以掌握如何在C++中使用类和图形库来实现分形图形的绘制。这将有助于提高编程技能,并对计算机图形学和算法设计有更深入的理解。

    分形几何-分形树源代码

    分形几何是一种在自然界中广泛存在的数学概念,它具有自相似性和无穷细节的特性。分形树是分形几何中的一个经典例子,模拟了自然界中树木的形态。在这个项目中,我们将探讨如何通过编程实现分形树的生成,以及相关的...

    递归的应用:最简单分形图形实现

    本示例通过创建一个最简单的分形图形来阐述递归的概念和实现方式。 分形,简单来说,是一种自相似的几何形状,即无论放大多少倍,局部细节都与整体保持相似性。在分形图形的绘制中,递归是核心思想,因为每个小部分...

    分形递归算法实现分叉树

    为了进一步了解并学习这个分形递归算法,你需要解压文件并查看其中的内容,尤其是源代码文件,这将提供实现分形树的具体步骤和技术细节。通过阅读和分析代码,你可以加深对递归算法和分形理论的理解,并可能激发你去...

    Delphi递归法绘图分形大树Tree及节点.rar

    总之,这个 Delphi 实例展示了递归分形算法在图形处理中的应用,为学习 Delphi 编程、图形编程以及递归算法的开发者提供了宝贵的实践素材。通过深入研究和理解这个项目,你不仅可以提升 Delphi 技能,还能对分形艺术...

    递归出来的美丽分形世界

    这篇博客可能详细介绍了如何使用编程语言(如Python、Java或C++)来实现递归算法,生成著名的科赫曲线(Koch Curve),这是分形几何中的经典例子。科赫曲线是由瑞典数学家Helge von Koch于1904年提出的,它通过将...

    python递归函数绘制分形树的方法

    Python递归函数绘制分形树是一种利用编程语言展现分形几何学概念的方式。分形几何是一种研究具有自相似性质的几何形状的数学分支。在本例中,我们将使用Python的turtle模块来创建一个分形树,它由多个相似但大小不一...

    经典的分形入门程序-Koch曲线的递归算法

    通过理解和实现Koch曲线的递归算法,不仅可以掌握分形的基础知识,也能对递归思想有更深的理解,这对于学习计算机图形学、算法设计等高级主题非常有益。 总之,Koch曲线的递归算法是理解分形概念的绝佳途径。通过...

    经典的分形入门程序--Canto三分集的递归算法

    递归结构使得代码简洁且易于理解,同时也便于理解和实现其他类型的分形。 在学习和实践这个程序时,你可以进一步探索不同参数(如迭代次数、颜色方案等)对分形图案的影响,这有助于增强对分形几何的理解。此外,还...

    采用递归算法编程实现下列分形树

    分形树是一种在计算机图形学和...综上所述,实现分形树的递归算法编程涉及到对递归的理解、图形绘制、动态效果以及摇曳效果的模拟。通过这样的项目,不仅可以学习到编程技巧,还能对分形几何和递归思想有更深入的认识。

    雪花分形-OpenGL

    总的来说,通过OpenGL和递归,我们可以生动地展现雪花分形的美丽和复杂性,不仅展示了数学的美妙,也提供了对计算机图形学深入理解的机会。学习并实现这样的项目有助于提升对OpenGL、分形理论以及递归编程的理解,...

    用非递归方法解决分形几何问题

    ### 用非递归方法解决分形几何问题 #### 分形几何概述 分形几何学是一门以非规则几何形态为研究对象的几何学。它主要用于描述自然界中的复杂形状,如海岸线、山脉等,这些形态往往表现出高度的不规则性。与传统的...

    MFC VC++实现Sierpinski分形图像

    2. **定义绘制函数**:创建一个自定义的函数,如DrawSierpinski(),用于递归地绘制Sierpinski分形。这个函数接受当前三角形的顶点坐标和迭代次数作为参数。 3. **递归绘制**:在DrawSierpinski()函数中,首先根据...

    商业编程-源码-用递归的方法画分形图.zip

    本资料包“商业编程-源码-用递归的方法画分形图.zip”显然包含了用于创建分形图像的源代码,让我们深入探讨递归和分形的概念以及如何在编程中实现它们。 首先,我们需要理解递归的基本原理。递归是一种函数或过程...

    摇曳的递归分形树

    如果它是源代码,那么可能包含实现递归分形树的关键函数和算法,例如初始化函数、递归生成树枝的函数、计算角度和长度的逻辑以及绘制和动画更新的循环。通过阅读和理解代码,我们可以进一步学习如何运用递归和分形...

Global site tag (gtag.js) - Google Analytics