一
引入:现在分形学说发展越来越成熟,各种各样的描述分形也变得越来越多。美国杰出屋里学家,物理教育学家惠勒断言:“可以相信以后要是谁不熟悉分形,那么他将不可能被当做是地球上的文明人”。从这里我们可以看出分形的重要性,那么到底什么是分形呢?
二
分形的定义:
分形是其组成部分以某种方式与整体具有相似的形。如果一个图形及其组成部分以某种方式与整体相似,我们就将该图形叫做分形。
三
分形的形成: 分形是图形通过简单的递归方式按照无数迭代的方式形成的。例如细胞的分裂。因其满足细胞的组成通过分裂的方式与整体相识。生活中也有很多图形都是分形,树叶的组成结构...
四
分形的程序编写
通过上面我们知道分形是通过简单的递归方式按照无数迭代的方式形成的,那么我们就可以在计算机中通过编程,按照相同的规律来实现。下面我将举出几个例子来更深入的了解分形
五:
具体的分形例子实现代码:
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
分享到:
相关推荐
在Python编程语言中,我们可以利用turtle模块来创建各种图形,包括复杂的艺术作品,如分形树。分形是一种自相似的几何形状,在自然界中广泛存在,比如树叶、山脉和云朵。分形树就是一种利用分形理论绘制的树形图案,...
分形树就是通过迭代过程,每次生成的新分支都与上一级分支相似,但尺寸逐渐缩小,形成复杂而逼真的树状结构。 在MATLAB中实现随机分形树,主要步骤如下: 1. **初始化**:设定初始的主干参数,如长度、角度、分支...
在这个主题中,我们将探讨如何使用OpenGL来实现分形树。分形树是一种基于数学规则的自相似图形,它通过递归过程生成,具有高度的细节和复杂性。这种图形在计算机图形学中经常被用来创建逼真的自然环境。 首先,我们...
1.使用OpenGL设计了分形树,程序运行结果包括一棵带花的树和一棵结果实的树。 2.程序中使用曲面技术做了苹果,苹果挂在树上,比较逼真。 3.资源中包括程序源码文件夹、运行结果截图、实验报告(实验报告包括:实验...
通过上述分析,我们可以看到,在VC++中实现分形树的绘制涉及到多个层面的知识,包括设备上下文的管理、图形对象的创建与选择、参数的合理设置、递归算法的设计以及最终的图形渲染。掌握这些技术不仅可以帮助我们更好...
在本案例中,我们将深入探讨如何使用VC(Visual C++)来实现一个分形树的生成算法。 分形树的生成通常基于迭代过程,每一步迭代都会增加树的分支细节。这种算法的基础是递归思想,每个树干可以分为两个或多个较小的...
总之,分形树生成器是一个结合了数学、计算机科学与艺术的实用工具,对于学习递归算法、分形理论以及图形生成技术的人来说,是一个非常有价值的资源。无论是为了学术研究还是个人兴趣,都可以从这个程序中受益匪浅。
分形树是一种在计算机图形学中常见的几何形态,它展示了自然界中许多复杂结构的自相似性。这种结构可以通过数学公式和算法生成,其中C语言是一种常用的语言来实现这些算法。在本项目中,我们将深入探讨如何用C语言来...
分形树则是模拟自然界中树状结构的一种数学模型,它体现了自然界中复杂系统的有序与混沌并存。 在计算物理中,分形树常用于模拟和研究生长过程、能量分布、物质扩散等问题。例如,在森林火灾模型中,分形树可以用来...
6. **分形山的实现**:分形山的生成与分形树类似,但通常使用更复杂的IFS规则,可能涉及到更多维度的变换。例如,可以使用高度映射来创建山体表面的粗糙度。 7. **交互式调整**:为了使程序更具交互性,可以添加...
在本项目中,“OPENGL分形树及动画实现”涉及的是利用OpenGL技术来构建并动态展示分形树的生成过程。分形树是一种基于分形几何的概念,它通过递归地复制和缩放自身的部分来创建复杂而精细的结构,这种结构在自然界中...
在MATLAB环境中进行图像处理与计算机视觉开发时,有时我们需要创建复杂的几何形状,例如分形树。"matlab开发-生成f3d分形树"的项目就是专注于使用MATLAB来构建三维(3D)的分形树模型。分形树是一种具有自相似性的...
"摇曳的递归分形树"这个标题暗示了我们将探讨一种能够动态变化的分形树生成技术,可能涉及到树枝的摆动、生长过程的动画化或者视角的改变等元素,让静态的分形树变得生动起来。 描述中提到“利用分形算法模拟出具有...
分形树生成算法研究及其MATLAB实现 分形理论作为新兴数学分支,主要研究自然与科学中复杂对象的几何...在未来的应用中,分形树算法有望在更多领域中发挥作用,如在虚拟现实、动画制作、复杂网络的模拟与分析等方面。
在计算机图形学领域,"开花的分形树"是一种...总之,"开花的分形树"是一个结合了数学、艺术与编程的项目,通过L系统和分形理论在VC++环境下模拟植物生长,生成栩栩如生的图像,展现了数学在创造艺术美感上的无限潜力。
通过c实现摆动分形树,上下摆动,左右摆动,计算机图形学
分形树的构建基于迭代过程,每个迭代步骤都会产生与前一阶段相似但规模缩小的结构。这种自相似性是分形的基本特征。在MATLAB中,我们可以利用递归函数或者非线性动力系统来生成分形树。例如,可以使用L-系统或者...
Matlab 实现分形树源码解析 Matlab 是一款功能强大的数学软件,可以用于实现各种算法和模拟仿真。下面,我们将通过一个例子来介绍如何使用 Matlab 实现分形树的生成。 Matlab 的基本概念 在开始之前,需要了解 ...
用OpenGL实现分形的三维树,分形是构建自然景观的重要算法,起源于英国的海岸长度的思考
**递归分形树源码解析** 分形树是一种基于分形几何理论的图形,它通过重复应用相同或相似的规则来创建具有自相似性的树形结构。在计算机图形学中,递归算法常用于实现分形树的生成,因为它能够以简洁的方式描述复杂...