这几天在因为在和别人合作写一个程序,就在想比如我要写一个科赫曲线,那么我写来给别人用的话,怎样是用着最方便的,即使是别人没有去详细看你的代码,拿到手就像写一个界面那样,直接 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
实现的效果:
代码:
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;
}
}
}
}