`
沉沦的夏天
  • 浏览: 10765 次
  • 性别: Icon_minigender_1
社区版块
存档分类
最新评论

分形小结

阅读更多
简单的说就是部分与整体以某种方式相似的形体,具有三个特性
1. 自相似性,部分是整体的缩影,2.自仿射性:局部到整体是在不同方向上的不等比例
3.精细结构,即在任意小的比例尺度包含整体

以下是编的一个分形树效果




如果加入随机变化的颜色,就可以做成礼花效果图:




上图中的参数,没大多奥秘,其含义如下图所示,单元长度即AC,树枝伸展角度即W(程序中用A),主干生长角度即Theta(程序中用B表示),但测试结果好像树枝生长角度没多大意义,只是控制在屏幕中的旋转角度而已,分支长度系数即BE、BD、CG或者CF这四条相等线段与AC的比,主干长度系数即下一生长单元的长度与当前生长单元长度AC的比值。


下面是程序代码:
package FractalTree;

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

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JRadioButton;
import javax.swing.JTextField;
import javax.swing.plaf.SliderUI;

public class Test {
	//用于存放文本框中字符串
	//分别对应于"单元长度","树枝伸展角度","主干生长角度","分支长度系数","顶点长度系数"的值
	private JTextField [] jtf=new JTextField[5];
	//给对应文本框内容赋初值
	private String [] jtf_str= new String[]{"120","35","15","0.6","0.4"};
	JRadioButton jrb1;//选中礼花效果的单选框
	JRadioButton jrb2;//选中长大效果的单选框
	private boolean flag=false;//是否进入效果标志
	Mylistener my;//监听器对象
	Graphics g;//中间面板的画布对象
	JPanel centerpal;//中间面板对象
	private Random random=new Random();//新建随机数类
	public static void main(String [] args){
		Test test=new Test();
		test.initUI();
	}

	//初始化界面
	public void initUI(){
		//新建窗体,并赋属性
		JFrame jf = new JFrame();
		jf.setSize(700,600);
		jf.setTitle("分形树");
		jf.setLocationRelativeTo(null);
		jf.setDefaultCloseOperation(3);
		jf.setResizable(false);
		//创建东边面板用于参数设置,中间面板画图
		 centerpal=new JPanel(){
			// Graphics g;
			public void paint(Graphics g){
				super.paint(g);
				int length=0;
				float a=0,b=0,z=0,c=0;//定义树枝伸展角度,主干生长角度,树枝长度系数,顶点长度系数
				//将文本框的内容取出
				for(int i=0;i<jtf_str.length;i++){
					jtf_str[i]=jtf[i].getText();
				}
				//各文本框的内容转换为对应数值
				a=Integer.parseInt(jtf_str[1]);
				b=Integer.parseInt(jtf_str[2]);
				a=(float) (a*Math.PI/180);
				b=(float) (b*Math.PI/180);
				length=Integer.parseInt(jtf_str[0]);
				z=Float.parseFloat(jtf_str[3]);
				c=Float.parseFloat(jtf_str[4]);
//				if(jrb2.isSelected()){
//						//选中长大效果
//						if(!flag){
//							flag=true;
//							z=z/10;
//							c=c/10;
//							length=50+(length-50)/10;
//							for(int i=0;i<10;i++){
//								z=z+z*i;
//								c=c+c*i;
//								length=50+(length-50)/10*(i+1);
//								try {
//									Thread.sleep(100);
//								} catch (InterruptedException e) {
//									// TODO Auto-generated catch block
//									e.printStackTrace();
//								}
//								this.draw(250, 600, length,a,b,z,c,g);
//								this.repaint();
//							}				
//					}
//				}
				
				
			
				//this.draw(300, 600, 120,35*Math.PI/180, 5*Math.PI/180,0.6,0.4,g);		
					this.draw(250, 600, length,a,b,z,c,g);	
					//如果礼花效果被选中
				if(jrb1.isSelected()){
					for(int i=0;i<10;i++){
						//休眠200ms
						try {
							Thread.sleep(20);
						} catch (InterruptedException e) {
							// TODO Auto-generated catch block
							e.printStackTrace();
						}
						//重绘
						this.repaint();
						
					}		
					
					}
				
				
			}
			//画生长单元的递归方法
			public void draw(int X,int Y,int LEN,double A,double B,double Z,double C,Graphics g){
				
				int len=0,x=0,y=0,x1=0,y1=0,x1l=0,y1l=0,x1r=0,y1r=0,x2=0,y2=0,x2l=0,y2l=0,x2r=0,y2r=0;
				if(LEN>7){
					len=(int)(LEN*Z);//获得树枝长度
					//获得B点(x1,y1)坐标
					 x1=(int)(X+len*Math.sin(B));
					 y1=(int)(Y-len*Math.cos(B));
					//获得B点(x1,y1)左右分支点坐标
					 x1l=x1+(int)(len*Math.sin(B-A)); 
					 y1l=y1-(int)(len*Math.cos(B-A));
					x1r=x1+(int)(len*Math.sin(B+A)); 
					 y1r=y1-(int)(len*Math.cos(B+A));
					
					//获得C点(x2,y2)坐标
					 x2=(int)(X+LEN*Math.sin(B));
					 y2=(int)(Y-LEN*Math.cos(B));
					//获得C点(x2,y2)左右分支点坐标
					 x2l=x2+(int)(len*Math.sin(B-A)); 
					 y2l=y2-(int)(len*Math.cos(B-A));
					 x2r=x2+(int)(len*Math.sin(B+A)); 
					 y2r=y2-(int)(len*Math.cos(B+A));
					 
					 //如果礼花效果选中,颜色为随机
					 if(jrb1.isSelected()){
						 g.setColor(new Color(random.nextInt(256), random.nextInt(256),random.nextInt(256)));
					 }
					 //否则,颜色固定为绿色
					 else {
						 g.setColor(Color.green);
					 }
					g.drawLine(X, Y, x2, y2);//主干线
					//B点(x1,y1)坐标处的两条分支
					g.drawLine(x1, y1, x1l, y1l);
					g.drawLine(x1, y1, x1r, y1r);
					//C点(x2,y2)坐标处的两条分支
					g.drawLine(x2, y2, x2l, y2l);
					g.drawLine(x2, y2, x2r, y2r);
					//递归
					this.draw(x2, y2, (int)(LEN*C), A, B+B, Z, C,g);
					this.draw(x1l, y1l, len, A, B-A, Z, C,g);
					this.draw(x1r, y1r, len, A, B+A, Z, C,g);
					this.draw(x2l, y2l, len, A, B-A, Z, C,g);
					this.draw(x2r, y2r, len, A, B+A, Z, C,g);
					}
				}
		};
		//中间面板背景颜色
		centerpal.setBackground(new Color(0,0,0));
		//创建监听器,传入中间面板
		my=new Mylistener(centerpal);
		//创建东边面板
		JPanel eastpal=this.creat_eastpal();
		jf.add(eastpal,BorderLayout.EAST);
		jf.add(centerpal,BorderLayout.CENTER);
		jf.setVisible(true);//窗体可见
		
		
	}
	
	//创建东边面板方法
	public JPanel creat_eastpal(){
		JPanel eastpal=new JPanel();
		eastpal.setPreferredSize(new Dimension(100,0));
		eastpal.setBackground(new Color(222,222,222));
		eastpal.setLayout(null);
		//5个标签和5个文本框
		String [] str_lab=new String[]{"单元长度:","树枝伸展角度:","主干生长角度:","分支长度系数:","顶点长度系数:"};
		for(int i=0;i<str_lab.length;i++){
			JLabel lab=new JLabel(str_lab[i]);
			lab.setBounds(5, 30+50*i, 90, 20);
			//每个标签下对应的文本框存入数组,方便取数
			 jtf[i]= new JTextField();
			jtf[i].setBounds(5, 55+50*i, 90, 25);
			jtf[i].setText(jtf_str[i]);
			eastpal.add(lab);
			eastpal.add(jtf[i]);
		}
		//创建单选框,选中为礼花效果,并加入东边面板中
		 //jcb=new JCheckBox("礼花效果");
		 jrb1=new JRadioButton("礼花效果");
		 jrb1.setBounds(5, 310, 90, 30);
		 jrb1.addActionListener(my);
		 eastpal.add(jrb1);
		
		//创建单选框,选中为长大效果,并加入东边面板中
		 //jcb=new JCheckBox("长大效果");
		 jrb2=new JRadioButton("长大效果");
		 jrb2.setBounds(5, 360, 90, 30);
		 //jrb2.addActionListener(my);
		 eastpal.add(jrb2);
		 
		//确定按钮,开始绘制
		JButton jb=new JButton("确定");
		jb.setBounds(15, 420, 70, 30);
		jb.addActionListener(my);
		eastpal.add(jb);
		return eastpal;	
	}


	
}



另外一个按钮监听器类
package FractalTree;

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.JCheckBox;
import javax.swing.JPanel;
import javax.swing.JRadioButton;
import javax.swing.JTextField;

public class Mylistener implements ActionListener{
	private JPanel panel;

	
	public Mylistener (JPanel panel){
		this.panel=panel;
	}
	
	public void actionPerformed(ActionEvent e) {
		
		if(e.getActionCommand().equals("确定")){
			panel.repaint();	
		}
	
	}
	
	
		
	
		


}



很遗憾,长大效果还没做出来,有待研究。
  • 大小: 56.8 KB
  • 大小: 139.8 KB
  • 大小: 30.1 KB
分享到:
评论
1 楼 ayaome 2014-03-22  
不错

相关推荐

    下载的资源,下载后解压

    python->exe

    前段web开发实战-哪吒2哪吒闹海网站(超酷哪吒主题网页,HTML+CSS 带你畅游)

    宝子们,快来看看这个超炫的哪吒主题网页!用 HTML 和 CSS 精心打造,有酷炫的头部导航、精彩的横幅内容,还有各种哪吒相关人物介绍和超燃票房海报。代码简单易懂,非常适合前端小白学习,一起动手搭建属于自己的哪吒世界吧!

    Java毕业设计-SpringBoot+Vue的家乡特色推荐系统(附源码、数据库、教程).zip

    Java 项目, Java 毕业设计,Java 课程设计,基于 SpringBoot 开发的,含有代码注释,新手也可看懂。毕业设计、期末大作业、课程设计、高分必看,下载下来,简单部署,就可以使用。 包含:项目源码、数据库脚本、软件工具等,前后端代码都在里面。 该系统功能完善、界面美观、操作简单、功能齐全、管理便捷,具有很高的实际应用价值。 项目都经过严格调试,确保可以运行! 1. 技术组成 前端:html、javascript、Vue 后台框架:SpringBoot 开发环境:idea 数据库:MySql(建议用 5.7 版本,8.0 有时候会有坑) 数据库工具:navicat 部署环境:Tomcat(建议用 7.x 或者 8.x 版本), maven 2. 部署 如果部署有疑问的话,可以找我咨询 Java工具包下载地址: https://pan.quark.cn/s/eb24351ebac4 后台路径地址:localhost:8080/项目名称/admin/dist/index.html 前台路径地址:localhost:8080/项目名称/front/index.html (无前台不需要输入)

    2023年专升本计算机复习题.pdf

    2023年专升本计算机复习题.pdf

    基于SSM+JSP的班级同学录网站+数据库(Java毕业设计,包括源码,教程).zip

    Java 项目, Java 毕业设计,Java 课程设计,基于 SpringBoot 开发的,含有代码注释,新手也可看懂。毕业设计、期末大作业、课程设计、高分必看,下载下来,简单部署,就可以使用。 包含:项目源码、数据库脚本、软件工具等,前后端代码都在里面。 该系统功能完善、界面美观、操作简单、功能齐全、管理便捷,具有很高的实际应用价值。 项目都经过严格调试,确保可以运行! 1. 技术组成 前端:jsp 后台框架:SSM 开发环境:idea 数据库:MySql(建议用 5.7 版本,8.0 有时候会有坑) 数据库工具:navicat 部署环境:Tomcat(建议用 7.x 或者 8.x 版本), maven 2. 部署 如果部署有疑问的话,可以找我咨询 Java工具包下载地址: https://pan.quark.cn/s/eb24351ebac4

    【工程项目】MATLAB虫害监测(带识别率).zip

    【工程项目】MATLAB虫害监测(带识别率)

    金刚石化学机械抛光(CMP)中层状双氢氧化物催化作用研究及应用

    内容概要:本文详细研究了金刚石(Single Crystal Diamond, SCD)化学机械抛光(CMP)过程中,抛光浆料的组成成分对其表面质量的影响。通过对浆料的化学成分(氧化剂种类及浓度、催化剂种类)及机械因素(磨料粒径)进行系统性探索,研究揭示了氧化剂、磨料和催化剂之间复杂的相互作用关系。重点介绍了层状双氢氧化物(Layered Double Hydroxides, LDH)的应用和芬顿反应机理,探讨其对提高抛光效果的独特贡献,特别是表面粗糙度和质量的提升。实验中通过一系列对照测试比较不同浆料配置对抛光结果的不同影响,得出了具体的最优配置参数,实现了Ra约为0.109 nm的原子级平整表面。 适合人群:从事CMP工艺研究的专业人士、材料科学及物理学相关背景研究人员和技术人员、关注高端材料制备与处理的企业研发人员。 使用场景及目标:适用于需要深入了解CMP技术细节及应用的科学研究项目;针对希望提升超硬材料如金刚石表面加工品质的实际工业生产环境。本研究所建立的最佳浆料配比及相应抛光参数对实现高效能CMP处理流程有着重要的指导意义,尤其有助于优化半导体器件制造和其他高精度要求的技术

    基于JAVA的机场航班起降与协调管理系统&毕业设计&毕业论文&数据库&演示视频&源代码

    本次项目是设计一个基于JAVA的机场航班起降与协调管理系统。 (1)在经济可行性上来分析的话,该软件是机场内部使用的一个指挥协调软件,属于航空安全投资,本软件开发成本并不高,软件和服务器数据库可以用机场原有的数据库进行开发,比起空难给航空公司造成的损失来说九牛一毛。 (2)在技术可行性上来分析的话,该软件主要运用了Java技术、jQuery-easyui和Mysql数据库技术。Java是到目前来说最稳定的、最可靠的软件开发工具;jQuery-easyui虽然是比较新的前台开发技术,但是他的界面新颖整洁,适合于功能性软件的开发;Mysql数据库也是许多大公司都采用的软件项目开发数据库,不仅稳定而且性能可靠,可以用作本次软件的开发。 (3)在法律可行性上来分析的话,该软件使用的技术都为开源的软件开发工具和语言,虽然Java等开发技术都存在Sun公司的版权问题,但是Java技术是可以免费使用的,没有涉及到法律上的侵权。 (4)在方案可行性上来分析的话,此次软件开发的很大一部分精力都放在了软件的需求分析和设计方面,设计出来的软件可以很好地去实现我们所要完成的软件预先设计的功能。

    2023年计算机组成与系统结构实验报告.pdf

    2023年计算机组成与系统结构实验报告.pdf

    基于Springboot的漫画网站--论文.zip

    Java项目基于springboot的课程设计,包含源码+数据库+毕业论文

    Java毕业设计-SpringBoot+Vue的准妈妈孕期交流平台(附源码,数据库).zip

    Java 项目, Java 毕业设计,Java 课程设计,基于 SpringBoot 开发的,含有代码注释,新手也可看懂。毕业设计、期末大作业、课程设计、高分必看,下载下来,简单部署,就可以使用。 包含:项目源码、数据库脚本、软件工具等,前后端代码都在里面。 该系统功能完善、界面美观、操作简单、功能齐全、管理便捷,具有很高的实际应用价值。 项目都经过严格调试,确保可以运行! 1. 技术组成 前端:html、javascript、Vue 后台框架:SpringBoot 开发环境:idea 数据库:MySql(建议用 5.7 版本,8.0 有时候会有坑) 数据库工具:navicat 部署环境:Tomcat(建议用 7.x 或者 8.x 版本), maven 2. 部署 如果部署有疑问的话,可以找我咨询 Java工具包下载地址: https://pan.quark.cn/s/eb24351ebac4 后台路径地址:localhost:8080/项目名称/admin/dist/index.html 前台路径地址:localhost:8080/项目名称/front/index.html (无前台不需要输入)

    【工程项目】MATLAB打印纸缺陷检测GUI(不同缺陷类型,GUI界面).zip

    【工程项目】MATLAB打印纸缺陷检测GUI(不同缺陷类型,GUI界面)

    基于ssm+vue的房屋租赁系统求租合同Vue(java毕业设计,包括源码,数据库,教程).zip

    Java 项目, Java 毕业设计,Java 课程设计,基于 SSM 开发的,含有代码注释,新手也可看懂。毕业设计、期末大作业、课程设计、高分必看,下载下来,简单部署,就可以使用。 包含:项目源码、数据库脚本、软件工具等,前后端代码都在里面。 该系统功能完善、界面美观、操作简单、功能齐全、管理便捷,具有很高的实际应用价值。 项目都经过严格调试,确保可以运行! 1. 技术组成 前端:vue/html5 后台框架:SSM 开发环境:idea 数据库:MySql(建议用 5.7 版本,8.0 有时候会有坑) 数据库工具:navicat 部署环境:Tomcat(建议用 7.x 或者 8.x 版本), maven 2. 部署 如果部署有疑问的话,可以找我咨询 Java工具包下载地址: https://pan.quark.cn/s/eb24351ebac4

    C++ 实现判断是否为平衡二叉树(最小二叉树)算法及应用实例

    内容概要:本文档介绍了一个用C++编写的判断是否为平衡二叉树(也称为最小二叉树)的完整代码示例。主要内容涵盖二叉树相关操作,包括定义节点结构、计算树的高度、检查树是否平衡以及插入新元素等功能模块,并给出具体应用演示。首先定义了一个二叉树的结点结构——TreeNode结构体;接着实现了辅助函数,比如计算某结点的最大深度的方法height(), 插入指定值到正确位置的方法insert(),对整个树进行中序遍历的方法inorder();然后重点给出了isBalanced()方法的具体逻辑实现来判定是否是一棵平衡二叉树,它是通过比较左右两个分支的高度之差不大于1,同时递归检查所有孩子结点所在的分支满足同样条件。最后通过主函数完成实际案例构造和测试。 适合人群:对于有一定C++基础的学生或者工程师来说是非常好的学习资料。 使用场景及目标:适用于希望深入理解和掌握二叉树这一常见数据结构特性的学习者,在实际软件项目尤其是涉及快速查找排序时能够灵活运用。 其他说明:此文档提供了详细的注释帮助使用者更容易读懂每一行关键语句的作用机理,还展示了怎样用程序去解决真实问题的全过程。

    Java毕业设计-SpringBoot+Vue的教师人事档案管理系统(附源码,数据库).zip

    Java 项目, Java 毕业设计,Java 课程设计,基于 SpringBoot 开发的,含有代码注释,新手也可看懂。毕业设计、期末大作业、课程设计、高分必看,下载下来,简单部署,就可以使用。 包含:项目源码、数据库脚本、软件工具等,前后端代码都在里面。 该系统功能完善、界面美观、操作简单、功能齐全、管理便捷,具有很高的实际应用价值。 项目都经过严格调试,确保可以运行! 1. 技术组成 前端:html、javascript、Vue 后台框架:SpringBoot 开发环境:idea 数据库:MySql(建议用 5.7 版本,8.0 有时候会有坑) 数据库工具:navicat 部署环境:Tomcat(建议用 7.x 或者 8.x 版本), maven 2. 部署 如果部署有疑问的话,可以找我咨询 Java工具包下载地址: https://pan.quark.cn/s/eb24351ebac4 后台路径地址:localhost:8080/项目名称/admin/dist/index.html 前台路径地址:localhost:8080/项目名称/front/index.html (无前台不需要输入)

    基于SpringBoot+Vue的藏区特产销售平台 (2)(Java毕业设计,包括源码、数据库、教程).zip

    Java 项目, Java 毕业设计,Java 课程设计,基于 SpringBoot 开发的,含有代码注释,新手也可看懂。毕业设计、期末大作业、课程设计、高分必看,下载下来,简单部署,就可以使用。 包含:项目源码、数据库脚本、软件工具等,前后端代码都在里面。 该系统功能完善、界面美观、操作简单、功能齐全、管理便捷,具有很高的实际应用价值。 项目都经过严格调试,确保可以运行! 1. 技术组成 前端:html、javascript、Vue 后台框架:SpringBoot 开发环境:idea 数据库:MySql(建议用 5.7 版本,8.0 有时候会有坑) 数据库工具:navicat 部署环境:Tomcat(建议用 7.x 或者 8.x 版本), maven 2. 部署 如果部署有疑问的话,可以找我咨询 Java工具包下载地址: https://pan.quark.cn/s/eb24351ebac4 后台路径地址:localhost:8080/项目名称/admin/dist/index.html 前台路径地址:localhost:8080/项目名称/front/index.html (无前台不需要输入)

    Java毕业设计-SpringBoot+Vue的书籍学习平台(附源码、数据库、教程).zip

    Java 项目, Java 毕业设计,Java 课程设计,基于 SpringBoot 开发的,含有代码注释,新手也可看懂。毕业设计、期末大作业、课程设计、高分必看,下载下来,简单部署,就可以使用。 包含:项目源码、数据库脚本、软件工具等,前后端代码都在里面。 该系统功能完善、界面美观、操作简单、功能齐全、管理便捷,具有很高的实际应用价值。 项目都经过严格调试,确保可以运行! 1. 技术组成 前端:html、javascript、Vue 后台框架:SpringBoot 开发环境:idea 数据库:MySql(建议用 5.7 版本,8.0 有时候会有坑) 数据库工具:navicat 部署环境:Tomcat(建议用 7.x 或者 8.x 版本), maven 2. 部署 如果部署有疑问的话,可以找我咨询 Java工具包下载地址: https://pan.quark.cn/s/eb24351ebac4 后台路径地址:localhost:8080/项目名称/admin/dist/index.html 前台路径地址:localhost:8080/项目名称/front/index.html (无前台不需要输入)

    23软件2班(1).zip

    23软件2班(1).zip

    Java毕业设计-SpringBoot+Vue的大学生社团活动平台(附源码,数据库).zip

    Java 项目, Java 毕业设计,Java 课程设计,基于 SpringBoot 开发的,含有代码注释,新手也可看懂。毕业设计、期末大作业、课程设计、高分必看,下载下来,简单部署,就可以使用。 包含:项目源码、数据库脚本、软件工具等,前后端代码都在里面。 该系统功能完善、界面美观、操作简单、功能齐全、管理便捷,具有很高的实际应用价值。 项目都经过严格调试,确保可以运行! 1. 技术组成 前端:html、javascript、Vue 后台框架:SpringBoot 开发环境:idea 数据库:MySql(建议用 5.7 版本,8.0 有时候会有坑) 数据库工具:navicat 部署环境:Tomcat(建议用 7.x 或者 8.x 版本), maven 2. 部署 如果部署有疑问的话,可以找我咨询 Java工具包下载地址: https://pan.quark.cn/s/eb24351ebac4 后台路径地址:localhost:8080/项目名称/admin/dist/index.html 前台路径地址:localhost:8080/项目名称/front/index.html (无前台不需要输入)

    数据库系统课程设计报告-商品供应管理系统设计与开发

    一、系统需求分析 1 (一)需求概述 1 (二)业务流分析 1 (三)数据流分析 3 (四)数据字典 3 二、数据库概念结构设计 5 (一)实体分析 5 (二)属性分析 5 (三)联系分析 6 (四)概念模型分析(.PDM图) 7 三、数据库逻辑结构设计 8 (一)概念模型转化为逻辑模型 8 1.一对一关系的转化 8 2.一对多关系的转化 8 3.多对多关系的转化 8 (二)逻辑模型设计(.PDM图) 8 四、数据库物理实现 9 (一)表设计 9 (二)创建表和完整性约束代码设计 10 (三)创建视图、索引、存储过程和触发器 11 五、数据库功能调试 12 (一)职工管理模块 12 (二)工程负责人管理模块 13 (三)系统管理员管理模块 15 六、设计系统前台软件 20 (一)开发软件选择 20 (二)软件功能要求与设计 21 (三)软件功能实现 21 (四)系统测试 27 七、设计总结 28

Global site tag (gtag.js) - Google Analytics