Python --- 使用turtle绘制五星红旗

Turtle库简介

Turtle绘图是向孩子们介绍编程的一种流行方式。它是Wally Feurzig和Seymour Papert在1966年开发的原始徽标编程语言的一部分。

Turtle库常用操作介绍:

导入turtle模块:import turtle

初始化屏幕:Screen()

新建turtle对象实例:aTurtle = turtle.Turtle()

Turtle设置

隐藏箭头:hideturtle()

设置速度:speed(10) 

前进distance个像素:fd(distance)

后退distance个像素:back(distance)

右转90°:right(90)

左转90°:left(90)

填充颜色

开始填充:begin_fill()

填充黄色:fillcolor('yellow')

结束填充:end_fill()

画笔填充

和放下笔,这样进行的操作不会留下痕迹

抬起笔,画笔移动不会留下痕迹:penup()

画笔移动:goto(start_pos)

放下笔,移动会留下痕迹:pendown()

五星之位置与画法

(1)为便于确定五星之位置,先将旗面对分为四个相等的长方形,将左上方之长方形上下划为十等分,左右划为十五等分。

                                                                                            国旗墨线图

(2)大五角星的中心点,在该长方形上五下五、左五右十之处。

其画法为:以此点为圆心,以三等分为半径作一圆。在此圆周上,定出五个等距离的点,其一点须位于圆之正上方。然后将此五点中各相隔的两点相联,使各成一直线。此五直线所构成之外轮廓线,即为所需之大五角星。五角星之一个角尖正向上方。

(3)四颗小五角星的中心点,第一点在该长方形上二下八、左十右五之处,第二点在上四下六、左十二右三之处,第三点在上七下三、左十二右三之处,第四点在上九下一、左十右五之处。其画法为:以以上四点为圆心,各以一等分为半径,分别作四个圆。在每个圆上各定出五个等距离的点,其中均须各有一点位于大五角星中心点与以上四个圆心的各联结线上。然后用构成大五角星的同样方法,构成小五角星。此四颗小五角星均各有一个角尖正对大五角星的中心点。

国旗之通用尺度定为如下五种:

(1)长288厘米,高192厘米。

(2)长240厘米,高160厘米。

(3)长192厘米,高128厘米。

(4)长144厘米,高96厘米。

(5)长96厘米,高64厘米。

程序介绍

程序执行过程:

1、先画红旗;

2、画大五角星;

3、从上到下,画其他四个五角星

红旗画法:

红旗是矩形,所以画出一个矩形,填充红色即可。

五角星的画法

一笔画出五角星的方法,如下所示,从五角星的顶角0号角开始,顺序是0->2->4->1->3->0。最后回到0号角位置是为了形成闭环,填充颜色。所以在后面的描述过程中,五角星相关的角度偏置列表元素个数设置为6个就是这个原因。

根据上面的五星红旗画法和位置,得出:

  (1) 五角星的五个角相对于中心点的角度。

star_angle = [18,90,162,234,306,18]

  (2) 五颗星星相对于大五角星的偏转角度,大五角星相对于自己偏转0°

angle_off = [0, 30.9, 8.1, -8.1,-30.9]

(3)绘制五角星路线,顶角0号角开始绘制:

draw_seq = [0,2,4,1,3,0]

 (4)五角星的大小设置,是相对于红旗的长度而设定的

def set_rad_size(flag_len):

    rad_list = []
    rad_list.append(flag_len/10)
    rad_list.append(flag_len/30)
    rad_list.append(flag_len/30)
    rad_list.append(flag_len/30)
    rad_list.append(flag_len/30)
    
    return rad_list;

5)五角星的坐标设置,是相对于红旗的长度和宽度和偏转的角度而设定的

  • 首先计算五颗五角星相对于红旗的坐标位置
# Set star position x asix offset
def set_x_offset(length):

    offset_x_list = []
    offset_x_list.append(-1 *  length/2 +  length / 6)
    offset_x_list.append(-1 *  length/2 +  length * 0.3) 
    offset_x_list.append(-1 *  length/2 +  length * 0.4) 
    offset_x_list.append(-1 *  length/2 +  length * 0.4)
    offset_x_list.append(-1 *  length/2 +  length * 0.3)

    return offset_x_list;

