Netjava project 寻找自然界的规律——递归分形
上一次我们用了简单的直线和迭代法画点的形式画出了美丽的图形,但是自然界除了有其神奇的特性,更多地是有规律可寻的。
今天我们就要用递归来画出可以自己控制的图片!
?
我们先来介绍一下递归,所谓递归,就是自己的方法中还在调用自己的方法。但是实际上我们可以不用这样来考虑,我们就可以认为在方法中又调用了一个方法,
这个方法和自己的方法的用途一样,只是带入的参数不同。
在递归中我们要注意几点:
1、注意退出条件的控制,递归是个死循环,没有退出条件就会一直递归下去,直至栈溢出,然后报错。
2、递归时注意变量的传递和值的变化。
3、我们还要关注进入时的参数值变化和返回时返回值的变化。
?
首先我们来画一个递归画直线的:
?
?
?
??
/** * 画雪花的方法 * * @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);}}?
?