跳轉到

📚專題:中華民國國旗


📕 引言


日本協助救援

(圖為2011年台灣搜救隊從松山機場出發,前往日本協助救援311大地震。資料來源:1)

在國際救援活動場合中,參與救災的我國醫療人員曾表示,最感動的就是看到架設在醫療站的中華民國青天白日滿地紅國旗,和其他國家的國旗一同飄揚,讓他在參與國際救援行動時,很感動也很驕傲!(資料來源:2)

中華民國國旗是我國的象徵之一,平常會固定在學校禮堂、政府機關會議室。遇到國家慶典或紀念日時,會懸掛於街道。在中小學的升旗典禮中,也是儀式的主角。

在本專題中,請利用海龜程式畫出中華民國國旗

建議先備課程
在學習本專題前,建議先完成 海龜畫國旗 ,學習曲線會較為平順。





📙 問題


在實際寫國旗繪製程式時,可能會遇到一些關於國旗的基本問題,例如:

  • 各個地方大大小小的國旗看起來都很像。國旗的長度、形狀、比例、顏色,有沒有統一的規定?在哪裡有國旗相關說明呢?

  • 我國的國旗,除了有紅、藍、白色以外,還有一個像太陽的標誌,這個標誌看起來很複雜,國旗的畫法是什麼呢?

中華民國國旗
(資料來源:3)

還有想到與國旗相關的問題嗎?這些問題要怎麼克服呢?





📗 搜尋


利用搜尋引擎,運用「國旗」「繪製」…等關鍵字,可以找到許多相關的資料如下:

國旗規格

中華民國國旗規格

(資料來源:4)


網站

中華民國內政部 國旗懸掛禮儀網

維基百科 中華民國國旗

行政院 國情簡介

旗海圖幟 中華民國國旗繪製

法規

中華民國憲法 第6條

中華民國國徽國旗法

除了以上的資料,還有沒有其他的參考資料?找到資料後,要怎麼運用這些資料呢?





📒 構思


當我們對國旗有了基本的了解之後,就可以把大的問題拆解成小的問題,再逐一克服。

問題拆解


當然也必須思考動手實作的程式順序。

演算流程

反覆以上的步驟,思考問題、搜尋資料與設計規劃,當準備好了就可以動手實作了。

運算思維
演算法思維





📘 實作(4)

程式結構


綜合上面「問題拆解」與「演算流程」的思考,可以整理出以下的程式結構

程式結構


我們可以使用「程式模組化設計-函式功能」來寫出這樣的流程

模組化程式設計
函式 (function 功能)


動手來寫國旗主要結構的程式。


範例程式 程式結構 - - - - - - - (專題實作1/4 新檔)

【長度4:38 章節時間如下】

  • 0:00 存檔、模組匯入
  • 0:33 程式結構
from 海龜模組 import *

def 紅地() :
    print('2.紅地')

def 青天() :
    print('3.青天')

def 光芒() :
    print('4.光芒')

def 白日() :
    print('5.白日 ')

def 主程式() :
    print('1.主程式')
    紅地()
    青天()
    光芒()
    白日()

主程式()
完成()





紅地與青天


接下來實作紅地與青天這兩個長方形,從下圖中,你看得出它們的寬高比例嗎?


紅地與青天

(資料來源:4)

也要留意海龜的起點位置。試著用程式寫寫看。


範例程式 紅地與青天 - - - - - - - (專題實作2/4 接續)

【長度3:20 章節時間如下】

  • 4:45 紅地與青天
from 海龜模組 import *

def 紅地() :
    print('2.紅地')
    填充顏色('red')
    開始填色()
    for  in range(2) :
        向前(120)
        右轉(90)
        向前(80)
        右轉(90)
    停止填色()

def 青天() :
    print('3.青天')
    填充顏色('blue')
    開始填色()
    for  in range(2) :
        向前(60)
        右轉(90)
        向前(40)
        右轉(90)
    停止填色()

def 光芒() :
    print('4.光芒')

def 白日() :
    print('5.白日 ')

def 主程式() :
    print('1.主程式')
    紅地()
    青天()
    光芒()
    白日()

主程式()
完成()
結構化程式設計
計次式重複 (for 迴圈)





光芒


國旗中光芒的基本形狀是12角星形,可以利用「海龜畫國旗」中的方式來畫出

星形公式

(資料來源:5)


另外要留意12角星形中的起點、邊長,與一開始傾斜的角度。

光芒

(資料來源:4)

光芒的邊長?
細心的同學會有疑問,為什麼光芒的邊長大約是29呢?想要解答這個問題,必須解出下面的問題。
三角函數
其實只要使用三角函數就可以計算出光芒的邊長。
在不久的將來,同學們會在數學課中學到在導航、工程學以及物理學…等方面都有廣泛用途的三角函數,要認真學習哦。
維基百科 三角函數


