逻辑类似于生成科赫分形。它是这样的:
- 画一条水平直线。
- 将线分成 3 段。
- 将中间段向上移动一个段的大小。
- 对每个段重复。
所以,我们的函数基本上应该尝试画这条线:
_________
| |
| |
| |
_________| |_________
对每条水平线依次重复该过程。
我能想到的一种简单方法是从直线开始。然后在每次迭代中擦除行的中间并进行上移(您可以在黑线的顶部画一条白线)。
因此,伪代码将是这样的:
// Pseudocode:
fractal (x_start,x_end, y) {
// first simply draw a straight line:
line(x_start,y,x_end,y);
// divide the line into 3 and push the middle up
length = x_end-x_start;
segment_length = length/3;
x2 = x_start+segment_length;
x3 = x_start+segment_length*2;
y2 = y-segment_length;
erase_line(x2,y,x3,y);
line(x2,y,x2,y2); // up
line(x2,y2,x3,y2); // accross
line(x3,y2,x3,y); // down
// now repeat for each segment
fractal(x_start,y,x2,y);
fractal(x2,y2,x3,y2);
fractal(x3,y,x_end,y);
}
这就是基本的工作功能。请注意,它不会停止递归,因此上述函数将无限执行(或直到内存不足)。所以首先要做的是添加递归限制:
// Pseudocode:
fractal (x_start,x_end, y, limit) {
//
// same content as above except the last 3 lines
//
limit --;
if (limit) {
fractal(x_start,y,x2,y,limit);
fractal(x2,y2,x3,y2,limit);
fractal(x3,y,x_end,y,limit);
}
}
这应该是一个很好的起点。
您还可以进行其他优化。例如,您实际上不需要在开始时绘制直线,因为每次迭代基本上都会再次绘制它。您只需要在递归的极限处绘制水平线。这意味着您不需要擦除未绘制的线条。但我将把它的实现留给读者作为练习。