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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章