java编写科赫曲线_分形——科赫曲线
? ? ? ? 這幾天在因為在和別人合作寫一個程序,就在想比如我要寫一個科赫曲線,那么我寫來給別人用的話,怎樣是用著最方便的,即使是別人沒有去詳細看你的代碼,拿到手就像寫一個界面那樣,直接 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
StringBuffer str=new StringBuffer();
for(int j=0;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
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
查看圖片附件
總結
以上是生活随笔為你收集整理的java编写科赫曲线_分形——科赫曲线的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java8之前_Java 8 之前的时间
- 下一篇: 支付宝永久限制收款怎么解决