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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: L-system是一种用来描述和生成自然图形和形态的形式语言和系统。如果想基于Python绘制L-system分形图,可以通过turtle库实现。具体方法可以先定义L-system产生的字符串,再定义对应的绘制规则,最后根据规则使用turtle库绘制图形。可以参考一些已有的L-system代码进行学习和实践。 ### 回答2: L-System是一种生成分形图形的方法,是由一个初始字符串经过一些规则递归生成的字符串,被称为分形生长器。在绘制L-system分形图中,Python可以非常方便地实现这些规则,并使用matplotlib或turtle绘制结果。以下是基于Python绘制L-system分形图的详细步骤和示例代码。 1. 安装matplotlib或turtle 在Python中绘制图形,可以使用matplotlib或turtle库。这里介绍两个库,读者可以选择其中一个,或者使用其他Python绘图库。将库安装到您的计算机上,如用pip工具输入: ```python pip install matplotlib或者 pip install turtle ``` 2. 定义L-system分形生长器 定义L-system分形生长器,需要一个初始字符串、一些递归的规则和迭代次数。首先,我们可以使用字符串来描述L-system。例如,龙形曲线的初始字符串可以是FX,规则可以是: ```python X → X+YF+ Y → −FX−Y ``` 规则“X→X+YF+”表示,如果字符串中有X,则用“X+YF+”替换X;规则“Y → −FX−Y”表示,如果字符串中有Y,则用“−FX−Y”替换Y。接下来,我们可以通过一个L-system函数来扩展这个字符串,乘以规则n次迭代,如下所示: ```python def lsystem(axiom, rules, n): """ axiom: 初始生成器,应该是一个字符串 rules: 给出规则应该是一个包含多个多个元组的列表,每个元组给出两个元素。 n: 分形深度 """ system = axiom for i in range(n): new_system = "" for char in system: if char in rules: new_system += rules[char] else: new_system += char system = new_system return system ``` 这个函数将返回经过n次规则的操作后的L-System字符串。 3. 用turtle或matplotlib实现L-system分形图 接下来,我们可以使用生成好的字符串进行绘图。在这里,我们使用turtle库来绘制图形。首先,定义一个函数,它将使用给定产生器进行绘图。这个函数将逐个遍历每个字符,并根据字符绘制线条。在这里,F表示向前移动,+和-表示向右或左旋转角度。 ```python def draw_lsystem(system, angle, distance, init_pos=(0, 0)): """ 使用一定角度和距离运行L-System的结果 """ turtle.penup() turtle.goto(init_pos) turtle.pendown() turtle.setheading(0) for char in system: if char == "F" or char == "G": turtle.forward(distance) elif char == "+": turtle.right(angle) elif char == "-": turtle.left(angle) ``` 这里的角度和距离是定义绘制步长的变量,init_pos(x,y)定义canvas上绘制图像的起始位置,F或G表示向前移动,+和-表示向右或左旋转角度。 如果使用matplotlib作为绘图库,可以使用类似的函数。只需要在for循环中定义如何处理F, +和-即可。 最后,将所有代码链接起来以生成最终结果。下面是一个完整的python脚本,使用turtle来绘制Sierpinski三角形作为L-system的示例图像。 ```python import turtle def lsystem(axiom, rules, n): """ axiom: 初始生成器,应该是一个字符串 rules: 给出规则应该是一个包含多个多个元组的列表,每个元组给出两个元素。 n: 分形深度 """ system = axiom for i in range(n): new_system = "" for char in system: if char in rules: new_system += rules[char] else: new_system += char system = new_system return system def draw_lsystem(system, angle, distance, init_pos=(0, 0)): """ 使用一定角度和距离运行L-System的结果 """ turtle.penup() turtle.goto(init_pos) turtle.pendown() turtle.setheading(0) for char in system: if char == "F" or char == "G": turtle.forward(distance) elif char == "+": turtle.right(angle) elif char == "-": turtle.left(angle) if __name__ == '__main__': # 定义L-system的规则和初始字符串 rules = { "A": "+B-A-B+", "B": "-A+B+A-", } axiom = "A" iterations = 4 # 计算L-System的结果 result = lsystem(axiom, rules, iterations) # 将结果绘制到turtle画布上 turtle.speed(0) draw_lsystem(result, 60, 10) turtle.done() ``` 注:在运行turtle代码时,需要等待一段时间,直到结果绘制完成。 ### 回答3: L-system分形图是一种基于迭代的图形绘制方法,广泛应用于各个领域,包括生物学、动画设计和科学计算等等。Python是一种强大的编程语言,可以使用其内置数学库、绘图库和字符串处理库来实现L-system分形图的绘制。下面是一个描述如何在Python中绘制L-system分形图的步骤: 1. 确定L-system的规则:一个L-system包含一个初始状态和一组规则。规则将一个符号或字符序列转换为另一个符号或字符序列。例如,一个L-system规则集合可以是F->F+F--F+F,其中F表示向前绘制一条线段,+表示向左转,-表示向右转。 2. 确定迭代次数:根据规则集,将初始状态迭代多次,得到最终的绘图路径。迭代次数越多,绘图路径越复杂。 3. 将绘图路径转换为坐标点:使用数学公式将绘图路径转换为坐标点列表。通过计算每次向前移动的距离、转动角度和绘图方向等参数,可以确定每条线段的起点和终点坐标。 4. 使用绘图库绘制图像:Python中提供了多种绘图库,如Matplotlib、Turtle和Pygame等。根据需要选择合适的绘图库,并使用坐标点列表绘制图像。 在具体实现中,可以将上述步骤封装为一个函数,根据输入的规则集、迭代次数和绘图参数,自动绘制出L-system分形图。例如,下面是一个基于Pygame的实现示例: ```python import pygame def lsystem(rules, iterations, angle, line_len): state = 'F' for i in range(iterations): state = ''.join(rules.get(c, c) for c in state) x, y = 0, 0 dx, dy = 0, -1 points = [(x, y)] for c in state: if c == 'F': x2 = x + dx * line_len y2 = y + dy * line_len points.append((x2, y2)) x, y = x2, y2 elif c == '+': dx, dy = dy, -dx elif c == '-': dx, dy = -dy, dx screen = pygame.display.set_mode((800, 600)) screen.fill((255, 255, 255)) pygame.draw.lines(screen, (0, 0, 0), False, points, 1) pygame.display.flip() rules = {'F': 'F+F--F+F', '+': '+', '-': '-'} lsystem(rules, 5, 60, 10) ``` 此代码将绘制一个五次迭代的L-system分形图,每个线段长度为10个单位,转角为60度。可以根据需要调整规则、迭代次数和绘图参数,生成不同风格的分形图。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值