审核原因 此处红旗用网格分隔的图片已从文中删除,核心就是先将旗面网格化,以便于画笔定位,这个可以百度搜索到相关带网格的红旗图片
先将旗面划分为4个等分长方形,再将左上方长方形划分长宽15×10个方格。大五角星的中心位于该长方形上5下5、左5右10之处。大五角星外接圆的直径为6单位长度。(此处得单位长度做为后续程序中的尺寸比例参考值)
四颗小五角星的中心点,
第一颗位于上2下8、左10右5,
第二颗位于上4下6、左12右3,
第三颗位于上7下3、左12右3,
第四颗位于上9下1、左10右5之处。
每颗小五角星外接圆的直径均为2单位长度。四颗小五角星均有一角尖正对大五角星的中心点。
此处红旗用网格分隔的图片一并删除
大五角星:左上角起点(2/30,4/20)【左数第2格,上数第4格】 边长 (6/30) 中心点(5/30,5/20)【5,5】
小五角星:
第一颗 : 中心点(10/30,2/20) 【左10,上2】
第二颗 : 中心点(12/30,4/20) 【左12,上4】
第三颗 : 中心点(12/30,7/20) 【左12,上7】
第四颗: 中心点(10/30,9/20) 【左10,上9】
《国旗法》还给出了国旗的五种尺度规格:
尺度 | 长高(厘米) |
1 | 288 × 192 |
2 | 240 × 160 |
3 | 192 × 128 |
4 | 144 × 96 |
5 | 96 × 64 |
import turtle
import math
t = turtle.Pen()
width = 900
height = 600
t.speed(6) # 设置画笔的绘制速度 值为 --> 1(慢)-->10(快) ,0为最快
t.screen.title('祖国万岁') # 设置图画的名称
t.screen.setup(width, height) # 设置画布的大小 宽 高 (正好等于五星红旗的 宽高)
t.screen.bgcolor('red') # 设置画布的颜色,此处设为五星红旗的底色红色
t.fillcolor('yellow') # 五角星的填充颜色
t.pencolor('yellow') # 画笔颜色 和五角星颜色一致
# 计算不同直径外接圆的五角星的边长(比如6) 当被调用的时候直接返回结果(具体的边长)
def side_length(diameter): # diameter:直径
return math.sin(math.radians(72))*diameter*30
# 将画布平均分为 宽30个单位正方形 高20个单位正方形 的坐标参考系
# 计算每一个小正方形格子的实际宽度 用以移动画笔 当被调用的时候直接返回结果
def scale(diameter): # scale:比例尺 diameter代表格子数(五角星外接圆的直径)
return width/30*diameter # width/30代表每一个格子的实际长度
# 绘制不同大小的五角星 每个五角星的画法轨迹是一样的
def star(diameter,angle): # star:星星 第一个参数代表五角星的外接圆直径 第二个代表画笔旋转角度
t.setheading(angle) # 当画笔来到某个五角星的中心点后,对画笔的指向进行调整,以使小五角星一角指向大五角星的中心
t.forward(scale(diameter)/2) # 画笔从五角星的中心点前进到五角星的起始绘制点 距离为外接圆直径的一半 所以要除以2
t.setheading(angle-180) # 使画笔指向180°反转 本来都是向左的 现在调成向右
t.left(18) # 画笔再次进行微调18度(五角星内角的一半) 准确指向将要开始绘制第一条边的方向
t.begin_fill() # 准备颜色填充 填充将要绘制出的五角星
for i in range(5):
t.forward(side_length(diameter))
t.right(144)
t.end_fill() # 颜色填充 直到结束
def spin(x,y): # spin:旋转 主要是为了4个小五角星都有1个角都能对准大五角星的中心
return math.degrees(math.atan2(x,y))
def national_flag(x,y,z,h): # x:从往左移格数 y:往上移格数 z:五角星直径 h:画笔旋转角度
t.up()
t.goto(-scale(x), scale(y))
t.down()
star(z,h)
national_flag(10, 5, 6, 180-18) # (五角星中心点位置:从画布中心左移距离,上移格数,尺寸,画笔旋转角度)
national_flag(5, 8, 2, spin(3, 5)+180) # 第一个小五角星
national_flag(3, 6, 2, spin(1, 7)+180) # 第二个小五角星
national_flag(3, 3, 2, 180-spin(2, 7)) # 第三个小五角星
national_flag(5, 1, 2, 180-spin(4, 5)) # 第四个小五角星
t.hideturtle()
turtle.done()