`
徐静1570453590
  • 浏览: 9690 次
  • 性别: Icon_minigender_2
  • 来自: 杭州
最近访客 更多访客>>
社区版块
存档分类
最新评论

分形之——递归

阅读更多

学习了递归之后,可以实现很多有规律并且漂亮的图形,如:科赫曲线,漂亮的雪花,谢尔宾斯基三角形,毕哥拉斯树等等
[img]http://dl2.iteye.com/upload/attachment/0086/2524/5cd6e8d4-b0a8-3251-ba88-43691153f658.png" alt="[/img]

[img]http://dl2.iteye.com/upload/attachment/0086/2526/88529b66-6d97-303a-86d3-27447ecd5530.png" alt="[/img]

[img]http://dl2.iteye.com/upload/attachment/0086/2528/9c57617c-289b-3664-ac7b-1d092196ebf6.png" alt="[/img]

[img]http://dl2.iteye.com/upload/attachment/0086/2530/e602ac67-b1be-3ae8-a649-8918dca1f8e8.png" alt="[/img]

[img]http://dl2.iteye.com/upload/attachment/0086/2533/9f2dd30f-5509-3e6f-b068-cba768b117ee.png" alt="[/img]

各个图形相应代码如下:

package digui; 
import java.awt.Dimension; 
import java.awt.FlowLayout; 
import java.awt.event.ActionListener; 

import javax.swing.JButton; 
import javax.swing.JFrame; 

public class Arts extends JFrame{ 
public static void main(String[] args) { 
Arts sf = new Arts(); 
sf.InitUI(); 
} 

private void InitUI() { 
this.setSize(new Dimension(700, 700)); 
this.setTitle("picture"); 
this.setDefaultCloseOperation(3); 
this.setLayout(new FlowLayout()); 
this.setLocationRelativeTo(null); 
       String S[]={"Kehe","Line","square","xtriangle"}; 
       For(int i=0;i 



[code="java"]package Kehe; 

import java.awt.Color; 
import java.awt.Graphics; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 

import javax.swing.JFrame; 

public class SListener implements ActionListener { 

private JFrame jf; 
int count; 
int PI; 

public SListener(JFrame jf) { 
this.jf = jf; 
} 

public void actionPerformed(ActionEvent e) { 
String v = e.getActionCommand(); 
Graphics g = jf.getGraphics(); 
Color c = new Color(230, 20, 230); 
g.setColor(c); 
if (v.equals("Kehe")) { 
Draw(8, 150, 500, 550, 500, g); 
} 

public void Draw(int count, double x1, double y1, double x2, double y2, 
Graphics g) { 

if (count == 0) { 
System.out.println("" + x1 + y1 + "" + x2 + "" + y2 + ""); 
g.drawLine((int) x1, (int) y1, (int) x2, (int) y2); 
} else { 
// 取最接近的数 
double x3 = Math.round(x1 + (x2 - x1) / 3.0); 
double y3 = Math.round(y1 + (y2 - y1) / 3.0); 
double x4 = Math.round(2 * (x2 - x1) / 3 + x1); 
double y4 = Math.round(y1 - 2 * (y1 - y2) / 3); 
double l = Math.sqrt((x4 - x3) * (x4 - x3) + (y4 - y3) * (y4 - y3)); 
double angle = getAngle(x1, y1, x2, y2); 
double x5 = Math.round(x3 + l * Math.cos(angle)); 
double y5 = Math.round(y3 - l * Math.sin(angle)); 
Draw(count - 1, x1, y1, x3, y3, g); 
Draw(count - 1, x3, y3, x5, y5, g); 
Draw(count - 1, x5, y5, x4, y4, g); 
Draw(count - 1, x4, y4, x2, y2, g); 

} 
} 

 
谢尔宾斯基三角形代码如下:

package Kehe; 

import java.awt.Color; 
import java.awt.Graphics; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 

import javax.swing.JFrame; 

public class SListener implements ActionListener { 

private JFrame jf; 
int count; 
int PI; 

public SListener(JFrame jf) { 
this.jf = jf; 
} 

public void actionPerformed(ActionEvent e) { 
String v = e.getActionCommand(); 
Graphics g = jf.getGraphics(); 
Color c = new Color(230, 20, 230); 
g.setColor(c); 
if (v.equals(""xtriangle"")) { 
                xtriangle(g,100,400,400,4);} 
public void xtriangle(Graphics g, int x1, int x2, int y1, int count) { 
g.setColor(Color.blue); 
if (count == 0) 
return; 
/**  
     * 定义绘制谢尔宾斯基三角形的方法  
     * @param x1 三角形左下角横坐标  
     * @param x2 三角形右下角横坐标  
     * @param y1 三角形左下角纵坐标  
     * @param count 递归过程中的计数器  
     */  

// 画最大的三角形,x1,x2,y1,y2,z1,z2分别表示最大的三角形的三个顶点坐标 
int y2 = x2; 
g.drawLine(x1, x2, y1, y2); 
int z2 = (int) (x2 - Math.sqrt(3) * Math.abs(y1 - x1) / 2); 
int z1 = (int) (x1 / 2 + y1 / 2); 
g.drawLine(z1, z2, x1, x2); 
g.drawLine(z1, z2, y1, y2); 
// a1,a2,b1,b2,c1,c2分别表示内部第一个三角形的三个顶点 
int a1 = x1 / 2 + z1 / 2; 
int a2 = x2 / 2 + z2 / 2; 
int b1 = z1 / 2 + y1 / 2; 
int b2 = z2 / 2 + y2 / 2; 
int c1 = x1 / 2 + y1 / 2; 
int c2 = x2; 

// 内部第一个三角形 
g.drawLine(a1, a2, b1, b2); 
g.drawLine(a1, a2, c1, c2); 
g.drawLine(b1, b2, c1, c2); 

// 用m1,m2,m3,m4表示新增上边的小三角形的底边 
// 用n1,n2,n3,n4表示新增左边的小三角形的底边 
// 用p1,p2,p3,p4表示新增右边的小三角形的底边 
int m1 = a1; 
int m2 = a2; 
int m3 = b1; 
int n1 = x1; 
int n2 = x2; 
int n3 = z1; 
int p1 = c1; 
int p2 = c2; 
int p3 = y1; 

xtriangle(g, m1, m2, m3, count - 1); 
xtriangle(g, n1, n2, n3, count - 1); 
xtriangle(g, p1, p2, p3, count - 1); 

} 
} 

 
雪花的代码如下:

package digui; 
/** 
* 雪花 
*/ 

import java.awt.event.MouseListener; 
import java.awt.Color; 
import java.awt.Graphics; 
import java.awt.event.MouseEvent; 

public class IceListener implements MouseListener { 
Graphics g; 
int depth = 10; 

public IceListener(Graphics g) { 
this.g = g; 
} 

public void mouseClicked(MouseEvent e) { 
digui1(100, 200, 600, 200, this.depth); 
digui2(100, 200, 350, 633, this.depth); 
digui3(600, 200, 350, 633, this.depth); 
} 

public void mouseEntered(MouseEvent arg0) { 

} 

public void mouseExited(MouseEvent arg0) { 

} 

public void mousePressed(MouseEvent arg0) { 

} 

public void mouseReleased(MouseEvent arg0) { 

} 

// 第一个递归函数 
public void digui1(double x1, double y1, double x2, double y2, int depth) { 
g.setColor(Color.blue); 
if (depth  0) { 
x5 = x2; 
y5 = y3; 
} 
} 
digui1(x1, y1, x3, y3, depth - 1); 
digui1(x3, y3, x5, y5, depth - 1); 
digui1(x5, y5, x4, y4, depth - 1); 
digui1(x4, y4, x2, y2, depth - 1); 
} 
} 

// 第二个递归函数 
public void digui2(double x1, double y1, double x2, double y2, int depth) { 
g.setColor(Color.red); 
if (depth  0) { 
x5 = x1; 
y5 = y4; 
} 
} 
digui2(x1, y1, x3, y3, depth - 1); 
digui2(x3, y3, x5, y5, depth - 1); 
digui2(x5, y5, x4, y4, depth - 1); 
digui2(x4, y4, x2, y2, depth - 1); 
} 
} 

public void digui3(double x1, double y1, double x2, double y2, int depth) { 
g.setColor(Color.yellow); 
if (depth  0) { 
x5 = x2; 
y5 = y3; 
} 
} 
digui3(x1, y1, x3, y3, depth - 1); 
digui3(x3, y3, x5, y5, depth - 1); 
digui3(x5, y5, x4, y4, depth - 1); 
digui3(x4, y4, x2, y2, depth - 1); 
} 
} 

 
等分线的代码:

public void Draw1(Graphics g, int x1, int y1, int x2, int y2, int count) { 
if (count == 0) 
return; 
g.drawLine(x1, y1, x2, y2); 
// 递归定义变量时要为局部变量 
int x3, y3, x4, y4, x5, y5, x6, y6; 
int gap = 50; 
x3 = x1 + gap; 
y3 = y1; 
x4 = gap + x2; 
y4 = (y2 - y1) / 3 + y1; 
x5 = x1 + gap; 
y5 = y2 - 1 * (y2 - y1) / 3; 
x6 = x2 + gap; 
y6 = y2; 
g.drawLine(x3, y3, x4, y4); 
g.drawLine(x5, y5, x6, y6); 
// 调用自身方法 
Draw1(g, x3, y3, x4, y4, count - 1); 
Draw1(g, x5, y5, x6, y6, count - 1); 

} 



 


 

  • 大小: 66.2 KB
  • 大小: 4.6 KB
  • 大小: 4.6 KB
  • 大小: 61.5 KB
  • 大小: 6.9 KB
1
2
分享到:
评论

相关推荐

    分形图案 奇妙的递归

    "奇妙的递归"这一主题,揭示了分形图形的核心特性——递归构造。递归是数学和计算机科学中的一个重要概念,它通过重复一个过程来解决问题或生成结构,每次迭代通常将问题规模减小或简化。 Koch曲线,是由瑞典数学家...

    分形算法与程序设计——Java实现

    在这个“分形算法与程序设计——Java实现”主题中,我们可以看到一系列章节,涵盖了分形算法的基础到进阶内容。 1. **第2章JAVA**:通常会介绍分形的基础概念,包括分形的定义、分维数以及分形在不同领域的应用。这...

    分形算法与程序设计——Visual Basic实现--光盘文件

    在"分形算法与程序设计——Visual Basic实现"这个主题中,我们可以深入探讨以下几个重要的知识点: 1. **分形基础**:首先,我们需要理解分形的基本概念,包括曼德勃罗集、 Julia集、科赫雪花、谢尔宾斯基三角形等...

    递归出来的美丽分形世界

    标题中的“递归出来的美丽分形世界”暗示了我们将探讨的是计算机图形学中一个迷人的概念——分形,以及如何通过递归算法来创建它们。递归是一种在编程中广泛使用的概念,它允许函数或过程调用自身来解决复杂问题。在...

    分形算法与程序设计——Visual Basic实现.rar

    通过这个"分形算法与程序设计——Visual Basic实现"的项目,你可以学习到如何利用VB编程实现分形算法,以及如何将理论知识转化为实际图形。这不仅锻炼了编程技能,也加深了对分形几何的理解。在实践中,你可以尝试...

    分形几何学1

    他的著作,如《分形——形、机遇和维数》和《自然界中的分形几何学》,不仅促进了分形几何学的发展,也为艺术家和科学家提供了灵感,使他们能够探索和表达自然界的复杂美。分形几何学的出现,深化了我们对现实世界中...

    分形算法与程序设计Delphi实现

    1. 曼德布罗特集:是最著名的分形之一,是复平面上所有不会无限逃离单位圆的复数点的集合。它的计算涉及到复数运算和迭代,可以用Delphi中的复数类型来实现。 2. 朱利亚集:与曼德布罗特集类似,但迭代中心点不固定...

    MATLAB与数学教学——以分形几何为例.pdf

    分形几何的特征包括具有精细结构、不规则性、自相似性、通常具有高于拓扑维数的分形维数以及常常通过递归方法定义等。 分形几何的应用不仅限于数学领域,在物理、化学、生物、医学、地震学、地貌学、冶金学和材料...

    计算机图形学之-分形几何.ppt

    在探讨计算机图形学领域中的一项重要分支——**分形几何**时,我们首先需要理解它所解决的问题背景及其核心概念。分形几何作为一种新兴的数学工具,旨在描述自然界中那些不规则且复杂的形状,这些形状无法通过传统的...

    book2_1_1_计算物理基础_第二章_分形树_

    在本资源中,我们主要探讨的是计算物理的基础概念,特别是第二章的第一个主题——分形树。分形树是一种数学模型,它在物理学、几何学、生物学等多个领域都有广泛应用。理解分形树的基本原理和实现方法对于深入学习...

    分形算法与程序设计ppt

    1. **递归算法**:在分形图的生成中,递归算法扮演了核心角色。通过定义一个基础形状,并重复应用自身来构建更复杂的结构。例如,曼德勃罗集就是通过复数平面上的迭代过程来生成的,每次迭代都是对前一次结果的简单...

    FractalMountain.zip

    《OpenGL实现的分形山脉——探索计算机图形学的奇妙世界》 在计算机科学领域,特别是图形学中,分形是一个引人入胜的话题。分形以其独特的自相似性与无尽的细节,为数字艺术和模拟自然景观提供了无限可能。在本次的...

    Matlab在分形中的应用研究.pdf

    在非线性科学的重要分支——分形的研究中,Matlab也发挥着重要的作用。 分形是自然界中普遍存在的复杂形态,它们在不同的尺度下展现出一定的自相似性,这种性质被称为标度不变性。分形几何学的提出可以追溯到1973年...

    fenxing.rar_fractal

    《分形世界——深入探索斯尔宾斯基三角垫片》 分形,这一源自数学的概念,已经在计算机图形学、艺术、自然科学等领域产生了深远影响。它揭示了自然界中看似无规律的复杂形状背后的规律性,展现出一种自相似的美学。...

    算法源码-分类与判别:RQA对离散时间序列进行递归图分析.zip

    "算法源码-分类与判别:RQA对离散时间序列进行递归图分析.zip"这个压缩包文件提供了一种用于处理离散时间序列的特殊算法——递归相关网络分析(Recurrence Quantification Analysis, 简称RQA)。在这里,我们将深入...

    分形-雪花的MATLAB代码

    在这个“分形-雪花的MATLAB代码”项目中,我们有两个核心的MATLAB脚本文件——`KochIter.m`和`main.m`,它们共同用于生成 Koch 曲线,也就是我们常说的雪花。 `KochIter.m` 文件通常包含了实现Koch曲线迭代过程的...

    分形背后的数学公式推导

    ### 分形背后的数学公式推导 #### 距离估计、光线跟踪原理及其实现细节 **光线跟踪**(Ray Tracing)是一种用于渲染三维图形的技术,它通过模拟光线的行为来计算图像中像素的颜色。这一过程涉及到多个核心概念,...

    lect03_分形树的绘制_python_

    本课程针对零基础的学习者,旨在介绍如何利用Python进行基本的编程操作,并通过实际项目——分形树的绘制,深入理解编程概念。 分形树是一种在数学和艺术中常见的图形,它具有自相似性,即在不同尺度上重复自身的...

Global site tag (gtag.js) - Google Analytics