# Set star position y asix offset
def set_y_offset(hight):

    offset_y_list = []
    offset_y_list.append(hight * 0.25)
    offset_y_list.append(hight * 0.4) 
    offset_y_list.append(hight * 0.3) 
    offset_y_list.append(hight * 0.15) 
    offset_y_list.append(hight * 0.05)
    
    return offset_y_list;
  • 然后偏转角度计算五个角的坐标位置,画笔开始从0号角开始绘制,根据上面描述的一笔绘制五角星的方法依次绘制。
def draw_star(rad_size,offset_x_val,offset_y_val,angle_offset):
    penup()
    # Set pen color to yellow
    color("yellow")
    begin_fill()
    
    
    for i in range(len(star_angle)):
        # Calculate the radians of the five angles relative to the center  
        radian = (star_angle[draw_seq[i]] +  angle_offset) / 180 * pi
        x = rad_size * cos(radian)
        y = rad_size * sin(radian)

        # Move to position (x,y)
        setpos(x+ offset_x_val,y+ offset_y_val)
    pendown()

    end_fill()

程序绘制效果

源代码

程序源代码如下,你还可以从我的gitHub上获取:https://github.com/YiweiGe999/turtle

from turtle import *
from math import *
from time import *

# Star angle configuration, unit: degree
star_angle = [18,90,162,234,306,18]

# Star angle offset, unit: degree
angle_off = [0, 30.9, 8.1, -8.1,-30.9]

# Draw five star sequence
draw_seq = [0,2,4,1,3,0]


# Set star radius size
def set_rad_size(flag_len):


    rad_list = []
    rad_list.append(flag_len/10)
    rad_list.append(flag_len/30)
    rad_list.append(flag_len/30)
    rad_list.append(flag_len/30)
    rad_list.append(flag_len/30)
    
    return rad_list;


# Set star position x asix offset
def set_x_offset(length):

    offset_x_list = []
    offset_x_list.append(-1 *  length/2 +  length / 6)
    offset_x_list.append(-1 *  length/2 +  length * 0.3) 
    offset_x_list.append(-1 *  length/2 +  length * 0.4) 
    offset_x_list.append(-1 *  length/2 +  length * 0.4)
    offset_x_list.append(-1 *  length/2 +  length * 0.3)

    return offset_x_list;

# Set star position y asix offset
def set_y_offset(hight):

    offset_y_list = []
    offset_y_list.append(hight * 0.25)
    offset_y_list.append(hight * 0.4) 
    offset_y_list.append(hight * 0.3) 
    offset_y_list.append(hight * 0.15) 
    offset_y_list.append(hight * 0.05)
    
    return offset_y_list;


# Star draw star
def draw_star(rad_size,offset_x_val,offset_y_val,angle_offset):
    penup()
    # Set pen color to yellow
    color("yellow")
    begin_fill()
    
    
    for i in range(len(star_angle)):
        # Calculate the radians of the five angles relative to the center  
        radian = (star_angle[draw_seq[i]] +  angle_offset) / 180 * pi
        x = rad_size * cos(radian)
        y = rad_size * sin(radian)

        # Move to position (x,y)
        setpos(x+ offset_x_val,y+ offset_y_val)
    pendown()

    end_fill()
    
# Draw red flag
def draw_flag(length,hight):

    penup()
    setpos(-1 * length/2,-1 * hight/2)
    pendown()
    color("red")
    begin_fill()

    fd(length)
    left(90)
    fd(hight)
    left(90)
    fd(length)
    left(90)
    fd(hight)
    end_fill()




def main():

    
    FLAG_LENTH = 900
    FLAG_HIGHT  = FLAG_LENTH * 2 /3

    flag_length = FLAG_LENTH
    flag_hight = FLAG_HIGHT
    
    for len_index in range(1):
        reset()
        rad = set_rad_size(flag_length)

        offset_x = set_x_offset(flag_length)

        offset_y = set_y_offset(flag_hight)
        # Start draw red flag
        draw_flag(flag_length,flag_hight)

        # Start draw five stars
        for index in range(5):
            draw_star(rad[index],offset_x[index],offset_y[index],angle_off[index])
        
        color("red")
        penup()
        sleep(1)
        flag_length = FLAG_LENTH *  (len_index + 1)
        flag_hight = FLAG_HIGHT * (len_index + 1)
         
main()
mainloop()

Turtle绘制其他图形

奥运五环,你比四环多一环,代码获取路径:https://github.com/YiweiGe999/turtle

发布了4 篇原创文章 · 获赞 0 · 访问量 2676

猜你喜欢

转载自blog.csdn.net/wuyiwei999/article/details/100061208