Python+Turtle实现绘制勾股树
Leleprogrammer 人气:0这次,我们用Turtle模块结合三角函数,绘制出这样的勾股树:
首先,导入模块
from turtle import * from math import sin,cos,radians
定义勾股数每次旋转的度数
angle1=70 angle2=90-angle1
定义tree函数,绘制正方形并记录要生成的新的正方形的坐标,计算出新的正方形的度数和边长并绘制,这里采用递归的方式
ln表示边长,mode表示当前正方形是在前一个正方形的左边或右边,h表示朝向,p表示坐标
def tree(ln,mode="left",h=90,p=(0,0)): pu() seth(h) goto(p) if ln>1: pd() for i in range(4): if i==1 and mode=="left": pos1=pos() if i==2 and mode=="left": pos2=pos() if i==2 and mode=="right": pos1=pos() if i==3 and mode=="right": pos2=pos() fd(ln) right(90) h=heading() tree(ln*cos(radians(angle1)),"left",h+angle1 if mode=="left" else h-angle1,pos1) tree(ln*cos(radians(angle2)),"right",h+90-angle2 if mode=="left" else h-angle2,pos2)
在主程序中设置速度,因为递归很占内存,所以绘制速度会卡顿减缓,所以这里加速1000倍,设置无延迟,笔触颜色为绿色,笔触大小2,抬笔,设置方向,并开始递归,最后隐藏画布并保持窗口显示
speed(0) tracer(1000) delay(0) color("green") pensize(2) pu() seth(90) tree(70,p=(-100,-300)) ht() done()
最终代码:
from turtle import * from math import sin,cos,radians angle1=45 # 自行修改 angle2=90-angle1 def tree(ln,mode="left",h=90,p=(0,0)): pu() seth(h) goto(p) if ln>1: pd() for i in range(4): if i==1 and mode=="left": pos1=pos() if i==2 and mode=="left": pos2=pos() if i==2 and mode=="right": pos1=pos() if i==3 and mode=="right": pos2=pos() fd(ln) right(90) h=heading() tree(ln*cos(radians(angle1)),"left",h+angle1 if mode=="left" else h-angle1,pos1) tree(ln*cos(radians(angle2)),"right",h+90-angle2 if mode=="left" else h-angle2,pos2) speed(0) tracer(1000) delay(0) color("green") pensize(2) pu() seth(90) tree(70,p=(-100,-300)) ht() done()
加载全部内容