分形之谢宾斯基三角形
本次课程是通过递归的方法来实现分形的操作。
递归做为一种算法在程序设计语言中广泛应用。 一个过程或函数在其定义或说明中有直接或间接调用自身的一种方法,它通常把一个大型复杂的问题层层转化为一个与原问题相似的规模较小的问题来求解,递归策略只需少量的程序就可描述出解题过程所需要的多次重复计算,大大地减少了程序的代码量。递归的能力在于用有限的语句来定义对象的无限集合。一般来说,递归需要有边界条件、递归前进段和递归返回段。当边界条件不满足时,递归前进;当边界条件满足时,递归返回。(以上参考专业资料)
用自己的话来说,如果实现一个目的,需要调用多次类似的方法,那么,我们就可以用到递归,而递归正确的重要条件是要有退出的条件,否则,递归将很有可能变成死递归,就像循环中的死循环一样。
那么,接下来是实现谢宾斯基三角形的递归方法:
public class Digui extends JFrame{
//private int count=0;
/**Digui类继承JFrame类
* @param args
*/
public static void main(String[] args) {
//实例化一个Digui对象,并设置相关属性
Digui di=new Digui();
di.setTitle("超级三角形");
di.setSize(500,500);
di.setLocationRelativeTo(null);
di.setDefaultCloseOperation(3);
di.setVisible(true);
//获取di对象的画布
Graphics g=di.getGraphics();
}
public void shower(double x1,double y1,double x2,double y2,double x3,double y3,Graphics g,int count){
//计数变量作用
count++;
//划线
g.drawLine((int)x1,(int)y1,(int)x2,(int)y2);
g.drawLine((int)x2,(int)y2,(int)x3,(int)y3); g.drawLine((int)x1,(int)y1,(int)x3,(int)y3);
double tempx1,tempy1,tempx2,tempy2,tempx3,tempy3;
tempx1=(double)((x1+x2)/2);
tempy1=(double)((y1+y2)/2);
tempx2=(double)((x1+x3)/2);
tempy2=(double)((y1+y3)/2);
tempx3=(double)((x3+x2)/2);
tempy3=(double)((y3+y2)/2);
//判断退出条件
if(count>10){return;}
shower(x1,y1,tempx1,tempy1,tempx2,tempy2,g,count);
shower(x2,y2,tempx3,tempy3,tempx1,tempy1,g,count); shower(x3,y3,tempx3,tempy3,tempx2,tempy2,g,count);
}
//重写重绘函数,调用递归函数
public void paint(Graphics g){
super.paint(g);
shower(250,50,50,400,450,400,g,0);
}
}
在编写该程序的过程中,我也遇到了很多问题。
其中最严重的问题就是计数常数count,在我首先编写该程序时,我将计数常数count定义成Digui类的一个属性,作为全局变量,但是,这样就会出现一些问题。例如,如果是这样,那么(此处将count从参数中略去)if(count>10){return;}
shower(x1,y1,tempx1,tempy1,tempx2,tempy2,g);
shower(x2,y2,tempx3,tempy3,tempx1,tempy1,g); shower(x3,y3,tempx3,tempy3,tempx2,tempy2,g);
此句话将只执行shower(x1,y1,tempx1,tempy1,tempx2,tempy2,g,count);中的有效部分,因为在执行完第一个函数后,count将返回10而不是返回0;而如果是作为函数中的参数,则能解决该问题。
- 大小: 22.6 KB
分享到:
相关推荐
在这个名为“turtle-递归美学-分形树-draw_branch.rar”的压缩包中,我们找到了一个名为`draw_branch.py`的文件,它展示了如何利用递归技术来创建美丽的分形树。分形是一种具有自相似性的几何形状,即无论在大尺度...
看的见的算法 7个经典...9-2 递归绘制基础-.mp4 9-3 Vicsek分形图的绘制.mp4 9-4 为分形绘制添加交互.mp4 9-5 Sierpinski 分形绘制.mp4 9-6 Sierpinski 三角形.mp4 9-7 编写Koch雪花分形.mp4 9-8 利用分形绘制树.mp4
东南大学 计算机图形学 作业一 分形算法,opengl实现!!
随着递归次数的增加,金字塔会变得更加精细,展现出更多的小三角形,形成更复杂的分形结构。此外,程序还允许用户调整旋转速度,这使得观察者可以从不同角度欣赏到金字塔的美丽形态,进一步体验分形的动态魅力。 ...
本项目标题“通过递归实现分形图形绘制”旨在教给初学者如何利用递归方法创建出美丽的分形图形。在VS2015环境下,你可以通过这个项目学习到如何设置和编译C++项目,并了解递归在实际编程中的应用。 首先,我们需要...
这通常包括选择合适的递归或循环结构,根据输入参数动态调整分支的长度、角度和颜色。 4. **图形绘制**:使用GDI(Graphics Device Interface)或GDI+库进行图形绘制。在每一层迭代中,根据当前分支的参数在画布上...
- **定义**: 递归模型是一种基于递归调用来构建分形图形的方法。 - **实例**: 例如,阶乘函数可以通过递归实现。递归模型同样适用于构建更复杂的分形图形,如**Cantor集**、**Koch曲线**等。 ##### 4.2 Cantor集 - ...
接下来,编写解析函数,根据文法规则进行递归地符号替换,直到达到预设的迭代次数或满足特定终止条件。在这个过程中,可以利用随机数生成器来增加生成结果的多样性,模拟自然环境中的随机性。 此外,为了在屏幕上...
分形树的生成通常涉及递归算法,能够创建出多层次、细腻的树形结构。在本项目中,我们将探讨如何使用JavaScript库P5.js来实现这种模拟。 P5.js 是一个开源的JavaScript库,旨在使艺术家、设计师、新手和任何人能够...
基础算法-递归-杨鑫20191010.pptx,基础算法-递归-杨鑫20191010.pptx,基础算法-递归-杨鑫20191010.pptx
标题“递归-----动态树实现递归”暗示我们将探讨如何利用递归方法来操作动态树。 首先,让我们理解什么是动态树。动态树,顾名思义,是一种可以随程序运行而改变结构的树形数据结构。与静态树不同,它的节点可以在...
数据结构:栈与递归--含分治与回溯.ppt
递归法是实现分形图形的一种常用方法,通过重复执行相同或相似的过程来生成复杂的结构。本实例是使用VC++(Visual C++)编程环境,通过递归算法来绘制分形图形。 在"VC 递归法图形分形算法.rar"这个压缩包中,我们...
在编程和计算机图形学领域,利用递归算法来绘制分形是一种常见且有趣的方法。本节将详细介绍如何使用递归来绘制 Cantor 集、Koch 曲线和 Sierpinski 三角形这三种经典的分形。 **Cantor 集** Cantor 集是最早被发现...
本资料“栈与递归--含分治与回溯”深入探讨了这两个主题,并将它们与分治策略和回溯法相结合,提供了一种高效解决问题的方法。 首先,栈是一种特殊的线性数据结构,遵循后进先出(LIFO)的原则。在计算机程序中,栈...
15_递归-谢尔宾斯基三角形 16_递归-汉诺塔问题 17_递归-零钱找零问题 18_递归-博物馆大盗问题 19_顺序查找 20_二分查找 21_冒泡排序和选择排序 22_插入排序 23_希尔排序 24_归并排序 25_快速排序 26_Hash散列&ADT ...
c++代码-递归-快速排序
### 计算器递归——C++ #### 概述 本文档介绍了一个使用C++编写的递归计算器程序。该程序能够处理基本的数学运算,包括加法、减法、乘法和除法,并通过递归的方式解析和计算表达式。 #### 主要知识点 ##### 1. *...
java语法 method 递归 马克-to-win java视频 方法 重载