一种粗中有细的Turtle画星条旗的代码

#星条旗绘制程序
#开始

#设定各元素法定规格
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() #画完停留

#结束
 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值