Intoweb

我们上期已经知道了勾股数——符合勾股定理(a2+b2=c2)的一组数字,将它图形化表达如图1所示。

以勾股定理图为基础,以两个较小的正方形(a和b)为基础,继续按勾股定理生长,又能画出下一代的勾股定理图,如此循环画下去,最终得到一棵完全由勾股定理图组成的树状图形,称之为“勾股树”,再恰当不过(如图2)。

由于图中的一个部分和它的整体或者其他部分都十分相似,因而被称为分形图,分形图内任何一个相对独立的部分,在一定程度上都是整体的再现和缩影。这就是分形图的自相似的特性。所以我们以前绘制过的谢尔宾斯基三角形也是一种分形图(如图3)。

用Scratch画勾股树

我们用Scratch来画勾股树。

1. 定义自制积木“勾股树(边长)”(图4)。

2. 以正方形的左下角为起点开始画出一个大正方形c,并多画一条边,循环次数从普通方形的4次变为5次,在方形的左上角终止,作为下一个正方形b的起点。

3. 左转120°,并用勾股树积木画出正方形b,此处使用了递归——循环中引用了自身。根据勾股定理计算,b的边长以大正方形边长c作为三角形的斜边(b=c×cos30°)(如图5)。

4. 移动到正方形b的右下角,右转90°。以此为起点用勾股树积木绘制正方形a,根据勾股定理计算,a的边长以大正方形边长c作为三角形的斜边,(a=c×cos60°)(如图6)。

5. 移动到正方形b的左上角,以正方形b为大正方形开始绘制出下一代3个正方形。

6. 由于用到了递归,为了程序的正常运行,必须给循环一个出口。以最小正方形的边长作为判断条件,当边长小于5时跳出循环。用“如果…那幺”积木和“停止这个脚本”组合完成条件判断和终止循环。

7. 自定义积木程序(如图7)。

8. 引用自定义积木,设定开始位置和第一个正方形边长(如图8)。

9. 程序运行结果如图9,点击“编辑—打开加速模式”,可以快速画完图形(如图9)。

10. 图9绘制的图形是30度60度角的直角三角形。想要绘制等腰直角三角形的勾股树只要改变小正方形边长为(b=c×cos45°),旋转角度变为135°和45°(如图10)。你也可以通过改变勾股定理图中直角三角形两个锐角大小构建不同形状的勾股树(详细代码可扫码下载)。

用Python画勾股树

Scratch的画笔没有填色功能,所以看起来比较简陋,使用Python的turtle小海龟库绘制图形可以填色,绘制出来的勾股树更好看(如图2)。但是绘制速度远不及使用加速模式的Scratch。

1. 本例用到了turtle的绘图和填色功能;math的cos函数和 radians函数(角度转弧度);用random产生随机数,用于方块的随机颜色。

2. 具体算法原理与Scratch方法一致。

3. 定义绘制勾股树的函数“draw(a):”。

4. 定义出口条件“if a > 5:”。

5. 设置随机的rgb颜色。

6. 绘图使用填充状态“begin_fill()”。

7. 和刚才绘制正方形一样需要循环5次“for i in range(5):”。

8. 由于Python的math库的cos(X)函数是以弧度制求X的余弦。我们在Scratch中的(a×cos30°)需要用radians将30度转化为30弧度代入计算才能获得正确结果。

所以绘制方形语句为“draw(a * cos(radians(30)))”。

9. 小乌龟的具体绘制路径和Scratch相同。

10. mode(‘logo),表示初始方向是向上(北)。将logo改为standard则是向右(东)。

11. speed(0),设定移动速度,0-10。0已经是最快了,但是还是挺慢的。

12. done(),写在程序最后一行,避免画完图形就自动关闭(如图11)。