五星红旗
每每看到五星红旗迎风飘扬,心中满满爱国之情油然而生,那么我们如何用python turtle库绘制一个标准五星红旗呢。
一般场合下使用的标准国旗尺寸有五种
型号 | 规格( ) |
---|---|
① | 长288 ,高192 。 |
② | 长240 ,高160 。 |
③ | 长192 ,高128 。 |
④ | 长144 ,高96 。 |
⑤ | 长96 ,高64 。 |
这里我们在计算机中绘图,将单位缩放至像素(pixel)大小。
步骤一 绘制矩形
先画一个矩形,长与高的比例=3:2。
关于红色的颜色RGB色值,这里参考了作业帮的一个题目的优质解答。
红色RGB:#F40002
def edge(x, y):
turtle.penup()
turtle.goto(x - 144, y + 96) # 起始位置
turtle.pendown()
turtle.begin_fill()
turtle.fillcolor('#F40002')
turtle.pen(pencolor='#F40002')
for i in range(2):
turtle.fd(288)
turtle.right(90)
turtle.fd(192)
turtle.right(90)
turtle.end_fill()
步骤二 绘制五角星
画五颗五角星
- 一颗星较大,其外接圆直径=旗高
- 四颗星较小,其外接圆直径=旗高
- 四颗小五角星各有一尖正对着大星中心点
这里参考了一张图片
def big_star(x, y, len): # x,y为起始坐标,len为五角星边长
turtle.goto(x, y) # 起始位置
turtle.setheading(0) # 倾斜起始角度
turtle.begin_fill()
turtle.fillcolor('#FAF408')
turtle.penup()
turtle.left(18)
turtle.fd(len / 2 / math.cos(18 * math.pi / 180))
turtle.left(162)
turtle.pendown()
turtle.pen(pencolor='#FAF408')
for i in range(5):
turtle.fd(len)
turtle.left(144)
turtle.end_fill()
turtle.penup()
def small_star(x, y, len): # x,y为起始坐标,len为五角星边长
turtle.goto(x, y) # 起始位置
angle = turtle.towards(-10 * 9.8, 5 * 9.8)
turtle.setheading(angle) # 倾斜起始角度 此时小五角星头部对准大五角星中心
turtle.fd(len / 2 / math.cos(18 * math.pi / 180))
turtle.right(162)
turtle.pendown()
turtle.begin_fill()
turtle.fillcolor('#FAF408')
for i in range(5):
turtle.fd(len)
turtle.right(144)
turtle.end_fill()
turtle.penup()
在设计函数参数的时候,大五角星选用了三个参数,起始坐标
与五角星边长长度
,由于角度已知所以没有设置。
小五角星同样也用了这三个参数,关于他们的角度(一尖正对大五角星中心),在turtle实际上有一个函数的返回值可以做到这一点。
turtle.towards(-10 * 9.8, 5 * 9.8)
这个函数的意思是,返回函数给出的这个坐标点相对于小海龟目前坐标位置的方向,这个方向是标准模式: 。我们通过这个方向让小海龟向前走一个外接圆半径就到达了五角星的一个尖,这时把海龟头部方向调正,进行五次循环方可画出小星星。
关于星星黄色颜色RGB色值,同样也参照上述解答,黄色:#FAF408 。
这样一张漂亮的五星红旗就完成啦。
扫描二维码关注公众号,回复:
11586317 查看本文章
完整代码
import turtle
import math
def edge(x, y):
turtle.penup()
turtle.goto(x - 144, y + 96) # 起始位置
turtle.pendown()
turtle.begin_fill()
turtle.fillcolor('#F40002')
turtle.pen(pencolor='#F40002')
for i in range(2):
turtle.fd(288)
turtle.right(90)
turtle.fd(192)
turtle.right(90)
turtle.end_fill()
def big_star(x, y, len): # x,y为起始坐标,len为五角星边长
turtle.goto(x, y) # 起始位置
turtle.setheading(0) # 倾斜起始角度
turtle.begin_fill()
turtle.fillcolor('#FAF408')
turtle.penup()
turtle.left(18)
turtle.fd(len / 2 / math.cos(18 * math.pi / 180))
turtle.left(162)
turtle.pendown()
turtle.pen(pencolor='#FAF408')
for i in range(5):
turtle.fd(len)
turtle.left(144)
turtle.end_fill()
turtle.penup()
def small_star(x, y, len): # x,y为起始坐标,len为五角星边长
turtle.goto(x, y) # 起始位置
angle = turtle.towards(-10 * 9.8, 5 * 9.8)
turtle.setheading(angle) # 倾斜起始角度 此时小五角星头部对准大五角星中心
turtle.fd(len / 2 / math.cos(18 * math.pi / 180))
turtle.right(162)
turtle.pendown()
turtle.begin_fill()
turtle.fillcolor('#FAF408')
for i in range(5):
turtle.fd(len)
turtle.right(144)
turtle.end_fill()
turtle.penup()
if __name__ == '__main__':
turtle.setup(width=468, height=312) # 左右两侧留出90像素距离 上下两侧留出60像素距离
turtle.hideturtle()
edge(0, 0)
big_star(-10 * 9.8, 5 * 9.8, 6 * 9.8 * math.cos(18 * math.pi / 180))
small_star(-5 * 9.8, 8 * 9.8, 2 * 9.8 * math.cos(18 * math.pi / 180))
small_star(-3 * 9.8, 6 * 9.8, 2 * 9.8 * math.cos(18 * math.pi / 180))
small_star(-3 * 9.8, 3 * 9.8, 2 * 9.8 * math.cos(18 * math.pi / 180))
small_star(-5 * 9.8, 1 * 9.8, 2 * 9.8 * math.cos(18 * math.pi / 180))
turtle.done()