分形——科赫曲线_JAVA_编程开发_程序员俱乐部

中国优秀的程序员网站程序员频道CXYCLUB技术地图
热搜:
更多>>
 
您所在的位置: 程序员俱乐部 > 编程开发 > JAVA > 分形——科赫曲线

分形——科赫曲线

 2013/11/28 21:28:15  wubin1004  程序员俱乐部  我要评论(0)
  • 摘要:这几天在因为在和别人合作写一个程序,就在想比如我要写一个科赫曲线,那么我写来给别人用的话,怎样是用着最方便的,即使是别人没有去详细看你的代码,拿到手就像写一个界面那样,直接new一个对象,然后调用函数就ok啦!然后我就想到啦封装,就是我直接写一个科赫曲线的类,有不同的构造器方法,也就是提供给别人不同的选择,比如想自定义偏转角,步长,起始点,递归次数等等。然后,这个我是用L-system规则写的科赫曲线,而L-system就是自定义规则,然后生成最终用来画线的字符串
  • 标签:

? ? ? ? 这几天在因为在和别人合作写一个程序,就在想比如我要写一个科赫曲线,那么我写来给别人用的话,怎样是用着最方便的,即使是别人没有去详细看你的代码,拿到手就像写一个界面那样,直接 new 一个对象,然后调用函数就 ok 啦!然后我就想到啦封装,就是我直接写一个科赫曲线的类,有不同的构造器方法,也就是提供给别人不同的选择,比如想自定义偏转角,步长,起始点,递归次数 等等。

? ? ? ? 然后,这个我是用L-system 规则写的科赫曲线,而L-system就是自定义规则,然后生成最终用来画线的字符串,比如字符 'F'代表在画布上画一条长度为一定的直线,"-"和"+"则代表偏转的角度,比如:

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?F的规则: ? ?F -> F-F++F-F

?

? ? ? ? ? ? ? ? ? ? ? ? ? ? ?递归: ?F-F++F-F-F-F++F-F++F-F++F-F-F-F++F-F

实现的效果:

?

?

代码:

class="java" name="code">public class KeheLine {
	private String goal;
	private int angle=0;
	private int leftangle=60;
	private int rightangle=60;
	private int length=300;
	private int depth=1;
	private double x1=200,y1=500;
	private double pi=Math.PI;
	/**
	 * 无参数构造
	 */
	public KeheLine(){
		String son="F-F++F-F";
		this.goal=getString(son, 1);
	}
	/**
	 * 自定义规则构造器
	 * @param son
	 */
	public KeheLine(String son){
		this.goal=getString(son, 1);
	}
	/**
	 * 自定义规则和递归层次的构造器
	 * @param son 定义的规制字符串
	 * @param depth 深度
	 */
	public KeheLine(String son,int depth){
		this.goal=getString(son, depth);
		this.depth=depth;
	}
	/**
	 * 自定义规则和递归层次和旋转角的科赫曲线的构造器
	 * @param son 定义的规制字符串
	 * @param depth 深度
	 * @param angle 旋转角
	 */
	public KeheLine(String son,int depth,int angle){
		this.goal=getString(son, depth);
		this.angle=angle;
		this.depth=depth;
	}
	/**
	 * 自定义规则和递归层次和旋转角和左右偏转角相等的科赫曲线的构造器
	 * @param son 定义的规制字符串
	 * @param depth 深度
	 * @param angle 旋转角
	 * @param leftangle 偏转角
	 */
	public KeheLine(String son,int depth,int angle ,int leftangle){
		this.goal=getString(son, depth);
		this.angle=angle;
		this.leftangle=leftangle;
		this.rightangle=leftangle;
		this.depth=depth;
	}
	/**
	 * 自定义规则和递归层次和旋转角和左右偏转角不相等的科赫曲线的构造器
	 * @param son  定义的规制字符串
	 * @param depth 深度
	 * @param angle 旋转角
	 * @param leftangle 左偏转角
	 * @param rightangle 右偏转角
	 */
	public KeheLine(String son,int depth,int angle ,int leftangle,int rightangle){
		this.goal=getString(son, depth);
		this.angle=angle;
		this.leftangle=leftangle;
		this.rightangle=rightangle;
		this.depth=depth;
	}
	/**
	 *  自定义规则和递归层次和旋转角和左右偏转角不相等的科赫曲线的构造器
	 * @param son  定义的规制字符串
	 * @param depth 深度
	 * @param angle 旋转角
	 * @param leftangle 左偏转角
	 * @param rightangle 右偏转角
	 */
	public KeheLine(String son,int depth,int angle ,int leftangle,int rightangle,int length ){
		this.goal=getString(son, depth);
		this.angle=angle;
		this.leftangle=leftangle;
		this.rightangle=rightangle;
		this.length=length;
		this.depth=depth;
	}
	/**
	 * 得到科赫曲线的字符串
	 * @param son 定义的规制字符串
	 */
	public String getString(String son,int depth){
		
		String relust="F";
		for(int i=0;i<depth;i++){
			StringBuffer str=new StringBuffer();
			for(int j=0;j<relust.length();j++){
				if(relust.charAt(j)=='F'){
					str.append(son);				
					}else{
						str.append(relust.charAt(j));
					}
			}
			relust=str.toString();
			
		}
		
	return relust;
	}
	/**
	 * 画科赫曲线
	 * @param g 画布对象
	 */
	public void drawKehe(Graphics g){
		System.out.println("depth=:"+depth);
		double rangle=angle;
		double rlength=length/(4*depth);
		for(int i=0;i<goal.length();i++){
			if(goal.charAt(i)=='F'){
				double x2=x1+rlength*Math.cos(rangle*pi/180);
				double y2=y1-rlength*Math.sin(rangle*pi/180);
				g.setColor(Color.green);
				g.drawLine((int)x1,(int) y1, (int)x2, (int)y2);
				x1=x2;
				y1=y2;
			}else if(goal.charAt(i)=='-'){
				rangle+=leftangle;
			}else if(goal.charAt(i)=='+'){
				rangle-=rightangle;
			}else if(goal.charAt(i)=='*'){
				rangle+=angle;
			}
		}
	}	
}

?

  • 大小: 3.2 KB
  • 查看图片附件
  • 相关文章
发表评论
用户名: 匿名