最後,再讓線條與填充都是白色就可以了,用海龜程式來做做看。


範例程式 光芒 - - - - - - - (專題實作3/4 接續)

【長度3:52 章節時間如下】

  • 8:07 光芒
from 海龜模組 import *
速度('fast')
隱藏游標()

def 紅地() :
    print('2.紅地')
    填充顏色('red')
    開始填色()
    for  in range(2) :
        向前(120)
        右轉(90)
        向前(80)
        右轉(90)
    停止填色()

def 青天() :
    print('3.青天')
    填充顏色('blue')
    開始填色()
    for  in range(2) :
        向前(60)
        右轉(90)
        向前(40)
        右轉(90)
    停止填色()

def 光芒() :
    print('4.光芒')
    停筆()
    走到(15, -20)
    下筆()

    左轉(15)

    畫筆顏色('white')
    填充顏色('white')
    開始填色()
    for  in range(12) :
        向前(29)
        右轉(180-360/12)
    停止填色()

def 白日() :
    print('5.白日 ')

def 主程式() :
    print('1.主程式')
    紅地()
    青天()
    光芒()
    白日()

主程式()
完成()





白日


可以再次使用問題拆解的思考方法,將白日拆解成兩個圓形。

白日


白日的圓形直徑與圓心座標如下:

白日

(資料來源:4)

有了這些資訊,就可以寫出白日的海龜程式。


範例程式 白日 - - - - - - - (專題實作4/4 接續)

【長度2:12 章節時間如下】

  • 12:00 白日
from 海龜模組 import *
速度('fast')
隱藏游標()

def 紅地() :
    print('2.紅地')
    填充顏色('red')
    開始填色()
    for  in range(2) :
        向前(120)
        右轉(90)
        向前(80)
        右轉(90)
    停止填色()

def 青天() :
    print('3.青天')
    填充顏色('blue')
    開始填色()
    for  in range(2) :
        向前(60)
        右轉(90)
        向前(40)
        右轉(90)
    停止填色()

def 光芒() :
    print('4.光芒')
    停筆()
    走到(15, -20)
    下筆()

    左轉(15)

    畫筆顏色('white')
    填充顏色('white')
    開始填色()
    for  in range(12) :
        向前(29)
        右轉(180-360/12)
    停止填色()

def 白日() :
    print('5.白日 ')
    停筆()
    走到(30 , -20 )
    下筆()

    畫點(17 ,'blue' )
    畫點(15 , 'white')

def 主程式() :
    print('1.主程式')
    紅地()
    青天()
    光芒()
    白日()

主程式()
完成()


這樣就完成了基本的中華民國國旗




📙 擴展(3)

縮放倍率


相信在國旗的基本繪製過程中,會發現新的問題,依原比例繪製的國旗好像太小了,怎麼辦?

放大需求


有新的需求,就會促使我們思考突破,增加更多功能。

想一想,當我們想做放大的國旗時,有哪些性質會跟著放大呢?下圖為長方形及圓形的放大思考。


放大思考


想清楚了嗎?試著來寫寫看倍率放大的國旗。


範例程式 縮放倍率 - - - - - - - (專題擴展1/3 接續)

【長度3:19 章節時間如下】

  • 14:15 縮放倍率
from 海龜模組 import *
視窗設定(1200, 800)
速度('fast')
隱藏游標()

倍率 = 7

def 紅地() :
    print('2.紅地')
    填充顏色('red')
    開始填色()
    for  in range(2) :
        向前(120 * 倍率)
        右轉(90)
        向前(80 * 倍率)
        右轉(90)
    停止填色()   

def 青天() :
    print('3.青天')
    填充顏色('blue')
    開始填色()
    for  in range(2) :
        向前(60 * 倍率)
        右轉(90)
        向前(40 * 倍率)
        右轉(90)
    停止填色()

def 光芒() :
    print('4.光芒')
    停筆()
    走到(15 * 倍率 , -20 * 倍率)
    下筆()

    左轉(15)

    畫筆顏色('white')
    填充顏色('white')
    開始填色()
    for  in range(12) :
        向前(29 * 倍率)
        右轉(180-360/12)
    停止填色()

def 白日() :
    print('5.白日')
    停筆()
    走到(30 * 倍率, -20 * 倍率)
    下筆()

    畫點(17 * 倍率,'blue' )
    畫點(15 * 倍率, 'white')


def 主程式() :
    print('1.主程式') 
    紅地()
    青天()
    光芒()
    白日()    

主程式()
完成()





座標平移


