画完辅助线,咱们可以看出来,横线竖线共99个交叉点,要是都画上星星能画99个星星,美国共有50个州,所以其实只需要画50个星星的,那咱们得隔一个画一个,找找规律,横1和竖1,竖3,竖5,竖7,竖9,竖11交叉的点就需要画星,对于横2,则竖2,竖4,竖6,竖8,竖10,就需要画星,那合着就是横竖都是单数或是横竖都是双数,那么就需要画星。
再回顾一下参数:

星星的直径等于旗子总高度*0.616,也就是直径=260*0.616。
半径就是260*0.616/2
画星可以这样画:
def draw_stars(self):
turtle.penup()
for j in range(1,10):
y=130 - 14*j
for i in range(1,12):
x=-247 + 16.466666667*i
if i%2==j%2:
turtle.goto(x*self._unit, y*self._unit)
self.draw_star(x, y, 260*0.616/2, 90, "white")
这样总代码如下:
import turtle
class StarSpangledBannerFlag:
_unit=1
US_SPANGLED_RED=(191,26,35)
US_SPANGLED_BLUE=(60,59,110)
STAR_SIDE_LEN_RATIO = 0.7265425280053608
def __init__(self, unit):
self._unit=unit
# Set Speed to fast
turtle.speed(0)
# Set color mode to 255 for RGB values between 0-255
turtle.colormode(255)
def draw_rectangle(self,x=0,y=0,width=0.0,height=0.0,color=(255,0,0),fill_color=(255,0,0)):
turtle.color(color)
turtle.goto(x * self._unit, y * self._unit)
turtle.fillcolor(fill_color)
turtle.begin_fill()
for _ in range(4):
turtle.forward(width * self._unit if _%2==0 else height * self._unit)
turtle.right(90)
turtle.end_fill()
def draw_flag(self):
self.draw_rectangle(-247,130,494,260,"black","white")
def draw_stripes(self):
for y in range(130,-130, -40):
self.draw_rectangle(-247,y,494,20,self.US_SPANGLED_RED,self.US_SPANGLED_RED)
def draw_star_area(self):
self.draw_rectangle(-247,130,197.6,140,self.US_SPANGLED_BLUE,self.US_SPANGLED_BLUE)
def draw_line(self,x=0.0,y=0.0,heading=0,distance=10.0):
turtle.penup()
turtle.goto(x*self._unit, y*self._unit)
turtle.pendown()
turtle.setheading(heading)
turtle.forward(distance*self._unit)
def draw_lines(self):
turtle.color("yellow")
#画9条横线
for y in range(116,-10,-14):
self.draw_line(-247,y,0,197.6)
# 画11条竖线
for x in range(-23053, -4940, 1647):
self.draw_line(x/100, 130, 270, 140)
def draw_stars(self):
turtle.penup()
for j in range(1,10):
y=130 - 14*j
for i in range(1,12):
x=-247 + 16.466666667*i
if i%2==j%2:
turtle.goto(x*self._unit, y*self._unit)
self.draw_star(x, y, 260*0.616/2, 90, "white")
def draw_star(self,x=0.0,y=0.0,radius=1.0,angle=90,color="yellow"):
"""
绘制五角星
"""
turtle.goto(x*self._unit, y*self._unit)
turtle.setheading(angle)
turtle.forward(radius * self._unit)
turtle.right(90+72)
turtle.color(color,color)
side_length = self.STAR_SIDE_LEN_RATIO * radius * self._unit
turtle.pendown()
turtle.begin_fill()
for i in range(10):
turtle.forward(side_length)
turtle.left(72 if i%2==0 else 360-144)
turtle.end_fill()
turtle.penup()
def draw_usa_flag(self):
self.draw_flag()
self.draw_stripes()
self.draw_star_area()
self.draw_lines()
self.draw_stars()
turtle.hideturtle()
turtle.done()
if __name__ == "__main__":
usaFlag=StarSpangledBannerFlag(2)
usaFlag.draw_usa_flag()
效果如下:

