自从认识分形,发现世界上任何美丽的事物都可以用分形来展示出来,小到街边的花花草草、大到地球的各个板块,海岸线还有活泼可爱的小动物造型,人眼的世界里有规律的物体总是那么美妙,基本样板通过递归出来的图案不仅呈现出规律的图片,而且与现实万物总有惊人的相似性,话不多说,有图才有真相:
谢宾斯基三角:给群山穿上美丽的衣裳
毕达哥拉斯树:爱情电影中都有那么一种场景,一望无际的草地中央坐落着一棵参天古树,树下的男女主角背靠着古树,祈祷一辈子的幸福
今天的重点:科赫曲线
基本样板:
1次迭代
2次迭代:
细心的你也许可以从上面看出规律了,下面是主要代码实现:
/**
* 字符串递归得到一个新字符串
* @param s 原字符串
* @param DGs 递归原则字符串
* @return
*/
public String DG(String s,String DGs){
String newString;
if(count==0){
return s;
}
if(s==""){
newString = "F";
// System.out.println("newString: "+newString);
}
else{
char[] ch=s.toCharArray();
char[] DGch=DGs.toCharArray();
// System.out.println("ch的个数:"+ch.length);
// System.out.println("DGch的个数:"+DGch.length);
int countF=0;
int countOthers=0;
//统计字符串的f和+-的个数
for(int i=0;i<ch.length;i++){
if(ch[i]=='F'){
countF++;
}
else{
countOthers++;
}
}
// System.out.println("F的个数:"+countF);
// System.out.println("+-的个数:"+countOthers);
//生成新字符数组
char[] newCh=new char[DGch.length*countF+countOthers];
// System.out.println("新数组长度:"+(DGch.length*countF+countOthers));
int nPos=0;
for(int i=0;i<ch.length;i++){
if(ch[i]=='F'){
//将递归字符串放到新串中
for(int j=0;j<DGch.length;j++){
newCh[nPos]=DGch[j];
nPos++;
}
}
else{
newCh[nPos]=ch[i];
nPos++;
}
}
// System.out.println("nPos的大小:"+nPos);
//将数组转换成字符串返回
newString = new String(newCh);
}
// System.out.println("newString: "+newString);
count--;
newString=DG(newString,DGs);
return newString;
}
原字符串代表初始字符串,可以是空,然后是递归原则字符就是“F”->"F-F++F-F",然后依次用这个原则递归不同代数就可以得到新生代字符串,在自己定义每个字符的意义,比如科赫曲线意义:F代表向前画一根线,“-”代表逆时针旋转60度,“+”代表顺时针旋转120度,所以“F”就是上面1次迭代图,“F-F++F-F”是上面的2次迭代图,而我们可以改变“+”“-”所旋转角度,从而得到自由旋转的曲线,不多说,上图:
是不是很像细胞:
乌龟么?
这是向日葵!
不仅仅这些,改变角度还有很多很多的图案,自己去尝试尝试。。。
我们还可以定义很多简单的样板和规律,比如树杈的递归,三叉递归出一棵枝叶茂密的大树等等等等,发挥你的想象,展现在你眼前的必然是一个美丽的分形世界。