完成縮放倍率的程式後,好像又覺得怪怪的,海龜每次都會從視窗的中心開始畫(原點),所以畫出來的國旗會偏一邊,有辦法讓國旗移到左上方嗎?要注意什麼呢?


平移思考

想好了嗎?試著來寫寫看座標平移的國旗。


範例程式 座標平移 - - - - - - - (專題擴展2/3 接續)

【長度3:02 章節時間如下】

  • 17:37 座標平移
from 海龜模組 import *
視窗設定(1200, 800)
速度('fast')
隱藏游標()

倍率 = 7

起點x = -500
起點y = 300

def 紅地() :
    print('2.紅地')
    填充顏色('red')
    開始填色()
    for  in range(2) :
        向前(120 * 倍率)
        右轉(90)
        向前(80 * 倍率)
        右轉(90)
    停止填色()   

def 青天() :
    print('3.青天')
    填充顏色('blue')
    開始填色()
    for  in range(2) :
        向前(60 * 倍率)
        右轉(90)
        向前(40 * 倍率)
        右轉(90)
    停止填色()

def 光芒() :
    print('4.光芒')
    停筆()
    走到(15 * 倍率 + 起點x , -20 * 倍率 + 起點y)
    下筆()

    左轉(15)

    畫筆顏色('white')
    填充顏色('white')
    開始填色()
    for  in range(12) :
        向前(29 * 倍率)
        右轉(180-360/12)
    停止填色()

def 白日() :
    print('5.白日')
    停筆()
    走到(30 * 倍率 + 起點x , -20 * 倍率 + 起點y)
    下筆()

    畫點(17 * 倍率,'blue' )
    畫點(15 * 倍率, 'white')


def 主程式() :
    print('1.主程式')
    停筆()
    走到(起點x,起點y)
    下筆()

    紅地()
    青天()
    光芒()
    白日()

主程式()
完成()





使用者介面


還有一個在實作過程中會發現的問題,放大縮小的倍率都是使用變數控制,這樣每次都要修改程式,都必須透過設計者修改,有沒有方法克服,讓程式的使用者更方便?

我們可以透過使用者介面的設計,讓使用者輸入想要的值,這樣使用起來會更有彈性。下圖是海龜的「輸入數字」方塊:


使用者介面


實際來寫相關的海龜程式。


範例程式 使用者介面 - - - - - - - (專題擴展3/3 接續)

【長度2:45 章節時間如下】

  • 20:41 使用者介面
from 海龜模組 import *
視窗設定(1200, 800)
速度('fast')
隱藏游標()

倍率 = 輸入數字('中華民國國旗','輸入倍率1-10',5, 1, 10)

起點x = -500
起點y = 300

def 紅地() :
    print('2.紅地')
    填充顏色('red')
    開始填色()
    for  in range(2) :
        向前(120 * 倍率)
        右轉(90)
        向前(80 * 倍率)
        右轉(90)
    停止填色()   

def 青天() :
    print('3.青天')
    填充顏色('blue')
    開始填色()
    for  in range(2) :
        向前(60 * 倍率)
        右轉(90)
        向前(40 * 倍率)
        右轉(90)
    停止填色()

def 光芒() :
    print('4.光芒')
    停筆()
    走到(15 * 倍率 + 起點x , -20 * 倍率 + 起點y)
    下筆()

    左轉(15)

    畫筆顏色('white')
    填充顏色('white')
    開始填色()
    for  in range(12) :
        向前(29 * 倍率)
        右轉(180-360/12)
    停止填色()

def 白日() :
    print('5.白日')
    停筆()
    走到(30 * 倍率 + 起點x , -20 * 倍率 + 起點y)
    下筆()

    畫點(17 * 倍率,'blue' )
    畫點(15 * 倍率, 'white')

def 主程式() :
    print('1.主程式')
    停筆()
    走到(起點x,起點y)
    下筆()

    紅地()
    青天()
    光芒()
    白日()

    點擊後離開()

主程式()
補充資料 使用者介面
維基百科 使用者介面





📒 結語


如果你能跟著一路學習到最後,那真是太棒了。沒想到國旗,還有這麼多講究吧!這些解決問題的相關知識,都是同學們將來會在課堂上學習到的。希望你收獲滿滿,學習愉快。




  1. 311大地震災後送暖 意外牽起台日10年友情, 中央社檔案照片, 來源連結 , 引用時間2022-02-07 

  2. 中華民國內政部 國旗懸掛禮儀網, 來源連結 , 2022-02-07 

  3. 飄揚的中華民國國旗 , by jitcji , 維基百科連結 

  4. by Jason22 , CC BY-SA 3.0, 維基百科連結 . Modified by Chang Wen-Hung , 加入輔助說明 

  5. 自由軟體Scratch融入數學領域教學(王公國小102上半年教師在職資訊應用培訓)