然后我们去掉辅助线,最精简的代码一共只有不到80行:
import turtle
class StarSpangledBannerFlag:
_unit=1
US_SPANGLED_RED=(191,26,35) #荣耀红的255色号
US_SPANGLED_BLUE=(60,59,110) #荣耀蓝的255色号
STAR_SIDE_LEN_RATIO = 0.7265425280053608 #半径为1的五角星的边长
FLAG_HEIGHT=260 #旗子高度
FLAG_WIDTH=FLAG_HEIGHT*1.9 #旗子宽度=高度 * 1.9
STRIPE_HEIGHT=FLAG_HEIGHT/13 #条带高度=旗子高度 / 13
STAR_AREA_HEIGHT=STRIPE_HEIGHT*7 #星区高度=条带高度 * 7
STAR_AREA_WIDTH=FLAG_WIDTH*2/5 #星区宽度=旗子宽度 * 2/5
STAR_DIAMETER=STAR_AREA_HEIGHT*0.0616 #星星直径=旗子高度 * 0.0616
x0,y0=-FLAG_WIDTH//2,FLAG_HEIGHT//2 #左上角的坐标
def __init__(self, unit):
self._unit=unit
# Set Speed to fast
turtle.speed(0)
# Set color mode to 255 for RGB values between 0-255
turtle.colormode(255)
def draw_rectangle(self,x=0.0,y=0.0,width=0.0,height=0.0,color=(255,0,0),fill_color=(255,0,0)):
turtle.color(color,fill_color)
turtle.penup()
turtle.goto(x * self._unit, y * self._unit)
turtle.pendown()
turtle.begin_fill()
for _ in range(4):
turtle.forward(width * self._unit if _%2==0 else height * self._unit)
turtle.right(90)
turtle.end_fill()
turtle.penup()
def draw_stripes(self):
for y in range(self.y0,-self.y0, int(-self.STRIPE_HEIGHT*2)):
self.draw_rectangle(self.x0,y,self.FLAG_WIDTH,self.STRIPE_HEIGHT,self.US_SPANGLED_RED,self.US_SPANGLED_RED)
def draw_star_area(self):
self.draw_rectangle(self.x0,self.y0,self.STAR_AREA_WIDTH,self.STAR_AREA_HEIGHT,self.US_SPANGLED_BLUE,self.US_SPANGLED_BLUE)
def draw_stars(self):
for j in range(1,10):
y=self.y0 - self.STAR_AREA_HEIGHT/10*j
for i in range(1,12):
x=self.x0 + self.STAR_AREA_WIDTH/12*i
if i%2==j%2:
turtle.goto(x*self._unit, y*self._unit)
self.draw_star(x, y, self.STAR_DIAMETER/2, 90, "white")
def draw_star(self,x=0.0,y=0.0,radius=1.0,angle=90.0,color="white"):
"""
绘制五角星
"""
turtle.goto(x*self._unit, y*self._unit)
turtle.setheading(angle)
turtle.forward(radius * self._unit)
turtle.right(90+72)
turtle.color(color,color)
side_length = self.STAR_SIDE_LEN_RATIO * radius * self._unit
turtle.pendown()
turtle.begin_fill()
for i in range(10):
turtle.forward(side_length)
turtle.left(72 if i%2==0 else 360-144)
turtle.end_fill()
turtle.penup()
def draw_usa_flag(self):
turtle.title("Star Spangled Banner Flag")
self.draw_stripes()
self.draw_star_area()
self.draw_stars()
turtle.hideturtle()
turtle.done()
if __name__ == "__main__":
usaFlag=StarSpangledBannerFlag(2)
usaFlag.draw_usa_flag()
最终效果如下:

挺好看,完美。
1万+

被折叠的 条评论
为什么被折叠?



