一
引入:现在分形学说发展越来越成熟,各种各样的描述分形也变得越来越多。美国杰出屋里学家,物理教育学家惠勒断言:“可以相信以后要是谁不熟悉分形,那么他将不可能被当做是地球上的文明人”。从这里我们可以看出分形的重要性,那么到底什么是分形呢?
二
分形的定义:
分形是其组成部分以某种方式与整体具有相似的形。如果一个图形及其组成部分以某种方式与整体相似,我们就将该图形叫做分形。
三
分形的形成: 分形是图形通过简单的递归方式按照无数迭代的方式形成的。例如细胞的分裂。因其满足细胞的组成通过分裂的方式与整体相识。生活中也有很多图形都是分形,树叶的组成结构...
四
分形的程序编写
通过上面我们知道分形是通过简单的递归方式按照无数迭代的方式形成的,那么我们就可以在计算机中通过编程,按照相同的规律来实现。下面我将举出几个例子来更深入的了解分形
五:
具体的分形例子实现代码:
1.
分形数的代码 :
1.1 首先要建立一个窗体类
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.FlowLayout;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
/**
* 实现分型数的类
* 继承窗体类
*
*/
public class MyTree extends JFrame {
public static void main(String []args){
MyTree mt=new MyTree(); //实例化一个对象,用来调用显示窗体的方法
mt.initUI();
}
/**
* 定义显示窗体的方法
*/
public void initUI(){
//设置窗体的相应属性
this.setTitle("我的项目图形");
this.setSize(700,700);
this.setDefaultCloseOperation(3);
this.setBackground(Color.GRAY);
this.setResizable(false);
this.setLayout(new BorderLayout());
//实例化两个画板类
JPanel jp1=new JPanel();
JPanel jp2=new JPanel();
this.add(jp1,BorderLayout.NORTH);
this.add(jp2,BorderLayout.CENTER);
//给第一个画板设置新的背景用来区分和其他的
jp1.setBackground(Color.LIGHT_GRAY);
jp1.setLayout(new FlowLayout());
JButton jb1 =new JButton("山林");
JButton jb2 =new JButton("野风");
JButton jb3 =new JButton("随叶");
jp1.add(jb1);jp1.add(jb2); jp1.add(jb3);
//实例化动作监听器对象,给按钮安装监听器
BtnActionListener ban=new BtnActionListener(jp2);
jb1.addActionListener(ban);
jb2.addActionListener(ban);
jb3.addActionListener(ban);
this.setVisible(true);
}
}
1.2 建立监听器类,在监听器类中具体实现画分形数的方法
import java.awt.Color;
import java.awt.Graphics;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.Random;
import javax.swing.JPanel;
/**
* 实现动作监听器类
*
*/
public class BtnActionListener implements ActionListener{
private Graphics g; //定义一个画布对象的属性
private JPanel jp; //声明画板的属性
Random ran =new Random(); //实例化一个随机化对象
int num; //取得1~6个数字
/**
* 用构造器的方法用来接收画板对象
* @param jp 接收的画板对象
*/
public BtnActionListener(JPanel jp){
this.jp=jp;
}
/**
* 实现监听器类的抽象方法
*/
public void actionPerformed(ActionEvent e) {
if("山林".equals(e.getActionCommand())){
draw1(); //调用次方法
}
if("野风".equals(e.getActionCommand())){
draw2();
}
if("随叶".equals(e.getActionCommand())){
// draw3();
draw4();
}
}
/**
* 画分型树的方法
*/
public void draw1(){
g=jp.getGraphics(); //取得面板的画布对象
Color color=new Color(0,129,59);
int x=0,y=0;
float x1=0f,y1=0f,x2,y2; //要把x2和y2都放在外面
float a=0,b=0,c=0,d=0,e=0,f=0;
for(int i=0;i<100000;i++){ //循环1000次
int num=ran.nextInt(10)+1; //随机取得一个1~10的数字
if(num<=8){
//定义要画图形的相关属性
a=0.824074f;b=0.281428f;c=-0.212346f;d=0.864198f;e=-1.882290f;f=-0.110607f ;
}
if(num>=9){
a=0.088272f;b=0.520988f;c=-0.463889f;d=-0.377778f;e=0.785360f;f=8.095795f ;
}
x2=a*x1+b*y1+e;
y2=c*x1+d*y1+f;
//将x2与y2,强制装换成整形;
x=(int)(30*x2+250);
y=(int)(30*y2+200);
x1=x2;
y1=y2;
g.drawLine(x, y, x, y);
g.setColor(color);
}
}
/**
* 画野风方法
*/
public void draw2(){
g=jp.getGraphics(); //取得面板的画布对象
Color color=new Color(0,148,0); //设置颜色
int x=0,y=0;
double x1=0f,y1=0f,x2,y2; //要把x2和y2都放在外面
double r=0,s=0,theta=0,phi=0,e=0,f=0;
for(int i=0;i<100000;i++){
int num=ran.nextInt(6)+1;
if(num==1){ //值不一样的时候改变参数的值
r=0.0500; s=0.6000; theta=0.0000; phi=0.0000; e=0.0000; f=0.0000;
}
if(num==2){ //值不一样的时候改变参数的值
r=0.0500; s=-0.5000; theta=0.0000; phi=0.0000; e=0.0000; f=1.0000;
}
if(num==3){ //值不一样的时候改变参数的值
r=0.6000; s=0.5000; theta=0.6980; phi=0.6980; e=0.0000; f=0.6000;
}
if(num==4){ //值不一样的时候改变参数的值
r=0.5000; s=0.4500; theta=0.3490; phi=0.3492; e=0.0000; f=1.1000;
}
if(num==5){ //值不一样的时候改变参数的值
r=0.5000; s=0.5500; theta=-0.5240; phi=-0.5240; e=0.0000; f=1.0000;
}
if(num==6){ //值不一样的时候改变参数的值
r=0.5500; s=0.4000; theta=-0.6980; phi=-0.6980; e=0.0000; f=0.7000;
}
x2=r*Math.cos(theta)*x1-s*Math.sin(phi)*y1+e;
y2=r*Math.sin(theta)*x1+s*Math.cos(phi)*y1+f;
x=(int)(-180*x2+300);
y=(int)(-180*y2+450);
g.drawLine(x, y, x, y); //画图
g.setColor(color);
x1=x2; //将后面的值赋值给前面,,使得x和Y循环发生变化
y1=y2;
}
}
/**
* 定义一种花叶子的方法
*/
public void draw4(){
Graphics g=jp.getGraphics(); //取得画布对象
Color color=new Color(0,148,0);
double x1=0,y1=0,x2,y2; //定义变量名,并且初始化
double a=0,b=0,c=0,d=0,e=0,f=0;
int x,y;
for(int i=0;i<100000;i++){
num=ran.nextInt(100)+1; //随机产生1~100个数字
if(num==1){ //概率为百分之1
a=0.0;b=0.0;c=0.0;d=0.16;e=0.0;f=0.0;
}
if(num>=2&&num<=9){ //概率为百分之7
a=0.2;b=-0.26;c=0.23;d=0.22;e=0.0;f=1.6;
}
if(num>9&&num<=16){ //概率为百分之7
a=-0.15;b=0.28;c=0.26;d=0.24;e=0.0;f=0.44; //初始化参数
}
if(num>=17&&num<=90){ // 剩余的概率
a=0.75;b=0.04;c=-0.04;d=0.85;e=0.0;f=1.6; //初始化参数
}
x2=a*x1+b*y1+e;
y2=c*x1+d*y1+f;
x=(int)(-30*x2+350);
y=(int)(-30*y2+350);
x1=x2; //将后面的赋值给前面的
y1=y2; //将后面的赋值给前面的
g.drawLine(x, y, x, y); //画图形
g.setColor(color);
}
}
}
1.3 运行上面代码
1.3.1 当点击山林按钮时候的结果如图:
1.3.2 当点击野风按钮时候的结果如图:
1.3.3 当点击随叶按钮的时候结果如图:
- 大小: 35.3 KB
- 大小: 18.5 KB
- 大小: 48.4 KB
- 大小: 48.4 KB
- 大小: 18.5 KB
分享到:
相关推荐
画一棵分形树,其中定义了树枝、树叶和花,使用海龟绘图
1.使用OpenGL设计了分形树,程序运行结果包括一棵带花的树和一棵结果实的树。 2.程序中使用曲面技术做了苹果,苹果挂在树上,比较逼真。 3.资源中包括程序源码文件夹、运行结果截图、实验报告(实验报告包括:实验...
openGL实现分形树的源代码,openGL实现分形树的源代码
利用随机数打乱的分形树 比较接近真实树
用VC实现的树的分形算法,从树开始生长到落叶
计算机图形学分形树,用C语言编写的。实现的是一个二维的分形树。
通过c实现摆动分形树,上下摆动,左右摆动,计算机图形学
vc++实现的分形树 基于界面的分形树的绘制
用OpenGL实现分形的三维树,分形是构建自然景观的重要算法,起源于英国的海岸长度的思考
大多数分形程序都是二维的,本人提供一个3DIFS分形树程序,以及分形山。 程序很简单,适合初学者.
该程序是在Visual Studio 2003.Net下开发完成。程序包含三种不同的递归分形树算法实现代码,界面简洁清爽,效果直观逼真,代码规范标准。文件不含任何非法**,请放心下载!
利用分形算法,模拟出具有动画效果的分形树
简单绘制分形树的代码,doc格式,可以设置偏移角度数、分支比例、迭代次数
本源码介绍了计算物理基础的第二章第一题分形树,讲述了分形树的原理,以及源代码
在VC环境下,利用分形L系统生成的开花的小树
【老生谈算法】matlab实现分形树源码.docx
本软件基于IFS理论,可以产生各种二维分形图形。 可以从http://www.is.pku.edu.cn/~zxp/下载最新版本。 ◎ 更新 与V1.3相比,增加了“全屏”功能,可以绘制大幅的图形。 同时重写了部分代码,使之更精练。 ◎ ...
分形理论是利用分数维数的数学方法来描述和研究客观事物。利用分形可以模拟出逼真的自然景物,解决了计算机对复杂自然景物建模困难的问题。IFS迭代函数系统模型是产生分形图形的重要方法之一。根据IFS模型构建分形...
分形树的展开,树的的线条粗细,颜色,动画全都实现了按键控制详看代码。
opengl VS2017 L系统 三维分形树 较为逼真 可以鼠标控制旋转,键盘按键控制放大缩小,以及控制叶片大小,树干粗细