`
沉沦的夏天
  • 浏览: 10641 次
  • 性别: 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  
不错

相关推荐

    基于JAVA的分形图像生成研究.doc

    小结部分总结了整个毕业设计的过程和成果,包括代码编写、程序调试和功能实现。参考文献列出了相关研究的来源,而英文摘要则为非中文读者提供了论文概要。最后,致谢表达了对指导教师和学习经历的感激之情,并附有...

    分形宽带人工磁导体接地增强领结天线的增益

    这项研究中设计的分形AMC结构由6×9个一阶分形单元组成,这些单元由四个大圆和四个小圆构成,实现了从1.1 GHz到3.03 GHz的±90°反射相位带宽。 通过这项技术,相较于仅使用传统AMC结构,新型分形AMC结构能够在更宽...

    准分形结构光子晶体滤波器层厚误差容限

    为了研究准分形结构光子晶体滤波器制作过程中引入的层厚误差微扰对其性能的影响, 并得出准分形结构光子晶体滤波器的层厚误差容限,通过向正负折射率介质层加入不同的层厚微扰, 分析了含负材料准分形结构光子晶体...

    语音识别技术文章.rar

    2.5 小结 参考文献 第3章 语音信号处理方法--时域处理 3.1 概述 3.2 语音信号的数字化和预处理 3.2.1 语音信号的数字化 3.2.2 语音信号的预处理 3.3 短时平均能量和短时平均幅度 3.3.1 短时平均能量 3.3.2...

    人教版初中数学电子书目录参考.docx

    - **小结**:总结本章知识点。 - **复习题1**:提供习题供学生巩固所学知识。 **第二章:整式的加减** - **2.1 整式**:定义整式并区分单项式与多项式。 - **阅读与思考:数字1与字母X的对话**:通过故事形式让...

    Android 3D游戏开发技术宝典-OpenGL ES 2.0 (吴亚峰) 源代码

    1.6 本章小结 22 第2章 游戏开发相关android基础知识 23 2.1 游戏中的音效 23 2.1.1 游戏中的即时音效 23 2.1.2 即时音效的一个案例 24 2.1.3 背景音乐播放技术 27 2.1.4 简易音乐播放器的实现 ...

    数字图像处理讲义和源码

    边缘提取:梯度、边缘(3+1小结) ④ 几何运算:成象机理2D几何(2) ⑤ 形态运算:形态滤波(4) (4) 图象分析(4)  特征提取  图象分割  图象表示 (5) 图象压缩(4)  基本原理  几种常用方法...

    实用语音识别基础

    5 小结  参考文献  第3章 语音信号处理方法--时域处理  3. 1 概述  3. 2 语音信号的数字化和预处理  3. 2. 1 语音信号的数字化  3. 2. 2 语音信号的预处理  3. 3 短时平均能量和短时平均幅度 ...

    实用语音识别基础电子版

    5 小结  参考文献  第3章 语音信号处理方法--时域处理  3. 1 概述  3. 2 语音信号的数字化和预处理  3. 2. 1 语音信号的数字化  3. 2. 2 语音信号的预处理  3. 3 短时平均能量和短时平均幅度 ...

    计算机图形学课程设计题目

    在完成课程设计时,报告的格式和内容组织也非常重要,需按照规定的结构(封面、摘要、目录、绪论、正文、小结、参考文献、附录等)进行编排。报告页数限制在20页内,确保内容精炼而全面。此外,保持良好的沟通,如...

    选择性激光烧结机的改进.pdf

    在扫描系统中,对X方向的灵敏度和定位精度有很高的要求,同时还需要牵引力小,移动轻便,所以选用了高精度的直线滚动导轨,并具有较小的重复定位误差和摩擦系数,以实现分形路径扫描,从而完成零件片层的烧结。...

    基于矩阵运算的超网络构建方法研究及特性分析.pdf

    小结 基于矩阵运算的超网络构建方法是一种有效的方法,可以用于构建复杂的超网络。该方法可以被应用于多种领域,例如社交网络、交通网络、生物网络等。通过对超网络的特性分析,可以更好地了解超网络的机理和性质。 ...

    河南省濮阳市第六中学六年级数学上册 3.7 探索与表达规律导学案1(无答案) 鲁教版五四制

    课堂小结环节,学生应该回顾自己在这节课中学到的主要概念和技巧,如发现规律的方法、运用规律解决问题的步骤,以及如何从图形中提取信息。作业布置则包括课后习题、基础园、缤纷园和智慧园的练习,确保学生能够巩固...

    Influence of hypersonic turbulence in plasma sheath on synthetic aperture radar imaging

    ### 小结 本研究通过对高超声速等离子鞘层湍流特性的理论分析和实验模拟,揭示了湍流对SAR成像性能的具体影响机制。这对于理解和改善高速飞行条件下雷达系统的成像能力至关重要。未来的研究还可以进一步探索不同...

    分级真空预压法加固吹填土过程中孔隙分布特征 (2012年)

    3. **孔隙分布特征分析**:为了更深入地理解加固过程中吹填土内部结构的变化,研究人员采用压汞试验结合分形理论的方法,对固结过程中不同阶段的孔隙分布特征进行了分析。结果表明,随着固结压力的增加,超大孔隙和...

    基于孔隙特征的天津滨海软粘土微观结构研究 (2010年)

    在此基础上系统地分析了样品SEMI图像在不同固结压力下孔隙结构参数的变化规律及运用平面分形维数DP对样品不同固结压力下土中孔隙分布状况的整体性、平均性进行了分析,且提出能够综合反映土中孔隙的大小、形态、分布...

    多媒体数据压缩与编码技术.pptx

    **4.9 本章小结**总结了多媒体数据压缩与编码技术的关键概念和方法,为理解和应用这些技术提供了基础。 总之,多媒体数据压缩与编码技术是现代信息技术的基石,广泛应用于数字媒体、网络传输、存储和播放等领域,其...

    北京版小学四年级语文上册全册教(学)案.doc

    每个课时都包含导入、新授、练习、小结等环节,使得学生在每一节课上都能够有明确的学习目标,确保了教学效果的高效性。 综上所述,北京版小学四年级语文上册的全册教案以科学的教学方法为基础,以提升学生语文综合...

    Matlab的实际应用设计(经典).docx

    第二种算法更为可靠,因为其迭代系数较小,能够有效控制误差累积。相比之下,第一种方法虽然起点更精确,但由于迭代系数较大,导致误差被逐渐放大。 #### 三、绘制Koch分形曲线 **问题背景** 文档中的第三个问题是...

Global site tag (gtag.js) - Google Analytics