? ? ? ? 学了一段时间的java,接触了很多所谓基础的东西,但总归是没有新奇感的,做出来的大多是一些思维上的产物,而分形出现后,才发现短短几行代码竟可变幻出如此美妙的事物。
? ? ? ? 如果没有学习分形,又有谁会想到这张图是用代码敲出来的呢?
?
? ? ? ? ? ? ? ? ? ? ? ? ? ??
? ? ? ? ?那么我们就来看看如何实现这个图形吧。先抛开颜色不管,仔细观察后,我们会发现,它其实就是一个大三角形里面不停的嵌套小三角形,这样想的话思路就会很简单,只要一个小递归就可以实现了。
? ? ? ? ?这里取三角形的高(h)和底边长的一半(r)作为参数表示点的坐标。
? ? ? ? ?首先在重绘方法中绘制出初始三角形:?
class="java" name="code">//重写窗体重绘方法 public void paint(Graphics g){ super.paint(g); int x1=600,y1=50,r=270,h=580; g.drawLine(x1, y1, x1-r, y1+h); g.drawLine(x1, y1, x1+r, y1+h); g.drawLine(x1-r, y1+h, x1+r, y1+h); }
? ? ? ? ?现在我们来写递归函数,每次都传入外边的大三角形,这样它就会在大三角形中绘制出小三角形,随着递归次数增加,大三角形变小,如此循环,直到r、h=0时,停止递归:
public void SJ(int x1,int y1,int r,int h,Graphics g){ //给图形上色,颜色与坐标相关即可做到颜色的变化 Color c= new Color(x1%255,(x1+y1)%255,(y1*7)%255); g.setColor(c); g.drawLine(x1+r/2, y1+h/2, x1-r/2, y1+h/2); g.drawLine(x1-r/2, y1+h/2, x1, y1+h); g.drawLine(x1+r/2, y1+h/2, x1, y1+h); for(h=h/2,r=r/2;h>0&&r>0;h/=2,r/=2){ SJ(x1,y1,r,h,g); SJ(x1-r,y1+h,r,h,g); SJ(x1+r,y1+h,r,h,g); } }
? ? ? ? ?最后只要在重绘方法中调用递归方法即可。
SJ(600,50,270,580,g);
? ? ? ? ?这样就完成了这个分形的基本图形,它有一个很洋气的学名——谢宾斯基三角形。