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 ; } }
因为用到了随机数,每一次递归都会生成不同图像。
那么自然界是不是随机的?给你一个点,是不是能画出整个世界呢?这个问题真的很值得思考。