Day 5 分形 迭代 递归

要画分形,先再把界面创建,再创建实现了鼠标监听器和动作监听器接口的类,再添加至需要监听的界面中,即先将画图板建好,才能画图。

分形迭代

我们来尝试简单的画一下下面这个分形:

在这里插入图片描述
在画图板上,即鼠标监听器上,在其中的一个方法里,可以开始写这段分形的代码了

  • 首先,先声明定义 x, y,先赋值为0,且是double型的变量。
    double x=0f;
    double y=0f;
  • 再预设a,b,c,d等4个常量的值。
    double a=-1.8, b =-2.0, c=-0.5 ,d=-0.9;
  • 再写一个for循环语句。
    for(int i=0;i<25500;i++){ }
  • 在里面先摆上公式,按照编程语言,将公式输入。
    double temx= Math.sin(ay)+cMath.cos(ax);
    double temy= Math.sin(b
    x)+dMath.cos(by);
  • 再对x1,y1转型,放大,移动到屏幕坐标系:
    int x1= (int)(temx130+300);
    int y1= (int)(temy
    130+300);
  • 可加上个输出语句,观察x1,y1的实时变化:
    System.out.println("x1: “+x1+” y1: "+y1);
  • 最后再加颜色,画点,将公式中的temx,temy等回x,y结束该次循环。图形的颜色也会根据迭代次数的增加而不断加深。
    g.setColor(new Color(0,0,i/100));
    g.drawLine(x1, y1, x1,y1);
    x=temx;
    y=temy;
连起来的代码就是这样的了:
private void drawDream(Graphics g){
double x=0f;
double y=0f;
//a,b,c,d等4个常量的值预设
 double a=-1.8, b =-2.0, c=-0.5, d=-0.9;
 for(int i=0;i<25500;i++){
 //公式:
double temx= Math.sin(a*y)+c*Math.cos(a*x);
double temy=Math.sin(b*x)+d*Math.cos(b*y);
 //对x1,y1转型,放大,移动到屏幕坐标系:
 int x1= (int)(temx*130+500);
 int y1= (int)(temy*130+400);
System.out.println("x1: "+x1+" y1: "+y1);
 //颜色根据佚代次数加深
 g.setColor(new Color(0,0,i/100));
 g.drawLine(x1, y1, x1,y1);
 x=temx;
 y=temy;
 }
 }
输出的效果:

在这里插入图片描述

画一个递归三角形

概念

递归,就在该函数里不断调用该函数,就像数学中的f(f(f(x))),使其重复绘制同一个图形,但每次都稍微进行调整,最后使其绘出较为美丽的图形。

在监听器里写一个类,来形成递归,使其调用时,即可画出递归三角形。

  • 先写一个类,在类的括号里定义几个参数,顶点的坐标,三角形的长度,及递归的次数。
    public void drawtriangle(int x,int y,int l,int n){ }
  • 大致计算出要画的等边三角形各顶点的坐标,这里将高与边长的比值定为7/8,使其大致看上去为一个等边三角形,再在草稿纸上写出各顶点坐标,就可以画出一个三角形了。
    int i = l*7/8;
    g.drawLine(x, y, x+l/2, y+i );
    g.drawLine(x, y, x-l/2, y+i );
    g.drawLine(x+l/2, y+i, x-l/2, y+i );
  • 写个if语句,条件为n>0,在该三角形里再画三个边长减半的三角形,顶点为原来三角形的顶点,及两腰的中点,并让n减小。
    if(n>0){
    n - -;
    drawtriangle(x,y,l/2,n);
    drawtriangle(x-l/4,y+i/2,l/2,n);
    drawtriangle(x+l/4,y+i/2,l/2,n);
    }
  • 在每次调用这个函数时,该函数都会再次调用自己,定义n,及if语句就是为了能使其停下。最后就能够输出结果了。
  • 好好体会,画完一个大的,再在里面调用原函数画完一次小的,即可。
连起来的代码为 :
public void drawtriangle(int x,int y,int l,int n){
		int i = l*7/8;
					
		      g.drawLine(x, y, x+l/2, y+i );
		      g.drawLine(x, y, x-l/2, y+i );
		      g.drawLine(x+l/2, y+i, x-l/2, y+i );
		      
		if(n>0){
		      n--;
		      drawtriangle(x,y,l/2,n);
		      drawtriangle(x-l/4,y+i/2,l/2,n);
		      drawtriangle(x+l/4,y+i/2,l/2,n);		      
		}		
	}
画出来为:

在这里插入图片描述

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值