简单分形之谢宾斯基三角形_JAVA_编程开发_程序员俱乐部

中国优秀的程序员网站程序员频道CXYCLUB技术地图
热搜:
更多>>
 
您所在的位置: 程序员俱乐部 > 编程开发 > JAVA > 简单分形之谢宾斯基三角形

简单分形之谢宾斯基三角形

 2013/11/28 3:27:09  ShXin  程序员俱乐部  我要评论(0)
  • 摘要:学了一段时间的java,接触了很多所谓基础的东西,但总归是没有新奇感的,做出来的大多是一些思维上的产物,而分形出现后,才发现短短几行代码竟可变幻出如此美妙的事物。如果没有学习分形,又有谁会想到这张图是用代码敲出来的呢?那么我们就来看看如何实现这个图形吧。先抛开颜色不管,仔细观察后,我们会发现,它其实就是一个大三角形里面不停的嵌套小三角形,这样想的话思路就会很简单,只要一个小递归就可以实现了。这里取三角形的高(h)和底边长的一半(r)作为参数表示点的坐标。首先在重绘方法中绘制出初始三角形
  • 标签:

? ? ? ? 学了一段时间的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);

? ? ? ? ?这样就完成了这个分形的基本图形,它有一个很洋气的学名——谢宾斯基三角形。

  • 相关文章
发表评论
用户名: 匿名