如何用Java实现LSystem分形算法绘制美丽的窗花图案?

2026-04-03 01:591阅读0评论SEO教程
  • 内容介绍
  • 文章标签
  • 相关推荐

本文共计1193个文字,预计阅读时间需要5分钟。

如何用Java实现LSystem分形算法绘制美丽的窗花图案?

L-System 分形通过某种类似形式的规则将部分与整体相似,称为分形。具体来说,L-System 分形以相同的函数、不同变量遵循某些规则不断迭代或递归所绘制的图形。下面是L-System分形及其部分与整体的关系概述:

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

L-System分形

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

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

※※神奇的色子※※

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

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

开始游戏

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

2.如果选中B则取B和P1的中点P2画黑

3.如果选中A则取A和P2的中点P3画黑

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

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

public void mouseReleased(MouseEvent e) {

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

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

x1e.getX();

y1e.getY();

count;

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

x2e.getX();

y2e.getY();

count;

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

x3e.getX();

y3e.getY();

count;

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

xpe.getX();

ype.getY();

for(int i0;i<100000;i){//迭代100000次

Random rnew Random();

int nr.nextInt(3);

switch(n){

case 0://选中A点

xp(x1xp)/2;

yp(y1yp)/2;//取AP中点替代P点

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

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

break;

case 1://选中B点

xp(x2xp)/2;

yp(y2yp)/2;//取BP中点替代P点

如何用Java实现LSystem分形算法绘制美丽的窗花图案?

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

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

break;

case 2://选中C点

xp(x3xp)/2;

yp(y3yp)/2;//取CP中点替代P点

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

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

break;

}

}

count;

}else if(count4){

x1y10;

x2y20;

x3y30;

count0;

}

}

效果图如下

※※美丽的窗花※※

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

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

其中a1b4c60

public void chuanghua(){

xx1;

yy1;

double x2;

double y2;

double a1;

double b4;

double c60;

for(int j0;j<2000000;j){

x2y-Math.signum(x)*Math.sqrt(Math.abs(b*x-c));

y2a-x;

xx2;

yy2;

if(j%30){

g.setColor(Color.red);

}

if(j%31){

g.setColor( Color.green);

}

if(j%32){

g.setColor( Color.blue);

}

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

}

}

}

效果图如下

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

doublea0.4;

doubleb1;

doublec0;

※※逼真的树叶※※

paulbourke.net/fractals/ifs_fern_a/

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

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

public void shuye(){

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

double x5,y5,x520,y520;

for(int i0;i<200000;i){

Random rrnew Random();

int rrr.nextInt(100);

if (r0){

a0;

b0;

c0;

d0.16;

ee0;

f0;

}else if (r>17) {

a0.2;

b-0.26;

c0.23;

d0.22;

ee0;

f1.6;

}else if (r>8 14) {

a-0.15;

b0.28;

c0.26;

d0.24;

ee0;

f0.44;

}else{

a0.85;

b0.04;

c-0.04;

d0.85;

ee0;

f1.6;

}

x5a*x52b*y52ee;

y5c*x52d*y52f;

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);

x52x5;

y52y5;

}

}

效果图如下

标签:

本文共计1193个文字,预计阅读时间需要5分钟。

如何用Java实现LSystem分形算法绘制美丽的窗花图案?

L-System 分形通过某种类似形式的规则将部分与整体相似,称为分形。具体来说,L-System 分形以相同的函数、不同变量遵循某些规则不断迭代或递归所绘制的图形。下面是L-System分形及其部分与整体的关系概述:

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

L-System分形

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

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

※※神奇的色子※※

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

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

开始游戏

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

2.如果选中B则取B和P1的中点P2画黑

3.如果选中A则取A和P2的中点P3画黑

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

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

public void mouseReleased(MouseEvent e) {

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

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

x1e.getX();

y1e.getY();

count;

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

x2e.getX();

y2e.getY();

count;

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

x3e.getX();

y3e.getY();

count;

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

xpe.getX();

ype.getY();

for(int i0;i<100000;i){//迭代100000次

Random rnew Random();

int nr.nextInt(3);

switch(n){

case 0://选中A点

xp(x1xp)/2;

yp(y1yp)/2;//取AP中点替代P点

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

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

break;

case 1://选中B点

xp(x2xp)/2;

yp(y2yp)/2;//取BP中点替代P点

如何用Java实现LSystem分形算法绘制美丽的窗花图案?

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

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

break;

case 2://选中C点

xp(x3xp)/2;

yp(y3yp)/2;//取CP中点替代P点

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

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

break;

}

}

count;

}else if(count4){

x1y10;

x2y20;

x3y30;

count0;

}

}

效果图如下

※※美丽的窗花※※

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

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

其中a1b4c60

public void chuanghua(){

xx1;

yy1;

double x2;

double y2;

double a1;

double b4;

double c60;

for(int j0;j<2000000;j){

x2y-Math.signum(x)*Math.sqrt(Math.abs(b*x-c));

y2a-x;

xx2;

yy2;

if(j%30){

g.setColor(Color.red);

}

if(j%31){

g.setColor( Color.green);

}

if(j%32){

g.setColor( Color.blue);

}

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

}

}

}

效果图如下

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

doublea0.4;

doubleb1;

doublec0;

※※逼真的树叶※※

paulbourke.net/fractals/ifs_fern_a/

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

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

public void shuye(){

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

double x5,y5,x520,y520;

for(int i0;i<200000;i){

Random rrnew Random();

int rrr.nextInt(100);

if (r0){

a0;

b0;

c0;

d0.16;

ee0;

f0;

}else if (r>17) {

a0.2;

b-0.26;

c0.23;

d0.22;

ee0;

f1.6;

}else if (r>8 14) {

a-0.15;

b0.28;

c0.26;

d0.24;

ee0;

f0.44;

}else{

a0.85;

b0.04;

c-0.04;

d0.85;

ee0;

f1.6;

}

x5a*x52b*y52ee;

y5c*x52d*y52f;

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);

x52x5;

y52y5;

}

}

效果图如下

标签: