java迭代图像和递归算法的应用

我们通过画板来实现图像的生成,迭代图像即通过一定的坐标推算公式,从初始坐标点不断获取新的坐标值并打点,修改点迹颜色以形成一个有深浅变化的图像。用代码实现自然界的美,生成一系列二维,三维的图像,它们不是杂乱无章的,而是具有一定规则的富有美感的图像。

        if("迭代图像".equals(name))
        {
            x=e.getX();
            y=e.getY();
            iterate(x,y); 
        }
  public void iterate(double x,double y)
   {
       System.out.println("打印");
       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);              
             int x1= (int)(temx*130+400);          //对x1,y1转型,放大,移动到屏幕坐标系
             int y1= (int)(temy*130+400);  
             //System.out.println("x1: "+x1+" y1: "+y1);           //颜色根据佚代次数加深         
             gr.setColor(new Color(i/200,i/100,i/100));    
             gr.drawLine(x1, y1, x1,y1);       
             x=temx;           
             y=temy;             
        }
   }

以上是迭代图像的实现方法。在写这段代码的过程中我们要注意几个要点。首先,坐标通过公式计算后数值很小,需要放大并移到屏幕中央,打点后再进行迭代,再打点,直到循环结束,其中每一次迭代都使颜色加深。此处a,b,c,d的值是我们自己定义的。一旦修改参数值图像就会改变。下面我们来运行一下代码,看一下效果吧。

    private double a=-1.2;
    private double b=1.6;
    private double c=-1;
    private double d=-1.5;

    private double a=-1.5;
    private double b=1.2;
    private double c=-1;
    private double d=-0.3;

另外我们还可以通过修改颜色的迭代函数来修改颜色效果。

  gr.setColor(new Color(i/200,i/100,i/100));
  gr.setColor(new Color(i/200,0,i/100));

我们在这里基于第一张图修改了RGB的第二个参数为0;

迭代图像结构相同,但颜色有所改变。

接下来我们探讨一下另一迭代函数。

规则:

1.平面上随机选 A,B,C 三个点。再随机选一个点,记为 P。

2.有一个三面色子,每丢一次,则选中 ABC 三个中一点。 开始游戏: 1.重复丢色子,如果选中 A,则取 A 和 P 的中点 P1,画黑。 2.如果选中 B,则取 B 和 P1 的中点 P2,画黑。

3.如果选中 A,则取 A 和 P2 的中点 P3,画黑。

4.一直重复,如每点一下鼠标,丢 100 次色子。

这个游戏看似有点规律,但是当你画出图片时会发生非常奇妙的东西! 

下面是我写的代码:

        if("递归".equals(name))
        {
              int xa=1+(int)(Math.random()*800);
              int ya=1+(int)(Math.random()*800);
              int xb=1+(int)(Math.random()*800);
              int yb=1+(int)(Math.random()*800);
              int xc=1+(int)(Math.random()*800);
              int yc=1+(int)(Math.random()*800);
              int xp=1+(int)(Math.random()*800);              
              int yp=1+(int)(Math.random()*800);        
              int turn=1;
              System.out.println("xa"+xa+"ya"+ya+"xb"+xb+"yb"+yb+"xc"+xc+"yc"+yc+"xp"+xp+"yp"+yp);
              for(int i=0;i<10000;i++)
              {
                  turn=1+(int)(Math.random()*3);
                  switch(turn)
                  {
                  case 1:                     
                      xp=(xa+xp)/2;
                      yp=(ya+yp)/2;
                      gr.drawLine(xp, yp, xp, yp);
                      break;
                  case 2:                      
                      xp=(xb+xp)/2;
                      yp=(yb+yp)/2;
                      gr.drawLine(xp, yp, xp, yp);                      
                      break;
                  case 3:                      
                      xp=(xc+xp)/2;
                      yp=(yc+yp)/2;
                      gr.drawLine(xp, yp, xp, yp);                  
                      break    ;              
                  }                                    
              }

因为用到了随机数,每一次递归都会生成不同图像。

那么自然界是不是随机的?给你一个点,是不是能画出整个世界呢?这个问题真的很值得思考。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值