上一次我们用了简单的直线和迭代法画点的形式画出了美丽的图形,但是自然界除了有其神奇的特性,更多地是有规律可寻的。
今天我们就要用递归来画出可以自己控制的图片!
我们先来介绍一下递归,所谓递归,就是自己的方法中还在调用自己的方法。但是实际上我们可以不用这样来考虑,我们就可以认为在方法中又调用了一个方法,
这个方法和自己的方法的用途一样,只是带入的参数不同。
在递归中我们要注意几点:
1、注意退出条件的控制,递归是个死循环,没有退出条件就会一直递归下去,直至栈溢出,然后报错。
2、递归时注意变量的传递和值的变化。
3、我们还要关注进入时的参数值变化和返回时返回值的变化。
首先我们来画一个递归画直线的:
/** * 递归画直线的方法 * @param g图形对象 * @param x1第一个点横坐标 * @param y1第一个点纵坐标 * @param x2第二个点横坐标 * @param y2第二个点纵坐标 * @param count递归次数 */ public void drawline(Graphics g, int x1, int y1, int x2, int y2, int count) { count--; //如果count等于0就返回 if (count < 1) { return; } g.drawLine(x1, y1, x2, y2);//画线 drawline(g, x1, y1 + 50, (int) (2.0 / 3 * x1 + 1.0 / 3 * x2), y2 + 50, count);//递归画左边直线 drawline(g, x2, y2 + 50, (int) (2.0 / 3 * x2 + 1.0 / 3 * x1), y1 + 50, count);//递归画右边直线 }
正方形:
/** * 画正方形的方法 * @param g图形对象 * @param x正方形中心横坐标 * @param y正方形中心纵坐标 * @param r正方形边长的一半 * @param count迭代次数 */ public void drawsquare(Graphics g, int x, int y, int r, int count) { count--; //如果count为0,返回 if (count < 1) { return; } g.fillRect(x - r, y - r, 2 * r, 2 * r);//画正方形 //迭代画周围的8个小正方形 drawsquare(g, x - (int) (r * 2.5), y - (int) (r * 2.5), r / 3, count); drawsquare(g, x, y - (int) (r * 2.5), r / 3, count); drawsquare(g, x + (int) (r * 2.5), y - (int) (r * 2.5), r / 3, count); drawsquare(g, x - (int) (r * 2.5), y, r / 3, count); drawsquare(g, x + (int) (r * 2.5), y, r / 3, count); drawsquare(g, x - (int) (r * 2.5), y + (int) (r * 2.5), r / 3, count); drawsquare(g, x, y + (int) (r * 2.5), r / 3, count); drawsquare(g, x + (int) (r * 2.5), y + (int) (r * 2.5), r / 3, count); }
三角形:
/** * 画三角形 * @param g图形对象 * @param x1上边的横坐标 * @param y1上边的纵坐标 * @param x2左边的横坐标 * @param y2左边的纵坐标 * @param x3右边的横坐标 * @param y3右边的纵坐标 * @param count画三角形的迭代次数 */ public void drawtriangle(Graphics g, int x1, int y1, int x2, int y2, int x3, int y3, int count) { count--;//count减一 if (count < 1)//如果count小于1,返回 { return; } //画线 g.drawLine(x1, y1, x2, y2); g.drawLine(x1, y1, x3, y3); g.drawLine(x3, y3, x2, y2); //画中间的线 drawtriangle(g, (x1 + x2) / 2, (y1 + y2) / 2, x2, y2, (x2 + x3) / 2, (y2 + y3) / 2, count); drawtriangle(g, x1, y1, (x1 + x2) / 2, (y1 + y2) / 2, (x1 + x3) / 2, (y1 + y3) / 2, count); drawtriangle(g, (x1 + x3) / 2, (y1 + y3) / 2, x3, y3, (x2 + x3) / 2, (y2 + y3) / 2, count); }
Koch雪花:
/** * 画雪花的方法 * * @param g图形对象 * @param x1左边点的横坐标 * @param y1左边点的纵坐标 * @param x2右边点的横坐标 * @param y2右边点的纵坐标 * @param count画线的次数 */ public void drawkoch(Graphics g, double x1, double y1, double x2, double y2, int count) { if (count <= 1) { g.drawLine((int) x1, (int) y1, (int) x2, (int) y2);// 画线 } else { double x3 = (2 * x1 + x2) / 3;// 第一个三等份点的x坐标 double y3 = (2 * y1 + y2) / 3;// 第一个三等份点的y坐标 double x4 = (x1 + 2 * x2) / 3;// 第二个三等份点的x坐标 double y4 = (y1 + 2 * y2) / 3;// 第二个三等份点的y坐标 double k = (x1 - x2) * (y1 - y2);// 线的斜率 double x5 = x1, y5 = y1;// 第一个三等份点的x坐标 if (y3 == y4)// 直线 { x5 = (x3 + x4) / 2; y5 = y3 - (x4 - x3) * Math.sqrt(3) / 2; } else if (k < 0)// 左斜线 { x5 = x1; y5 = y4; } else if (k > 0)// 右斜线 { x5 = x2; y5 = y3; } if (x3 == x4) // 如果斜线为竖线 { x5 = x3; y5 = y3; } // 画尖端的左面那条线 drawkoch(g, x3, y3, x5, y5, count - 1); // 画尖端的右面那条线 drawkoch(g, x5, y5, x4, y4, count - 1); // 画左边那条直线 drawkoch(g, x1, y1, x3, y3, count - 1); // 画右边那条直线 drawkoch(g, x4, y4, x2, y2, count - 1); } }
相关推荐
算法思想——递归与分治 算法思想——递归与分治
通过递归实现分形图形绘制 。代码简单直观,适合初学者参考学习。 使用VS2015重新编译,可直接运行
分形树的递归算法,模拟生成树,支持选择树叶形状,递归次数,树干高度、树枝长度缩小比例、叶子颜色、枝干偏移角度等。 用的是DELPHI7写的。
采用递归算法编程实现下列分形树 提供界面允许用户输入分形树迭代次数,由程序绘制树形分形体并动态显示分形树生长过程,并且实现分形树的摇曳显示
前端开发——递归函数.docx
利用分形算法,模拟出具有动画效果的分形树
递归分形,java课程,一个小程序关于树形的动态演示。是两个源文件在一个.txt文件上需要重新复制黏贴建立两个java文件再使用。
设计递归子程序算法,处理各个非终结符。在语法分析的过程中以缩进格式打印语法分析树。将实现词法分析函数scan( )作为子程序,进行测试。
这个是通过vc6.0运行出来的分形树,只是一个分形结构图,参考的是一本书上的代码,一根竹竿生长出两个侧干,实现的递归算法。。
汉诺塔——经典的递归 *实现移动函数 *递归实现汉诺塔函数
c语言分治法求众数重数-五大常见算法策略之——递归与分治策略,算法数据结构 五大常用算法
该料详细介绍了算法中的一种典型思想———递归与分治
算法设计,PPT,算法分析与设计,老师多年积累,很详细全面的算法讲解——递归,分治
Java SE程序 递归Java SE程序 递归Java SE程序 递归Java SE程序 递归Java SE程序 递归Java SE程序 递归Java SE程序 递归Java SE程序 递归Java SE程序 递归Java SE程序 递归Java SE程序 递归Java SE程序 递归Java SE...
C语言中递归是重中之重的部分,多数用于求解N!等含有迭代性质的问题,此文档详细介绍了递归算法,实用。
opengl,L系统递归算法实现分形树,一个不错的例子,可以作为初学者参考使用
这是编译原理语法分析代码,递归下降法,内附实验报告,仅供大家参考
全排列算法有两个比较常见的实现:递归排列和字典序排列。 (1)递归实现 从集合中依次选出每一个元素,作为排列的第一个元素,然后对剩余的元素进行全排列,如此递归处理,从而得到所有元素的全排列。 (2)字典...
vs2010下运行编写,使用了STL栈,实现了基本的插入、删除、计算深度、查找,主要是遍历,包括递归遍历,以及非递归的前序中序后序遍历,每个函数都有测试用例,如果存在错误,请在给我留言。
数据结构中二叉树遍历,两种方法,递归与非递归,vs2008测试通过。