学习了递归之后,可以实现很多有规律并且漂亮的图形,如:科赫曲线,漂亮的雪花,谢尔宾斯基三角形,毕哥拉斯树等等
[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); }
相关推荐
"奇妙的递归"这一主题,揭示了分形图形的核心特性——递归构造。递归是数学和计算机科学中的一个重要概念,它通过重复一个过程来解决问题或生成结构,每次迭代通常将问题规模减小或简化。 Koch曲线,是由瑞典数学家...
在这个“分形算法与程序设计——Java实现”主题中,我们可以看到一系列章节,涵盖了分形算法的基础到进阶内容。 1. **第2章JAVA**:通常会介绍分形的基础概念,包括分形的定义、分维数以及分形在不同领域的应用。这...
在"分形算法与程序设计——Visual Basic实现"这个主题中,我们可以深入探讨以下几个重要的知识点: 1. **分形基础**:首先,我们需要理解分形的基本概念,包括曼德勃罗集、 Julia集、科赫雪花、谢尔宾斯基三角形等...
标题中的“递归出来的美丽分形世界”暗示了我们将探讨的是计算机图形学中一个迷人的概念——分形,以及如何通过递归算法来创建它们。递归是一种在编程中广泛使用的概念,它允许函数或过程调用自身来解决复杂问题。在...
通过这个"分形算法与程序设计——Visual Basic实现"的项目,你可以学习到如何利用VB编程实现分形算法,以及如何将理论知识转化为实际图形。这不仅锻炼了编程技能,也加深了对分形几何的理解。在实践中,你可以尝试...
他的著作,如《分形——形、机遇和维数》和《自然界中的分形几何学》,不仅促进了分形几何学的发展,也为艺术家和科学家提供了灵感,使他们能够探索和表达自然界的复杂美。分形几何学的出现,深化了我们对现实世界中...
1. 曼德布罗特集:是最著名的分形之一,是复平面上所有不会无限逃离单位圆的复数点的集合。它的计算涉及到复数运算和迭代,可以用Delphi中的复数类型来实现。 2. 朱利亚集:与曼德布罗特集类似,但迭代中心点不固定...
分形几何的特征包括具有精细结构、不规则性、自相似性、通常具有高于拓扑维数的分形维数以及常常通过递归方法定义等。 分形几何的应用不仅限于数学领域,在物理、化学、生物、医学、地震学、地貌学、冶金学和材料...
在探讨计算机图形学领域中的一项重要分支——**分形几何**时,我们首先需要理解它所解决的问题背景及其核心概念。分形几何作为一种新兴的数学工具,旨在描述自然界中那些不规则且复杂的形状,这些形状无法通过传统的...
在本资源中,我们主要探讨的是计算物理的基础概念,特别是第二章的第一个主题——分形树。分形树是一种数学模型,它在物理学、几何学、生物学等多个领域都有广泛应用。理解分形树的基本原理和实现方法对于深入学习...
1. **递归算法**:在分形图的生成中,递归算法扮演了核心角色。通过定义一个基础形状,并重复应用自身来构建更复杂的结构。例如,曼德勃罗集就是通过复数平面上的迭代过程来生成的,每次迭代都是对前一次结果的简单...
《OpenGL实现的分形山脉——探索计算机图形学的奇妙世界》 在计算机科学领域,特别是图形学中,分形是一个引人入胜的话题。分形以其独特的自相似性与无尽的细节,为数字艺术和模拟自然景观提供了无限可能。在本次的...
在非线性科学的重要分支——分形的研究中,Matlab也发挥着重要的作用。 分形是自然界中普遍存在的复杂形态,它们在不同的尺度下展现出一定的自相似性,这种性质被称为标度不变性。分形几何学的提出可以追溯到1973年...
《分形世界——深入探索斯尔宾斯基三角垫片》 分形,这一源自数学的概念,已经在计算机图形学、艺术、自然科学等领域产生了深远影响。它揭示了自然界中看似无规律的复杂形状背后的规律性,展现出一种自相似的美学。...
"算法源码-分类与判别:RQA对离散时间序列进行递归图分析.zip"这个压缩包文件提供了一种用于处理离散时间序列的特殊算法——递归相关网络分析(Recurrence Quantification Analysis, 简称RQA)。在这里,我们将深入...
在这个“分形-雪花的MATLAB代码”项目中,我们有两个核心的MATLAB脚本文件——`KochIter.m`和`main.m`,它们共同用于生成 Koch 曲线,也就是我们常说的雪花。 `KochIter.m` 文件通常包含了实现Koch曲线迭代过程的...
### 分形背后的数学公式推导 #### 距离估计、光线跟踪原理及其实现细节 **光线跟踪**(Ray Tracing)是一种用于渲染三维图形的技术,它通过模拟光线的行为来计算图像中像素的颜色。这一过程涉及到多个核心概念,...
本课程针对零基础的学习者,旨在介绍如何利用Python进行基本的编程操作,并通过实际项目——分形树的绘制,深入理解编程概念。 分形树是一种在数学和艺术中常见的图形,它具有自相似性,即在不同尺度上重复自身的...