`
zlele
  • 浏览: 37492 次
  • 性别: Icon_minigender_2
社区版块
存档分类
最新评论

分形(递归)

阅读更多
其实,刚开始学迭代和递归的时候,完全没想过用它来画图···只是知道可以用递归计算,比如1+2+3+4+5+...+100=?然后,发现可以通过不断画线画点形成各种有趣的图形。
1.开始画的是利用一个点,通过迭代画出一层一层的圆,三角形,正方形,线。例如圆,先 要随机得到初始点的两个坐标;然后让坐标进行若干次的加(减),并改变宽和高,就能画出一层层的圆。

// 取随机数
        Random random=new Random();
        //得到随机数
    	x1=random.nextInt(500)+10;
 		y1=random.nextInt(500)+10;
 		x2=x1;
 		y2=y1;
 		a=x2;
 		b=x2;
 //画矩形
        if(command.equals("rect")){
        	//迭代次数
        	for(int i=0;i<20;i++){
        	   //左移5
        	   x1=x1-5;
        	   //上移5
               y1=y1-5;
               //宽加10
               x2=x2+5;
               //高加10
               y2=y2+5;
               //设置渐变色,因为变化太小,所以*10
               Color c=new Color(3+10*i,20+5*i,190+i);
               g.setColor(c);
               g.drawRect(x1, y1,Math.abs(x2-x1), Math.abs(y1-y2));
            }
        }
  //画圆
        else if(command.equals("oval")){
        	//迭代次数
        	for(int i=0;i<40;i++){
        	   //每次画圆左移5
        	   x1=x1-5;
        	   //每次画圆上移5
               y1=y1-5;
               //宽增10
               x2=x2+5;
               //高增10
               y2=y2+5;
        	   g.drawOval(x1, y1,Math.abs(x2-x1), Math.abs(y1-y2));}
        }
//画线
        else if(command.equals("line")){
        	//迭代次数
        	for(int i=0;i<40;i++){
        	  //每次画线起点左移3
        	  x1=x1-3;
        	  //每次画线终点右移3
        	  x2=x2+3;
        	  //起点上移3
        	  y1=y1+3;
        	  //终点上移3
        	  y2=y2+3;
        	  g.drawLine(x1, y1, x2, y2);}
        }
 //三角形
        else if(command.equals("triangle")){
        	//迭代次数
        	for(int i=0;i<40;i++){
        	//x1,y1是中间的点,剩下的是底边两点	
        	//顶点每次往上移动7
        	y1=y1-7;
        	//底边的点每次向上移动5
        	y2=y2+5;
        	//底边右点每次右移7
        	a=a+7;
        	//底边左点每次左移7
        	b=b-7;
        	g.drawLine(x1, y1, b, y2);//左线
        	g.drawLine(x1, y1, a, y2);//右线
        	g.drawLine(a, y2, b, y2); //底边
         }
        }

2.画完这些,就画利用迭代,通过函数构成的图形
Xn+1=d sin(a Xn)-sin(b Yn)
Yn+1=c cos(a Xn)+cos(b Yn)
当a=1.40,b=1.56,c=1.40,d=-6.56
开始画的时候,直接用的函数,自然是什么都显示不出来,因为画图时要用int,但是式中数值为double,所以要转型,如果直接转型,比如,1.49就变成1,0.50也是1,但这两个数值差很大,所以要将它们扩大若干倍,才能减小误差。
//手镯
        else if(command.equals("bangle")){
        	//按照滑动条的大小控制每次点击是增加的点
        	value=sl.getValue();
        	//取随机数控制颜色
    		Random r=new Random();
    		int c=2;
    		int c3=56;
    		int c4=r.nextInt(200);
            for(int i=0;i<value;i++){
            	//改变颜色
                c=0;
                c3=c3+1;
                //int c2=r.nextInt(255);
        		//int c3=r.nextInt(139);
                double a2=(-6.56)*Math.sin(1.40*a1)-Math.sin(1.56*b1);
	        	double b2=1.40*Math.cos(1.40*a1)+Math.cos(1.56*b1);
	        	//第二种图形
	        	//double a2=Math.sin((-2)*b1)-Math.cos((-2)*a1);
		        // double b2=Math.sin((-1.2)*a1)-Math.cos(2*b1);
	        	a1=a2;
	        	b1=b2;
	        	c2=value;
	        	//if(c2>200)
	        		//c2=value/15;
	            g.setColor(new Color(c,c3,c4));
	        	g.drawLine((int)(a1*20+400), (int)(b1*20+400),(int)(a1*20+400), (int)(b1*20+400));
	        	//g.setColor(new Color(c3,25,25));
	        	//第二种图形
	        	//g.drawLine((int)(a1*40+400), (int)(b1*40+400),(int)(a1*40+400), (int)(b1*40+400));
			    }
        }

3.又高端一点的图形--科赫曲线
  最初看到科赫曲线,就是好熟悉的感脚,不知从何入手····经过老师的引导,慢慢也画出来一个不会旋转的科赫曲线。思路就是,科赫曲线中一共有六种线,分情况讨论。
/**
 * 画科赫曲线
 * @author zll
 *
 */
public class Draw {
	private Graphics g;
	public Draw(Graphics g){
		this.g=g;
	}
	/**
	 * 画科赫曲线
	 * @param x1
	 * @param y1
	 * @param x2
	 * @param y2
	 * @param n
	 */
   public void showDraw(int x1,int y1,int x2,int y2,int n){

	   int xx1,xx2,xx3,yy1,yy2,yy3;
	   if(n<1)
   	      return;
       //一三线隐藏
       //横线上方
       if((y1==y2)&&(x2>x1)){
          xx1=x1+(x2-x1)/3;
          yy1=y1;
          xx2=(x1+x2)/2;
          yy2=y1 -(x2-x1)/3*(int) Math.sqrt(3)/2;
          xx3=x2-(x2-x1)/3;
          yy3=y1; 
          }
       //右上方斜线
       else if((y2<y1)&&(x2>x1)){
    	   xx1=x1+(x2-x1)/3;
    	   yy1=y1-(y1-y2)/3;
    	   xx2=x1;
    	   yy2=y2+(y1-y2)/3;
    	   xx3=x2-(x2-x1)/3;
    	   yy3=y2+(y1-y2)/3;
       }
       //左上方斜线
       else if((y2<y1)&&(x2<x1)){
    	   xx1=x1-(x1-x2)/3;
    	   yy1=y1-(y1-y2)/3;
    	   xx2=x2;
    	   yy2=yy1;
    	   xx3=x2+(x1-x2)/3;
    	   yy3=y2+(y1-y2)/3;
       }
       //直线下方
       else if((y1==y2)&&(x2<x1)){
    	   xx1=x1-(x1-x2)/3;
    	   yy1=y1;
    	   xx2=(x1+x2)/2;
    	   yy2=y1+(x1-x2)/3*(int) Math.sqrt(3)/2;
    	   xx3=x2+(x1-x2)/3;
    	   yy3=y1;
       }
       //左下方斜线
       else if((x2<x1)&&(y2>y1)){
    	   xx1=x1-(x1-x2)/3;
    	   yy1=y1+(y2-y1)/3;
    	   xx2=x1;
    	   yy2=y2-(y2-y1)/3;
    	   xx3=x2+(x1-x2)/3;
    	   yy3=yy2;
       }
       //右下方线
       else{ 
    	   xx1=x1+(x2-x1)/3;
    	   yy1=y1+(y2-y1)/3;
    	   xx2=x2;
    	   yy2=yy1;
    	   xx3=x2-(x2-x1)/3;
    	   yy3=y2-(y2-y1)/3;
       }
      // g.setColor(Color.white);
	  // g.drawLine(x1, y1, xx1, yy1);
	 //  g.drawLine(xx3, yy3, x2, y2);
    g.setColor(Color.RED);
    g.drawLine(x1, y1, x2, y2);
    g.drawLine(xx1, yy1, xx2, yy2);
    g.drawLine(xx3, yy3, xx2, yy2);
    g.setColor(Color.white);
    g.drawLine(xx3, yy3, xx1, yy1);
    showDraw(x1,y1,xx1,yy1,n-1);
    showDraw(xx1,yy1,xx2,yy2,n-1);
    showDraw(xx2,yy2,xx3,yy3,n-1);
    showDraw(xx3,yy3,x2,y2,n-1);
}

4.再高端一点点---毕达哥拉斯树
 private double Q1=30;
   /*
         * 画树
         */
	 public void draw(int x1,int y1,int x2,int y2,int jiaodu,int n){
		 //设置退出
		 if(n>5){
			 return;
		 }
		 //起始线长
		 double s1=Math.sqrt((x2-x1)*(x2-x1)+(y2-y1)*(y2-y1));
		 //起始线角度
		 double sin1=Math.sin(jiaodu*pi/180);
		 double cos1=Math.cos(jiaodu*pi/180);
		 //三角形角度
		 double b=s1*Math.cos(Q1*pi/180);
		 //得到正方形左上方的点
		 double x3=x1-s1*sin1;
		 double y3=y1-s1*cos1;
		 //得到正方形右上方的点
		 double x4=x2-s1*sin1;
		 double y4=y2-s1*cos1;
		 //偏过角度的累加
		 double sin=Math.sin((jiaodu+Q1)*pi/180);
		 double cos=Math.cos((jiaodu+Q1)*pi/180);
		 //得到三角形的顶点
		 double x5=x3+b*cos;
		 double y5=y3-b*sin;
		 //画线
		 g.drawLine(x1, y1, x2, y2);
		 g.drawLine(x1, y1, (int)x3, (int)y3);
		 g.drawLine(x2, y2, (int)x4, (int)y4);
		 g.drawLine((int)x3, (int)y3, (int)x4, (int)y4);
		 g.drawLine((int)x3, (int)y3, (int)x5, (int)y5);
		 g.drawLine((int)x4, (int)y4, (int)x5, (int)y5);
		 //递归(三角型的两边)
		 draw((int)x3,(int)y3,(int)x5,(int)y5,(int)(jiaodu+Q1),n+1);
		 draw((int)x5,(int)y5,(int)x4,(int)y4,(int)(jiaodu-Q2),n+1);
    }

5.随意一点---网状图
改变函数的值,画出不同的图形,通过鼠标点击,慢慢画
if(command.equals("net")){
  	    	for(int i=0;i<40000;i++){
  	    	double a=1.6,b=4.6,c=6.0;
  	    	Random r=new Random();
    		int c2=r.nextInt(200);
    		int c3=r.nextInt(200);
    		int c4=r.nextInt(200);
		    double a2=b1-Math.signum(a1)*Math.sqrt(Math.abs(b*a1-c));
        	double b2=a-a1;
        	a1=a2;
        	b1=b2;
            g.setColor(new Color(c2,c3,c4));
        	g.drawLine((int)(a1*2+400), (int)(b1*2+400),(int)(a1*2+400), (int)(b1*2+400));
        }
  	    }



  • 大小: 67.8 KB
  • 大小: 20.3 KB
  • 大小: 33.5 KB
  • 大小: 8.1 KB
  • 大小: 14.6 KB
分享到:
评论

相关推荐

    分形递归算法实现分叉树

    分形递归算法是一种在计算机科学中广泛应用的数学方法,特别是在图形生成、图像处理和复杂系统建模等领域。分形,简单来说,是指那些在不同尺度上具有自相似性的几何形状或模式。它们通常展现出无穷的细节,即使放大...

    分形递归树的森林景观实时模拟方法

    ### 分形递归树的森林景观实时模拟方法 #### 一、引言 随着计算机图形学的发展,如何高效地模拟大规模自然场景成为了该领域的重要课题之一。这些场景不仅包括简单的地形地貌,更涉及复杂的森林景观。森林景观由...

    分形图案 奇妙的递归

    "奇妙的递归"这一主题,揭示了分形图形的核心特性——递归构造。递归是数学和计算机科学中的一个重要概念,它通过重复一个过程来解决问题或生成结构,每次迭代通常将问题规模减小或简化。 Koch曲线,是由瑞典数学家...

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

    本项目标题“通过递归实现分形图形绘制”旨在教给初学者如何利用递归方法创建出美丽的分形图形。在VS2015环境下,你可以通过这个项目学习到如何设置和编译C++项目,并了解递归在实际编程中的应用。 首先,我们需要...

    分形盒子递归法cpp

    用递归法求分形盒子使得输入一个n出先一个有规律的盒子,不断得扩大

    分形插值算法和MATLAB实验.pdf

    分支结构分形递归算法研究如下图(图 2.4)的分支结构图的递归算法。图 2.4分支结构分形图细分此分支结构,建立模型如下,其中取 A 为起点,且记 A 点坐标为(x,y),B 点坐标为(x1,x2),线段AB = L, 2 .3BC = BD...

    摇曳的递归分形树

    递归是实现分形的一种常见方法,通过重复应用相同的过程或函数,但每次应用时都对输入进行缩小或变换,从而创建复杂的结构。在计算机图形学中,递归分形树是一种用以模拟自然界中复杂树形结构的有效方式,尤其适用于...

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

    递归法是实现分形图形的一种常用方法,通过重复执行相同或相似的过程来生成复杂的结构。本实例是使用VC++(Visual C++)编程环境,通过递归算法来绘制分形图形。 在"VC 递归法图形分形算法.rar"这个压缩包中,我们...

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

    在这个名为“turtle-递归美学-分形树-draw_branch.rar”的压缩包中,我们找到了一个名为`draw_branch.py`的文件,它展示了如何利用递归技术来创建美丽的分形树。分形是一种具有自相似性的几何形状,即无论在大尺度...

    递归分形树源码

    **递归分形树源码解析** 分形树是一种基于分形几何理论的图形,它通过重复应用相同或相似的规则来创建具有自相似性的树形结构。在计算机图形学中,递归算法常用于实现分形树的生成,因为它能够以简洁的方式描述复杂...

    递归出来的美丽分形世界

    "递归出来的美丽分形世界"这一标题,暗示我们将探讨通过递归算法创建的分形图形。递归是编程中的一个重要技巧,它允许函数调用自身来解决复杂问题,而分形则是一种通过迭代和递归过程构建出的几何形状。 这篇博客...

    递归分形树之动画实现

    递归分形树的实现是基于数学和编程技术,特别是递归算法的应用。递归是一种解决问题的方法,它通过将问题分解为更小的子问题来解决原问题。在分形树的上下文中,递归意味着每个树干会分成若干个更细的分支,这些分支...

    几种分形图形的制作,主要是用递归实现的

    本项目探讨了几种通过递归算法实现的分形图形的制作方法,包括分形树、斯宾斯基篓垫(Sierpinski Triangle)、Couch曲线以及分形矩形。这些图形的生成不仅展示了数学的美感,也是计算机图形学领域的重要研究内容。 ...

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

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

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

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

    3d max maxscript fractal tree

    在3D建模领域,利用3D Max结合MaxScript编程技术来实现复杂形状的构建是一项非常有趣且实用的技术。...总之,利用3D Max和MaxScript结合分形递归函数能够帮助我们高效地创造出各种令人惊叹的视觉效果。

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

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

    雪花分形-OpenGL

    雪花分形的生成主要依赖于迭代和递归。在数学上,分形是由自我相似性定义的,即在不同尺度上,一个对象或图案与其自身的部分具有惊人的相似性。雪花分形最著名的例子是科赫雪花,它是通过将等边三角形的每一条边替换...

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

    在 Delphi 开发环境中,我们可以利用递归算法来实现分形图形的绘制,例如绘制一棵分形大树。这个实例项目 "Delphi递归法绘图分形大树Tree及节点" 提供了一种方法,让我们可以通过编程来生成逼真的树状结构。 首先,...

Global site tag (gtag.js) - Google Analytics