`
lwangkangrui
  • 浏览: 16453 次
  • 性别: Icon_minigender_2
最近访客 更多访客>>
社区版块
存档分类
最新评论

分形与递归

阅读更多


 最近学习的内容主要是和分形图形有关。

首先,是用循环做出了很多比较奇怪但是美丽的图形。不得不说,是好好体验了一次数学之美。


@Override
	public void mousePressed(MouseEvent e) {
		x1=e.getX();
		y2=e.getY();
		command = bg.getSelection().getActionCommand();

	}

	@Override
	public void mouseReleased(MouseEvent e) {
		
		if("Definition".equals(command)){
			System.out.println("!!!!!");
			for(int i=1;i<100000;i++){
				double a=1.7, b= 1.7, c= 0.06, d = 1.2;	
				x2=Math.sin(a*y1) +c*Math.cos(a*x1);
				y2=Math.sin(b*x1) +d*Math.cos(b*y1);
				x=50*x2+300;
				y=50*y2+150;
				
				 g.drawLine((int)x,(int)y,(int)x,(int)y);
				 g.setColor(Color.blue);
			    System.out.println("x坐标"+x+"y坐标"+y);
				    x1=x2;
				    y1=y2;
    	}
		}
    	else if("ring".equals(command)){
    		for(int i=1;i<100000;i++){
    			double  a = 1.40, b = 1.56, c = 1.40, d = -6.56 ;
    			x2 = d*Math.sin(a*x1)-Math.sin(b*y1);
    		     y2= c*Math.cos(a*x1) + Math.cos(b*y1);
    		     x=45*x2+300;
    			 y=45*y2+200;
    			 
    			 g.drawLine((int)x,(int)y,(int)x,(int)y);
    			    System.out.println("x坐标"+x+"y坐标"+y);
    			    x1=x2;
    			    y1=y2;
    	}
		

 
 看着很漂亮,其实代码比较简单,主要是运用一些函数。

        紧急着我们学习了递归。以前自己没有接触过,所以从最简单的开始。递归里面经典的Fibonacci序列开始学习。

package cn.netwkr0316;

public class Fibonacci {

	/**
	 * 递归求兔子的数量
	 */
	private int  rabbit=1;
	public int returnNumber(int month)
	{
		if(month>=3)
		{
			rabbit=returnNumber(month-1)+returnNumber(month-2);
		}
		else 
			rabbit=1;
		return rabbit;
	}
	public static void main(String[] args) {

		Fibonacci rabbit =new Fibonacci();
		System.out.println(rabbit.returnNumber(6));	
	}

}

这其中自己遇到了一些问题。其实很多是细节问题。比如传入参数的顺序,在方法定义里面与递归调用里面不同。导致看到的就是十分奇怪的图形。后来发现这个问题之后,调整之后写出来了。

         接下来是做谢宾斯三角形。一开始因为自己思路的错误,始终都只能画出一边来,后来改正思路,之后,又因为一些小细节出错了。最后才终于修成正果。



 

public void mouseClicked(MouseEvent e) {
		x1=e.getX();
		y1=e.getY();
		//画最大的三角形
		x2=x1+400;
		y2=y1;
		x3=(x1+x2)/2;
		y3=y1-Math.sqrt(3.00d)*(x3-x1);
		
		g.setColor(new Color((int)(Math.random()*255),(int)(Math.random()*255),(int)(Math.random()*255)));
		g.drawLine((int)x1, (int)y1, (int)x2,(int) y2);
		g.drawLine((int)x1, (int)y1, (int)x3,(int) y3);
		g.drawLine((int)x2, (int)y2, (int)x3,(int) y3);
		
		drawSJX(x1,y1,x2,y2,x3,y3,count);
		drawSJX1(x1,y1,x2,y2,x3,y3,count);
		drawSJX2(x1,y1,x2,y2,x3,y3,count);
		
				
	}
	
	public void  drawSJX(double x1,double y1,double x2,double y2,double x3,double y3,int count){
		x4=(x1+x3)/2;
		x5=(x2+x3)/2;
		x6=(x2+x1)/2;
		y6=(y1+y2)/2;
		y4=(y1+y3)/2;
		y5=(y2+y3)/2;
		count--;
		
		
		g.drawLine((int)x4, (int)y4, (int)x5,(int)y5);
		g.drawLine((int)x4, (int)y4, (int)x6,(int)y6);
		g.drawLine((int)x5, (int)y5, (int)x6,(int)y6);
		
	
		g.drawLine((int)(x1+x4)/2,(int)(y1+y4)/2,(int)(x6+x4)/2,(int)(y6+y4)/2);
		g.drawLine((int)(x1+x6)/2,(int)(y1+y6)/2,(int)(x6+x4)/2,(int)(y6+y4)/2);
		g.drawLine((int)(x1+x4)/2,(int)(y1+y4)/2,(int)(x1+x6)/2,(int)(y1+y6)/2);
		
		x2=x6;
		y2=y6;
		x3=x4;
		y3=y4;
		if(count>0){
		//画中间的三角形
			
				
				drawSJX(x1,y1,x2,y2,x3,y3,count);
				drawSJX(x2,y2,x3,y3,x1,y1,count);
				drawSJX(x3,y3,x1,y1,x2,y2,count);
				
				System.out.println("打印啦!1");
				
		}
		else{
			return;
		}

         这是比较核心的代码,drawSJX是分三个方向,分别画的。
         最后做的是科赫曲线,这是一个让我比较捉急的曲线。画了挺久的,最后在参考了一下大家的各种思路,自己选择了一个符合自己的。其实最主要的是顶点的问题。顶点有三种情况,要分开讨论。现在我画的这个,依然有点问题。

        一开始是有个角往内,后面是右边的角不对。



 

     level=3时的情况



       level=7时的情况,感觉像心电图一类的,囧。

       

public void mouseClicked(MouseEvent e) {
		x1=e.getX();
		y1=e.getY();
		x2=x1+300;
		y2=y1;
		
		KochPaint(x1,x2,y1,y2,this.level);
			
	
	}
	
	public void KochPaint(double x1,double x2,double y1,double y2,int level){
		
		if(level<=1){
			g.setColor(new Color((int)(Math.random()*255),(int)(Math.random()*255),(int)(Math.random()*255)));
			g.drawLine((int)x1, (int)y1, (int)x2, (int)y2);
			System.out.println("有输出~");
		}
		else {
			double x3=(2*x1+x2)/3;
			double y3=(2*y1+y2)/3;
			double x4=(2*x2+x1)/3;
			double y4=(2*y2+y1)/3;
			double x5=0,y5=0;
			double k=(y4-y3)*(x4-x3);
			
			 if(y3==y4){  
	                x5=(x3+x4)/2;  
	                y5=y3-(x4-x3)*Math.sqrt(3)/2; 	                
	            }
			 //左边那个角
			 else if(k<0){
	                y5=y4;  
	                x5=x1;	            
	            }
			//右边那个角 
			 else if(k>0){  
	                y5=y2;  
	                x5=x3;  
	       
	            }
			 if(x3==x4){ 
	                x5=x3;  
	                y5=y3;  	                
	            } 
    			
    			KochPaint(x1,x3,y1,y3,level-1);
    			KochPaint(x3,x5,y3,y5,level-1);
    			KochPaint(x4,x5,y4,y5,level-1);
    			KochPaint(x4,x2,y4,y2,level-1);
	            
			
		}

       右边的角总是出错,目前仍在改进中~
       

 

 

 

  • 大小: 65 KB
  • 大小: 15.8 KB
  • 大小: 21.3 KB
  • 大小: 43.2 KB
  • 大小: 3.9 KB
  • 大小: 4.5 KB
  • 大小: 6.5 KB
分享到:
评论

相关推荐

    分形盒子递归法cpp

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

    分形递归算法实现分叉树

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

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

    在计算机科学领域,分形是一种具有自相似性的几何形状,即使在局部放大后,仍然能够看到与整体相似的结构。这种现象在自然界中非常常见,如海岸线、山脉、雪花等。递归法是实现分形图形的一种常用方法,通过重复执行...

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

    在这个函数中,`length`参数代表当前分支的长度,`min_length`是停止递归的阈值,`branch_angle`决定了分支之间的角度,而`branch_ratio`则是分支长度与父分支长度的比例,影响树的形态。 通过调整这些参数,我们...

    混沌与分形-科学的新疆界(英文)

    《混沌与分形:科学的新疆界(第2版)》介绍了分形与混沌理论的基础知识、基本原理和特性,包括:分形与自相似、分形的维数与测度、分形与图像数据压缩编码、随机性与确定性、分形的递归结构、细胞元自动机与吸引子、...

    分形图案 奇妙的递归

    分形图的自相似性意味着无论放大多少倍,局部的细节都与整体的形状相似。这种特性在自然界中无处不在,如海岸线、云朵、山脉、雪花等,都能找到分形的影子。雪花的形状就是很好的例子,它们的六角对称性和复杂的分支...

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

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

    fun-fractals:借助分形对递归和图形进行实验

    通过这种方式,JavaScript不仅可以帮助我们理解分形和递归的概念,还能让我们在网页上实时生成和交互这些美丽的数学结构。这使得学习编程变得更加有趣和直观,同时也让数学和艺术之间的界限变得模糊,促进了跨学科的...

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

    综上所述,通过结合分形递归算法与OpenGL函数库,可以有效地模拟出高度逼真的森林景观。这种方法不仅能够生成多种形态各异的树木,还能通过动态调整视点距离来优化渲染效果。未来的研究可以进一步探索如何提高模拟的...

    递归出来的美丽分形世界

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

    递归分形树源码

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

    摇曳的递归分形树

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

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

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

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

    3. Couch曲线:Couch曲线是一种基于迭代的分形曲线,与著名的Lindenmayer系统(L-系统)相关。L-系统是一套规则,用于生成几何形状,通过递归地应用一组简单的替换规则生成复杂曲线。Couch曲线的具体生成方式可能...

    python数据结构与算法-已转档.pdf

    2. 排序和搜索:讨论了排序算法(如插入排序)、搜索算法(如二分查找)以及递归与非递归的实现。 3. 文件系统操作:如何利用递归遍历目录及其子目录下的所有文件。 4. 数学计算:涉及幂运算、整数进制转换、以及...

    递归分形树之动画实现

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

    用递归的方法画分形图

    用递归的方法画分形图 用递归的方法画分形图  分形几何是数学领域里新兴的课题,如果将图形的每个元素按某种规则进行变形,得到新的图形,以此类推,进行若干次变形后得到的图形就是分形图形。Couch曲线是最...

    交互式计算机图形学书后实例程序

    #### 五、计算机图形学中的分形与递归 Sierpinski镂垫作为分形几何的一个典型例子,展示了复杂图形可以由简单的规则和递归过程生成。在计算机图形学中,这种思想被广泛应用于生成自然景观(如山脉、云彩)、模拟...

Global site tag (gtag.js) - Google Analytics