`
云十四月
  • 浏览: 12448 次
  • 性别: Icon_minigender_2
社区版块
存档分类

L-System分形的java总结

阅读更多

L-System分形

 

    部分与整体以某种形式相似的形,称为分形。即部分以相同的函数、不同某些变量,以某中确定的规则不断迭代或递归所画出整体的图形。

下面是分形的几个经典例子。

 

※※神奇的色子※※

1.平面上随机选A,B,C三个点。再随机选一个点,记为P

2.有一个三面色子,每丢一次,则选中ABC三个中一点。

开始游戏:

1.重复丢色子,如果选中A,则取AP的中点P1,画黑,

2.如果选中B,则取BP1的中点P2,画黑

3.如果选中A,则取AP2的中点P3,画黑

4.一直重复(如每点一下鼠标,丢10000次色子。

思路:为画图面板添加鼠标监听器方法,在鼠标释放的时候获取坐标值。收集上诉四个点的坐标值,其中前三个点分别为ABC,第四点位P。以一个02的随机数来确定ABC选中的点。每次计算选中点和P的中中点,以该中点替代P点。迭代。

public void mouseReleased(MouseEvent e) {

if(djf.buttonText().equals("色子")){

if(count==0){//第一次释放鼠标时获得A点坐标

x1=e.getX();

y1=e.getY();

count++;

}else if(count==1){//第二次释放鼠标时获得B点坐标

x2=e.getX();

y2=e.getY();

count++;

}else if(count==2){//第三次释放鼠标时获得C点坐标

x3=e.getX();

y3=e.getY();

count++;

}else if(count==3){//第四次释放鼠标时获得P点坐标

xp=e.getX();

yp=e.getY();

for(int i=0;i<100000;i++){//迭代100000次

Random r=new Random();

int n=r.nextInt(3);

switch(n){

case 0://选中A点

xp=(x1+xp)/2;

yp=(y1+yp)/2;//取AP中点,替代P点

g.setColor(new Color(yp/3,yp/4,yp/64));

g.drawLine(xp, yp, xp, yp);//画出该点


break;

case 1://选中B点

xp=(x2+xp)/2;

yp=(y2+yp)/2;//取BP中点,替代P点

g.setColor(new Color(yp/3,yp/4,yp/64));

g.drawLine(xp, yp, xp, yp);//画出该点


break;

case 2://选中C点

xp=(x3+xp)/2;

yp=(y3+yp)/2;//取CP中点,替代P点

g.setColor(new Color(yp/3,yp/4,yp/64));

g.drawLine(xp, yp, xp, yp);//画出该点


break;

}

}

count++;


}else if(count==4){

x1=y1=0;

x2=y2=0;

x3=y3=0;

count=0;

}


} 

 

 

 

效果图如下:

 

 

 

※※美丽的窗花※※

 

迭代函数如下:(注意:sign为符号函数

X(n+1)=Y(n)-sign(X(n))|bX(n)-c|^(1/2)

其中:a=1,b=4,c=60

public void chuanghua(){

x=x1;

y=y1;

double x2;

double y2;

double a=1;

double b=4;

double c=60;

for(int j=0;j<2000000;j++){

x2=y-Math.signum(x)*Math.sqrt(Math.abs(b*x-c));

y2=a-x;

x=x2;

y=y2;


if(j%3==0){

g.setColor(Color.red);

}

if(j%3==1){

g.setColor( Color.green);

}

if(j%3==2){

g.setColor( Color.blue);

}

g.drawLine((int)(x)+300,(int) (y)+250,(int)(x)+300,(int) (y)+250);

}

}

}

 

 

 

 

 

效果图如下:

 

 

 

若把系数稍作修改,则得到如下截然不同的图形:

double a=0.4;

double b=1;

double c=0;

 

 

 

※※逼真的树叶※※

熊哥推荐的站点:http://paulbourke.net/fractals/

http://paulbourke.net/fractals/ifs_fern_a/

好多图形都有迭代公式。比如:

 

以下是系数的选取。共有四组,每组取到的概率不相等,分别为0.01,0.07,0.07,0.85以一个099的随机数指示取到的组别。

 

 

 

public void shuye(){


double a,b,c,d,ee,f;


double x5,y5,x52=0,y52=0;

for(int i=0;i<200000;i++){

Random rr=new Random();

int r=rr.nextInt(100);

if (r==0){

a=0;

b=0;

c=0;

d=0.16;

ee=0;

f=0;

}else if (r>=1&&r<=7) {

a=0.2;

b=-0.26;

c=0.23;

d=0.22;

ee=0;

f=1.6;

}else if (r>=8 && r<=14) {

a=-0.15;

b=0.28;

c=0.26;

d=0.24;

ee=0;

f=0.44;

}else{

a=0.85;

b=0.04;

c=-0.04;

d=0.85;

ee=0;

f=1.6;

}

x5=a*x52+b*y52+ee;

y5=c*x52+d*y52+f;

int tempx=-(int)(x5*50)+300;

int tempy=-(int)(y5*50)+550;

g.setColor(new Color(20,i/(200000/255),20));

g.drawLine(tempx,tempy,tempx,tempy);


x52=x5;

y52=y5;


}


}

 效果图如下:

 

<!--EndFragment-->
0
1
分享到:
评论
2 楼 云十四月 2013-08-09  
fisher123 写道
扭摆~~~~~~~~~~

沙发君好~
1 楼 fisher123 2013-08-09  
扭摆~~~~~~~~~~

相关推荐

    JAVA实现L-System树形绘制

    - `Lsystem` 类:负责根据输入的规则执行相应的绘图操作。 #### 三、代码细节分析 1. **主函数部分**: - 首先定义了一些变量,如角度、迭代次数、画笔宽度和线段长度。 - 接着读取用户输入的规则、迭代次数等...

    java 实现L-system系统

    void draw(LSystem lSystem, int iterations) { String currentString = lSystem.getAxiom(); for (int i = 0; i ; i++) { currentString = lSystem.applyRules(currentString); } for (char c : current...

    L系统分形艺术程序代码

    2. `Lsystem.java`: 这个文件很可能是L系统的核心实现,包含了处理L系统规则、迭代和绘制图形的基本逻辑。它可能会有一个类,用于存储L系统的 axiom、规则集,以及进行迭代的方法。 3. `Lcontrol.java`: 这个文件...

    基于JAVA的分形算法(论文)

    L-系统( Lindenmayer System)是一种形式语法系统,用于生成植物、树枝等自然形态的分形图案。它基于一套公理(初始值)和生成规则(生成元),通过迭代过程重写字符串,最终转化为图形。L-系统算法通常包含角度、...

    VRML环境中三维分形植物

    在模拟植物形态结构时,主要的方法包括迭代函数系统(Iterated Function System, IFS)、L-系统(L-System)以及受限扩散凝聚模型(Diffussion-Limited Aggregation, DLA)。这些方法各有特点,但在实际应用中也存在...

    分形算法与程序设计――Java实现

    例如,L-系统(Lindenmayer System)常用于模拟植物生长过程,Java中可以通过定义规则并按照这些规则进行替换和旋转操作,生成复杂的植物形态。 3. **迭代函数系统算法**: 这种算法通过一组迭代函数来构造分形,...

    Java 中分形图的几种方法详解

    4. L-System Sticks分形:L-System( Lindenmayer系统)是一种形式化的语法系统,用于描述植物生长和其他自然现象。在这个系统中,定义一个母串和一些演变规则,通过反复应用规则来生成新的字符串,这些字符串可以...

    分形图形的研究与实现_曾锋_分形研究_

    可能还涵盖了如何使用特定的编程语言(如Python或Java)来实现L系统和IFS,以及如何通过交互式图形库(如matplotlib或 Processing)展示和探索生成的分形图像。 此外,他还可能讨论了分形在实际应用中的价值,比如...

    实现string算法的魔 鬼 曲 线

    在魔鬼曲线的例子中,通常使用的初始字符串是"F",而规则可能是"F"变成"FF-LF","L"变成"FL-RF","R"变成"RF-LL",其中"L"代表向左转90度,"R"代表向右转90度,"F"则代表向前移动一定的距离。 在实现这个算法时,...

Global site tag (gtag.js) - Google Analytics