上一篇的教程中说到了如何画一条旋转的带色的直线,其中已经把如何用turtle绘图所需的全部元素讲的比较细致了,也就是:配置,基本图形,色彩和动画
今天这篇,我们再延伸下直线,给一个教程,讲一下如何用turtle画一个带辐条的多边形,它的基本形状是这样的:
五边形
六边形
360边形
看起来是不是还蛮酷。
注意多边形的顶点都同中心点相连接,也就是有辐条。
下面请开始表演,以画五边形为例。
首先,我们从数学和编程的角度把复杂的问题进行分解。
五边形是由五个同心的三角形组成的,中心角是72°。
N边形是由N个同心的三角形组成的,中心角是360/N°。
这是数学规律,小学的奥数应该讲过这个,手动狗头。
到这里,我们的问题就变成了如何画这个三角形,并且我们希望它的角度可变。
画三角形有2种画法:
三角形画法
鼠标指示的位置是中心点,从中心点出去的两条边是等边。
A方法的顺序是:1等边 - 2底边 - 3另一条等边
B方法的顺序是:1等边 - 2另一条等边 - 3底边
毫无疑问,从编程的角度来讲,B方法更简单,A方法至少需要3-4次数学计算才能算出来,而且还要处理误差,太南了。
对于B方法,编程的思路就比较简单:
- 从(0,0)出发,走length长度,结束点记为(x,y)
- 从(0,0)出发,在1基础上转动72°(五边形),走length长度
- 走到(x,y)点,结束
我们可以看到这个流程中,几乎没有数学计算。
三角形画法
我们把代码弄出来:
代码语言:javascript复制length = 400
turtle.goto(0, 0)
turtle.pendown()
turtle.seth(0)
turtle.fd(length)
(x,y)=turtle.pos()
turtle.penup()
turtle.goto(0, 0)
turtle.pendown()
turtle.seth(72)
turtle.fd(length)
turtle.goto(x,y)
turtle.penup()
实际上,如果到了这一步,画一个多边形所需要的的基础知识80%已经具备了。
画完第一个,我们再来画第二个。
同样上代码:
代码语言:javascript复制turtle.goto(0, 0)
turtle.pendown()
turtle.seth(72)
turtle.fd(length)
(x,y)=turtle.pos()
turtle.penup()
turtle.goto(0, 0)
turtle.pendown()
turtle.seth(72 72)
turtle.fd(length)
turtle.goto(x,y)
turtle.penup()
三角形画法2
搞到这里,眼尖的同学一定发现了什么?
画第一个图和第二个图除了角度不一样,其他都是一样的,那还不赶紧重构一把,等着过年吗??
代码语言:javascript复制length = 400
for index in range(5):
turtle.goto(0, 0)
turtle.pendown()
turtle.seth(72*index)
turtle.fd(length)
(x,y)=turtle.pos()
turtle.penup()
turtle.goto(0, 0)
turtle.pendown()
turtle.seth(72*(index 1))
turtle.fd(length)
turtle.goto(x,y)
turtle.penup()
五边形
漂亮,一个完美的五边形。
我们再来把代码重构一把,让它支持N边形。
代码语言:javascript复制def draw_gon(length, line):
angle = 360//line
for index in range(line):
turtle.goto(0, 0)
turtle.pendown()
turtle.seth(angle*index)
turtle.fd(length)
(x,y)=turtle.pos()
turtle.penup()
turtle.goto(0, 0)
turtle.pendown()
turtle.seth(angle*(index 1))
turtle.fd(length)
turtle.goto(x,y)
turtle.penup()
到这里,基本功能就完工了。
这里,我们每次起笔都是往东画,我们再重构一把,给它增加一个起始的角度值,为我们后面的旋转埋下伏笔。
代码语言:javascript复制def draw_gon(length, start_angle, line):
angle = 360//line
for index in range(line):
turtle.goto(0, 0)
turtle.pendown()
turtle.seth(start_angle angle*index)
turtle.fd(length)
(x,y)=turtle.pos()
turtle.penup()
turtle.goto(0, 0)
turtle.pendown()
turtle.seth(start_angle angle*(index 1))
turtle.fd(length)
turtle.goto(x,y)
turtle.penup()
五边形_角度10
最后,再把各个多边形的美图给一下:
八边形
九边形
十边形
十二边形
十八边形
三十边形