`
wojiaolongyinong
  • 浏览: 74085 次
  • 性别: Icon_minigender_1
  • 来自: 长沙
社区版块
存档分类
最新评论

毕达哥拉斯树

    博客分类:
  • Java
 
阅读更多

对计算机语言越熟悉越是感觉到基础部分的重要性,数理逻辑,数据结构,算法设计与分析,都是越嚼越有味道,这几天一直在看关于递归以及尽量使用递归做东西,发现越是熟悉,越是觉得递归程式的美妙,我们且跨过递归的薄弱部分不谈,就它的优点足以让我兴奋!下面是我用递归实现的两幅图片,一副是毕达哥拉斯树,就是满足毕达哥拉斯定理(勾股定理)的一个分形树,还有一颗自定义树:

 

毕达哥拉斯树:



 

 

以上就是毕达哥拉斯树,大家可以明显看出最底层的那三个正方形明显就是我们第一次学勾股定理时,介绍说毕达哥拉斯发现勾股定理的三块地板砖。。。。哈哈,以此类推,每个正方形如此下去便形成毕达哥拉斯树分形。

 

自定义树:



 

如上是自定义树,自定义树与毕达哥拉斯树的不同就在于刚才我们看的那三个正方形不再是30度,60度,90度了,而是形成等腰直角三角形,这个比上面的那个看起来要规整的多了吧,其实我们还可以调整角度的,我们可以加个拉杆,让其中的一个非直角改变,就会得到不一样的美妙效果了!这么美得图,你动心了吗!?

 

 

附录源代码:

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;

import javax.swing.ButtonGroup;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JRadioButton;

/**
 * 利用递归生成毕达哥拉斯树
 * @author LONG 2013-04-11
 * @version 1.0
 *
 */
public class BidaTree extends JFrame {
	private static final long serialVersionUID = 1L;
	private static final double PI = Math.PI;
	private JPanel jp = null;	//声明面板类型变量
	private Graphics gr = null;	//声明画布类型变量
	private int deepth = 0;		//用来记录递归画的深度
	private double x_start;		//定义初始点的x坐标
	private double y_start;		//定义初始点的y坐标
	private ButtonGroup bg = null;	//声明按钮组变量
	private double angle_1 = PI/6;
	
	/**
	 * 程序的入口
	 * @param args
	 */
	public static void main(String[] args){
		BidaTree bt = new BidaTree();	//声明并创建窗体对象
		bt.initUI();	//调用自身的方法初始化界面
	}
	
	/**
	 * 用来初始化界面的程序
	 */
	private void initUI(){
		this.setTitle("毕达哥拉斯树");
		this.setSize(1000,600);
		this.setLocationRelativeTo(null);
		this.setDefaultCloseOperation(3);
		
		//添加选项按钮来选择画的树的种类
		JRadioButton jr_bi = new JRadioButton("毕达哥拉斯树",true);
		jr_bi.setActionCommand("bi");
		jr_bi.setBackground(Color.WHITE);
		JRadioButton jr_zi = new JRadioButton("自定义树");
		jr_zi.setActionCommand("zi");
		jr_zi.setBackground(Color.WHITE);
		bg = new ButtonGroup();
		bg.add(jr_bi);
		bg.add(jr_zi);
		//添加一个重置按钮
		JButton jb_reset = new JButton("重置");
		jb_reset.setPreferredSize(new Dimension(70,25));
		
		jp = new JPanel();
		jp.setPreferredSize(new Dimension(1000,570));
		jp.setBackground(Color.WHITE);
		JPanel jp_tool = new JPanel();
		jp_tool.setPreferredSize(new Dimension(1000,30));
		jp_tool.setBackground(Color.WHITE);
		jp_tool.add(jr_bi);
		jp_tool.add(jr_zi);
		jp_tool.add(jb_reset);
		this.add(jp_tool,BorderLayout.NORTH);
		this.add(jp,BorderLayout.SOUTH);
		this.setResizable(false);
		this.setVisible(true);
		
		gr = jp.getGraphics();
		
		//给面板添加监听器
		jp.addMouseListener(new MouseAdapter(){	//为面板添加监听器
			public void mousePressed(MouseEvent e){	//当鼠标按下时,刷新面板
				x_start = e.getX();
				y_start = e.getY();
				deepth++;		//每次都是先增加deepth然后才会画的,所以初始化为0
				repaint();
			}
			public void mouseReleased(MouseEvent e){	//当鼠标松开时,执行画的动作
				String values = bg.getSelection().getActionCommand();
				if(values.equals("bi")){
					angle_1 = PI/6;
				}else if(values.equals("zi")){
					angle_1 = PI/4;
				}
				draw(x_start,y_start,x_start + 100,y_start,deepth);
			}
		});
		
		jb_reset.addMouseListener(new MouseAdapter(){
			public void mousePressed(MouseEvent e){
				repaint();
				deepth = 0;
			}
		});
	}
	
	/**
	 * 用来递归的方法画出毕达哥拉斯树的方法
	 * @param x	传入的x坐标
	 * @param y	传入的y坐标
	 */
	private void draw(double x1,double y1,double x2,double y2,int de){//传入正方形的两个顶点,以及递归的深度,和角度
		if(de > 0){	//来判断当递归深度大于0时执行
			double extent = getLength(x1,y1,x2,y2);	//用来得到两点之间的距离
			double angle = getAngle(x1,y1,x2,y2);
			double x3 = x1 + Math.cos(angle - PI/4)*Math.sqrt(2)*extent;
			double y3 = y1 + Math.sin(angle - PI/4)*Math.sqrt(2)*extent;
			double x4 = x1 + Math.cos(angle - PI/2)*extent;
			double y4 = y1 + Math.sin(angle - PI/2)*extent;
			int[] x = {(int)x1,(int)x2,(int)x3,(int)x4};
			int[] y = {(int)y1,(int)y2,(int)y3,(int)y4};
			gr.fillPolygon(x, y, 4);
			double temp_x = x4 + Math.cos(angle - angle_1)*Math.cos(angle_1)*extent;
			double temp_y = y4 + Math.sin(angle - angle_1)*Math.cos(angle_1)*extent;
			draw(x4,y4,temp_x,temp_y,de - 1);
			draw(temp_x,temp_y,x3,y3,de - 1);
		}
	}
	
	/**
	 * 用于计算两点之间的距离
	 * @param x0
	 * @param y0
	 * @param x2
	 * @param y2
	 * @return
	 */
	private double getLength(double x1,double y1,double x2,double y2){
		return Math.sqrt(Math.pow(x2 - x1, 2) + Math.pow(y2 - y1, 2));
	}
	
	/**
	 * 传入两个点,得到两点连线与x轴正方向的夹角,规定逆时针为负角度,
	 * 且以第一个点为起始点
	 * @param x0
	 * @param y0
	 * @param x2
	 * @param y2
	 * @return
	 */
	private double getAngle(double x1,double y1,double x2,double y2){
		double angle = 0.0;
		if(x1 == x2){	//说明两点在同一条竖直线上
			if(y1 > y2){
				angle = PI*3/2;
			}else if(y2 > y1){
				angle = PI/2;
			}
		}else{	//说明两点不在同一条竖直线上
			double temp_angle = Math.atan((y2 - y1)/(x2 - x1));
			if(x2 > x1){	//说明x2在x0点的左边
				angle = temp_angle;
			}else if(x2 < x1){	//说明x2在x0的右边
				angle = temp_angle + PI;
			}
		}
		return angle;	
	}
	
}

 

  • 大小: 66.4 KB
  • 大小: 59.7 KB
分享到:
评论

相关推荐

    毕达哥拉斯树与python代码

    毕达哥拉斯树与 Python 代码 毕达哥拉斯树是一种特殊的 fractal 图形,名称来自古希腊数学家毕达哥拉斯(Pythagoras)。它由无限个正方形组成,每个正方形的大小逐渐减小,形成一个复杂的树形结构。下面是关于...

    毕达哥拉斯树与python代码.docx

    毕达哥拉斯树与 Python 代码 毕达哥拉斯树是一种特殊的树形结构,它的每个节点都有两个子节点,每个子节点的长和宽都是一半父节点的长和宽,这种树结构可以用来模拟自然界中的树木生长。Python 是一种流行的编程...

    毕业设计MATLAB_毕达哥拉斯树.zip

    毕达哥拉斯树,又称为毕氏树或毕达哥拉斯三角树,是一种几何图形的分形构造,基于毕达哥拉斯定理。这个概念在MATLAB编程环境中被广泛用于教学和艺术创作,因为它可以展示分形的美丽和数学的规律性。在MATLAB中实现...

    html5 canvas毕达哥拉斯树生长动画特效

    毕达哥拉斯树(Pythagorean Tree)是一种几何艺术图案,基于毕达哥拉斯定理,通常由一系列等腰直角三角形组成,每层三角形的大小递减,形成对称的树状结构。将这种图案与动画结合,可以创建出引人入胜的生长动画特效...

    html5 canvas实现的鼠标响应式毕达哥拉斯树生长动画特效源码.zip

    在本例中,我们关注的是一个利用Canvas实现的鼠标响应式毕达哥拉斯树生长动画特效。毕达哥拉斯树是数学中一种有趣的几何结构,它通过反复应用毕达哥拉斯定理来生成分形图案。将这种视觉效果与HTML5 Canvas结合,可以...

    p5.js 毕达哥拉斯树的实现代码

    **毕达哥拉斯树**是一种基于数学几何图形的分形结构,通常由一系列不同大小的正方形组成,每个正方形的对角线是相邻较小正方形的边长。在p5.js库中,我们可以利用其丰富的图形绘制功能来实现毕达哥拉斯树的动画效果...

    毕业设计MATLAB_毕达哥拉斯树.zip.temp

    毕业设计MATLAB_毕达哥拉斯树.zip.temp

    毕达哥拉斯树:此函数生成毕达哥拉斯树并将绘图导出为 SVG 文件。-matlab开发

    毕达哥拉斯树是一种独特的几何结构,源自古希腊数学家毕达哥拉斯的名字,它是一种由正方形构建的分形图形。在毕达哥拉斯树中,每个正方形的对角线被分割成两个相等的部分,从而形成直角三角形。这些直角三角形的边长...

    matlab开发-Pythagorastree

    在MATLAB中开发毕达哥拉斯树是一种将数学与艺术结合的有趣实践。毕达哥拉斯树,又称毕氏树,是以古希腊数学家毕达哥拉斯的名字命名的,它展示了毕达哥拉斯定理的一个视觉表现。这个定理表明在直角三角形中,斜边(c...

    superkaleider:分形万花筒演示-分形毕达哥拉斯树+万花筒镜

    毕达哥拉斯树是一种递归结构,由一系列等比例的直角三角形组成,每一层的三角形都是上一层的放大或缩小版本。这种结构在视觉上展现了分形的特性,即无论放大多少倍,局部都与整体保持相似。在JavaScript中,通过迭代...

    HTML5勾股树植物生长动画特效.zip

    毕达哥拉斯树(也称为勾股树)的生长规律基于勾股定理,这是一种数学上有趣的分形结构。在动画中,每根新生成的树枝长度和角度都会受到上一级树枝的影响,形成层次分明、几何美感的树形结构。 开发者可能使用了一些...

    C语言写的汉诺塔递归单步的图形展示动画

    汉诺塔游戏是一种基于递归的经典问题,源自印度的一个古老传说。在这个游戏中,有三根柱子和一堆大小不一的圆盘,初始时所有圆盘都放在一根柱子(称为A柱)上,按照从大到小的顺序自上而下排列。...

    HTML5鼠标控制树生长方向形状动画特效

    毕达哥拉斯树,源于古希腊数学家毕达哥拉斯的名字,是一种几何结构,它基于勾股定理生成,即直角三角形的两个直角边的平方和等于斜边的平方。在编程领域,这种结构可以被用于生成自相似的分形图形,具有视觉上的吸引...

    PythagoreanForest:将来自随机森林的学习决策树模型显示为毕达哥拉斯树-matlab开发

    PythagoreanForest 是 Pythagorean Forest 的 MATLAB 实现,它将从随机森林中学习的决策树模型显示为 ... 毕达哥拉斯森林描述如下: PG Poličar,“用于分类和回归树可视化的勾股树”,卢布尔雅那大学,2016 年。

    递归出来的美丽分形世界

    毕达哥拉斯树源于古希腊数学家毕达哥拉斯的名字,它是由一系列等腰三角形构成的,每个新的三角形都是由两个较小的等腰三角形拼接而成。这个过程通过递归进行,每一步都产生两个更小的相似三角形,从而形成一棵分形树...

    Python 代码

    标题中的"Python 代码"指的是使用Python编程语言编写的程序或脚本。Python是一种高级、通用的编程语言,以其简洁的语法和强大的功能而受到广大开发者喜爱。在IT领域,Python广泛应用于数据处理、Web开发、人工智能、...

    (C#)分形动画应用程序

    本项目名为"(C#)分形动画应用程序",它通过C#实现了一种基于分形的动画,即“快乐的毕达哥拉斯树”。 毕达哥拉斯树是一种著名的分形图案,源于古希腊数学家毕达哥拉斯对比例和对称性的研究。在C#程序中,我们可以...

    python通过递归来创作一棵树

    在本示例中,我们将递归应用于创建一棵树的图形,使用Python的turtle模块,这是一个简单的图形库,它模拟了一个在画布上移动的海龟,通过它的路径留下线条。 首先,让我们深入理解递归的概念。递归是一种解决问题的...

Global site tag (gtag.js) - Google Analytics