Python Turtle海龟画图-画星条旗2-画完整的星条旗

画完辅助线,咱们可以看出来,横线竖线共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()

最终效果如下:

挺好看,完美。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值