turtle库的简单应用
在画国旗的过程中,用到操作并不多,只是有很多操作需要循环利用,当然个人认为,在实现画国旗整个流程中,最重要的部分就是利用数学公式计算出精确的角度。
我们必须知道国旗的尺寸比例及各个五星的位置角度要求才能画出一个标准的国旗,以下是我画出的330:220比例的国旗,大家如果需要不同大小比例的国旗,只需修改相应的长度或宽度就行,角度不用修改。
在给出代码之前,说明一下自己在画国旗的过程中是按照自己最初的实现思路来实现的,即实现步骤都是一步一步地来,没有进行相应的优化,只是想和大家一起学习一下利用tutle库画国旗的具体流程。在熟悉流程后,大家就可以尝试利用更短的代码来实现。
#/usr/bin/env python
#-*- coding: utf-8 -*-
#-*- author:linjunfan -*-
#导入相应的包turtle、math,math包主要是用来计算角度的
import turtle
import math
turtle.up()
#为了实现国旗(比例330:220)在中间显示,首先把起始点移到绝对位置(-165,-110)
turtle.goto(-165,-110)
turtle.down()
turtle.begin_fill()
turtle.fillcolor("red")#填充国旗的颜色
turtle.pencolor("red")#画笔颜色
turtle.forward(330)#长度
turtle.left(90)#方向向左转90角
turtle.forward(220)#宽度
turtle.left(90)
turtle.forward(330)
turtle.left(90)
turtle.forward(220)
turtle.end_fill()#长方形框架画完,此时方向向下
turtle.left(180)#把方向转为向上
turtle.up()
turtle.goto(-143,66)#移到大五星最左端的顶点
turtle.down()
turtle.right(90)#把方向转为向右
turtle.begin_fill()
turtle.fillcolor("yellow")#大五星的颜色
turtle.pencolor("yellow")
for iin range(5):
turtle.forward(66)#大五星的每条边长度
turtle.right(144)#五星的角度为36,所以需要转(180-36)度
turtle.end_fill()#大五星画完
turtle.up()
turtle.goto(-110,55)#回到大五星的中心点
#方向转到大五星中心点到第一个小五星中心点的方向上
turtle.left(math.degrees(math.acos((9-25-34)/(-2*5*math.sqrt(34)))))
turtle.forward(math.sqrt(55**2+33**2)-11)#第一个小五星左边顶点的位置
turtle.left(18)#因为刚刚只是转到两个中心点的角度,要画边就需要再左转36/2度
turtle.down()
turtle.begin_fill()
turtle.fillcolor("yellow")
turtle.pencolor("yellow")
for iin range(5):
turtle.forward(math.sin(math.radians(72))*11*2)#画小五星长度
turtle.right(144)
turtle.end_fill()
turtle.up()
turtle.goto(-110,55)
turtle.right(18)#因为为了画边之前向左转了18度,现在向右返回18度
turtle.right(math.degrees(math.acos((9-25-34)/(-2*5*math.sqrt(34)))))#方向返回水平向右
# 再转到大五星中心点到第二个小五星的中心点方向上
turtle.left(math.degrees(math.acos((1-49-50)/(-2*7*math.sqrt(50)))))
turtle.forward(math.sqrt(11**2+77**2)-11)
turtle.left(18)
turtle.down()
turtle.begin_fill()
turtle.fillcolor("yellow")
turtle.pencolor("yellow")
for iin range(5):
turtle.forward(math.sin(math.radians(72))*11*2)
turtle.right(144)
turtle.end_fill()
#最后的两个小五星的画法同上,就不具体注释
turtle.up()
turtle.goto(-110,55)
turtle.right(18)
turtle.right(math.degrees(math.acos((1-49-50)/(-2*7*math.sqrt(50)))))
turtle.right(math.degrees(math.acos((4-49-53)/(-2*7*math.sqrt(53)))))
turtle.forward(math.sqrt(11**2+77**2)-11)
turtle.left(18)
turtle.down()
turtle.begin_fill()
turtle.fillcolor("yellow")
turtle.pencolor("yellow")
for iin range(5):
turtle.forward(math.sin(math.radians(72))*11*2)
turtle.right(144)
turtle.end_fill()
turtle.up()
turtle.goto(-110,55)
turtle.right(18)
turtle.left(math.degrees(math.acos((4-49-53)/(-2*7*math.sqrt(53)))))
turtle.right(math.degrees(math.acos((16-25-41)/(-2*5*math.sqrt(41)))))
turtle.forward(math.sqrt(11**2+77**2)-11)
turtle.left(18)
turtle.down()
turtle.begin_fill()
turtle.fillcolor("yellow")
turtle.pencolor("yellow")
for iin range(5):
turtle.forward(math.sin(math.radians(72))*11*2)
turtle.right(144)
turtle.end_fill()
turtle.hideturtle()
turtle.done()
在找小五星的角度时,我是通过返回到大五星中心点与小五星中心点来计算角度,相关计算角度利用到三角函数公式,如果不熟悉自己上网查一下,如何利用边长来计算三角形的角度。以上是自己最初的实现思路,有很多地方可以简化,我这样写只是想记录一下自己当时具体的思路过程,大家可以根据自己的需求进行简化。如果大家有什么更好的方法来实现,我们可以互相交流学习。