分形方面

本文介绍了使用数学公式和递归方法绘制复杂图形的技术。通过具体实例展示了如何利用数学原理生成树木、树叶等自然形态,并提供了部分源代码供读者参考。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在学习了简单画板后,我们用了大量的时间在学习分形,分形是建立在对图形进行数学分析的基础上,用数学思想画出来的,我们接触的较多的就是用数学公式和递归的思想画出来的一些图形。最开始看到胡哥给我们展示的图形时,觉得很惊艳,慢慢接触就明白很多都是套用数学公式画点画出来的。在学习的过程中,我也画了不少图形。

用数学公式画出来的图形:

(一):
[img]http://dl2.iteye.com/upload/attachment/0087/2342/05615e2e-362a-3b52-9f37-8207d8a0a23b.jpg[/img]
(二):

[img]http://dl2.iteye.com/upload/attachment/0087/2344/ae68652e-8cba-3f35-821e-444bf3e9ad46.png[/img]
(三):树:
[img]http://dl2.iteye.com/upload/attachment/0087/2346/023b90fa-d39f-3e29-b769-fbf34cbfde4c.png[/img]
(四):树叶:
[img]http://dl2.iteye.com/upload/attachment/0087/2348/19fb2198-8232-3969-af0d-d3d823a80615.png[/img]

用递归的思想画的分形:
(一):谢尔宾斯基三角形:
[img]http://dl2.iteye.com/upload/attachment/0087/2352/dc6a33e9-2baf-3bf8-ab7a-bae25595a3f9.png[/img]
(二):俗称地毯
[img]http://dl2.iteye.com/upload/attachment/0087/2354/de545954-cc1d-3e31-957d-bb1c4e31b838.png[/img]

下面我把自己贴的图片中树和树叶的代码复制出来。有兴趣的同学可以看一下:

树——
主函数:package cn.netjava.cf0515;

import java.awt.Graphics;

import javax.swing.JFrame;

public class ColorPanel {
public static void main(String[] args) {
ColorPanel cp=new ColorPanel();
cp.unitUI();
}

public void unitUI(){
//构造画板
JFrame jf=new JFrame();
jf.setTitle("画 板");
jf.setSize(988,713);
jf.setLocationRelativeTo(null);
jf.setDefaultCloseOperation(3);
jf.setVisible(true);
Graphics g =jf.getGraphics();
Drawing dr=new Drawing(g);
dr.IfsTree();

}

}
画的方法函数:

package cn.netjava.cf0515;

import java.awt.Color;
import java.awt.Graphics;
import java.util.Random;

public class Drawing {

private Graphics g;

public Drawing(Graphics g){
this.g=g;
}

public void IfsTree(){
//用数组保存七组参数,随机选取a,b,c,d,e,f,g1的第t组数据
double a[]={0.05f,-0.05f,0.03f,-0.03f,0.56,0.19,-0.33};
double b[]={0.00f,0.00f,-0.14f,0.14f,0.44f,0.07f,-0.34f};
double c[]={0.00f,0.00f,0.00f,0.00f,-0.37f,-0.1f,-0.33f};
double d[]={0.4f,-0.4f,0.26f,-0.26f,0.51f,0.15f,0.34f};
double e[]={-0.06f,-0.06f,-0.16f,-0.16f,0.3f,-0.2f,-0.54f};
double f[]={-0.47f,-0.47f,-0.01f,-0.01f,0.15f,0.18f,0.39f};
double g1[]={-0.33f,-0.34f,-0.33f,0.34f,-0.54f,0.39f};

Random ran=new Random();
//x,y为树的坐标
int x=800,y=800;
double xx=x,yy=y;
for(int i=0;i<600000;i++){

int t=ran.nextInt(7);
g.drawLine(x,y,x,y);
Color color=new Color(0,129,59);
g.setColor(color);
double m,n;
m=a[t]*(xx)+b[t]*(yy)+e[t];
n=c[t]*(xx)+d[t]*(yy)+f[t];

System.out.println("m="+m+" "+"n="+n);
xx = m;
yy = n;

x=(int)(m*300)+200;
y=(int)(n*300)+200;
x = Math.abs(x-600);
y = Math.abs(y-600);

System.out.println("x="+x+" "+"y="+y);

}

}
}


树叶——
主函数:package cn.netjava.cf0521;

import java.awt.Graphics;

import javax.swing.JFrame;

public class ColorPanel {
public static void main(String args[]){
ColorPanel cp=new ColorPanel();
cp.unit();
}
public void unit(){
JFrame jf=new JFrame();
jf.setTitle("画 板");
jf.setSize(1000,700);
jf.setLocationRelativeTo(null);
jf.setDefaultCloseOperation(3);
jf.setVisible(true);
Graphics g=jf.getGraphics();
Drawing dr=new Drawing(g);
dr.Leaf();

}
}

方法函数:
package cn.netjava.cf0521;

import java.awt.Color;
import java.awt.Graphics;
import java.util.Random;

public class Drawing {
Graphics g;
public Drawing(Graphics g){
this.g=g;
}
public void Leaf(){
int x=200,y=200;
double a[]={0.0000f,0.7248f,0.1583f,0.3386f};
double b[]={0.2439f,0.0337f,-0.1297f,0.3694f};
double c[]={0.0000f,-0.0253f,0.3550f,0.2227f};
double d[]={0.3053f,0.7426f,0.3676f,-0.0756f};
double e[]={0.0000f,0.2060f,0.1383f,0.0679f};
double f[]={0.0000f,0.2538f,0.1750f,0.0826f};

Random ran=new Random();
double m,n;
double xx=x,yy=y;
for(int i=0;i<100000;i++){
g.drawLine(x,y,x,y);
g.setColor(Color.GREEN);
int t=ran.nextInt(4);
m=a[t]*(xx)+b[t]*(yy)+e[t];
n=c[t]*(xx)+d[t]*(yy)+f[t];
xx=m;
yy=n;

x=(int)(m*300)+200;
y=(int)(n*300)+200;
x=Math.abs(x-700);
y=Math.abs(y-700);

System.out.println("x="+x+" "+"y="+y);
}
}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值