#星条旗绘制程序
#开始
#设定各元素法定规格
A1=10 #旗子高度
B1=19*A1/10 #旗子宽度
C1=7*A1/13 #星区高度
D1=2*B1/5 #星区宽度
L1=A1/13 #红白条宽度
E1=C1/10 #星星上下间隔
G1=D1/12 #星星左右间隔
K1=4*L1/5 #星星大小
#设定三种颜色色值
F='#B22234'
W='#FFFFFF'
S='#3C3B6E'
import turtle #调用画图库
#设定画图区域
d=60 #设单位像素数
turtle.setup(width=(B1+1)*d,height=(A1+1)*d,startx=0,starty=0) #设定画图窗口大小和左上角位置
turtle.screensize(B1*d,A1*d,W) #设定画布大小和颜色
turtle.penup() #抬起画笔
#画出旗子区
turtle.goto(-0.5*B1*d,0.5*A1*d) #画笔移到左上角
turtle.color(F,F) #设定画笔颜色,填充颜色
turtle.pendown() #放下画笔
turtle.begin_fill() #开始填充
for i in range(2): #画笔先横后竖重复两次
turtle.fd(B1*d) #画横线
turtle.right(90) #右转
turtle.fd(A1*d) #画竖线
turtle.right(90) #右转
turtle.end_fill() #结束填充
turtle.penup() #抬起画笔
#宽笔画出6个白条
Y=[5,3,1,-1,-3,-5] #白条的6个起笔Y值
turtle.pensize(L1*98/100*d) #设定笔宽(比标准略减少,修正浅色笔迹视觉宽效应)
turtle.color(W)
def White(Y): #设定画白条函数
turtle.goto(-0.5*B1*d,(Y*L1*d)) #画笔移动到左侧第白条起点
turtle.pendown()
turtle.fd(B1*d) #画出白条
turtle.penup()
for (Y) in Y: #从元组逐个赋值给函数
White(Y) #执行函数分别画出6个白条
turtle.pensize(1) #笔宽回归正常
#画出蓝色方块区
turtle.goto(-0.5*B1*d,0.5*A1*d) #画笔移到左上角
turtle.color(S,S)
turtle.pendown()
turtle.begin_fill()
for i in range(2):
turtle.fd(D1*d)
turtle.right(90)
turtle.fd(C1*d)
turtle.right(90)
turtle.end_fill()
turtle.penup()
#五角(多角)星原理准备
n=5 #设定边数
j=36 #设定星角度
A=180*(n-2) #多边形内角度数总和(推导定理)
B=A/n #正多边形内角度数
#计算对应正多边形单位边长
a=360/n #单个扇区占用角度
import math #调用数学库
a1=math.radians(a/2) #半个扇区对应弧度值
l=2*math.sin(a1) #计算出单位边长
#计算星角边单位长度
J=math.radians(a/2+j/2) #内折角度的对应弧度值
m=(l/2)/math.sin(J) #计算出星角边单位长度
#定义画星的函数
def star_movment(Size):
turtle.left(90) #转向正上方
turtle.fd(Size) #前进到起笔位置
turtle.left(90) #转到初始角度
turtle.pendown()
turtle.begin_fill()
for i in range(n): #循环动作组合
turtle.left(90-j/2) #内折
turtle.fd(Size*m) #折后行进
turtle.right(B-j) #双量角度回转
turtle.fd(Size*m) #回转后再行进
turtle.left(90-j/2) #进入下一折角位
turtle.end_fill()
turtle.penup()
turtle.left(-90) #画笔回向上方向
turtle.bk(Size) #回到星中心位置
turtle.left(-90) #画笔回原始方向
turtle.speed(200) #定义快速笔速
turtle.color(S,W) #减少白笔视觉扩大效应
#画出横向6星的行上的白星
e1=[1,3,5,7,9] #设定各行纵向位置
def star(e1):#定义画小星函数
turtle.goto(-0.5*B1*d+G1*d,0.5*A1*d-e1*E1*d) #行进到每行首星位置
for i in range(6): #循环动作组合,横向逐个画星
star_movment(0.5*K1*d) #执行画星
turtle.fd(2*G1*d) #横向移动到下一个星位置
for (e1) in e1: #分别赋纵向值给函数
star(e1) #执行每行动作
#画出横向5星的行上的白星
e2=[2,4,6,8]
def star(e2):
turtle.goto(-0.5*B1*d+2*G1*d,0.5*A1*d-e2*E1*d)
for i in range(5):
star_movment(0.5*K1*d)
turtle.fd(2*G1*d)
for (e2) in e2:
star(e2)
turtle.hideturtle() #隐藏画笔
turtle.done() #画完停留
#结束