此次练习用到了python中的turtle库,以及math库中的pow幂运算和sqrt开方运算。
整体逻辑:
先画出多个同心,逐级变小的八边形;
再画出八条辐射线。
为了保证同心:
每画完一个八边形,都使用goto(0, 0)回到原点位置;
改变画笔起始点,偏移量为半边长加上由边长组成的等腰直角三角形一条腰的长度和。
代码实现:
import turtle
from math import sqrt,pow
# 起始最外层八边形边长
side = 50
# 偏移画布原点(0, 0)的距离,用来改变画笔起始点,保证图形居中
offset = sqrt(pow(side,2)/2)+(side/2)
turtle.pensize(2)
turtle.pencolor('red')
# 改变speed参数(0,10)用来查看画图时的变化,便于调试代码
turtle.speed(10)
# 循环画11个八边形
for n in range(11):
# 抬起画笔后改变画笔起始点和行进方向
turtle.penup()
turtle.forward(offset)
turtle.left(90)
turtle.pendown()
# 起始点为八边形边的一半处,行进一半就到了第一个顶点位置
turtle.forward(side/2)
# 循环画8条边
for i in range(8):
turtle.left(45)
turtle.forward(side)
# 每次画完1个八边形后恢复到原点和行进方向
turtle.penup()
turtle.goto(0,0)
turtle.right(90)
turtle.pendown()
# 每次画完1个八边形,都改变边长和偏移量,逐级减小
side -=4
offset = sqrt(pow(side,2)/2)+(side/2)
# 循环画8条辐射线
turtle.pencolor('green')
turtle.left(22.5)
for j in range(8):
turtle.left(45)
turtle.forward(100)
# 不改变方向后退到起点
turtle.backward(100)
# 隐藏画笔并结束
turtle.hideturtle()
turtle.done()