雙十連假來用Python畫個國旗吧
連假前上電腦課,老師出了一份作業要我們使用tkinter視窗的canvas來畫一張圖,並且要以雙十國慶為主題作為回家作業,於是我研究了下網路上的國旗畫法,以及numpy的array的用法,畫了一張國旗。先不討論到底是國旗還黨旗,反正這篇就只是分享一下如何畫國旗。
效果圖
簡單說明
只要更改初始設定unit的值,就可以按照比例改變國旗的大小。
困難的地方
- 不熟悉numpy函數用法,邊做邊惡補
- 圖型對應畫布座標的轉換,需要一些數學運算
- 幾何圖形要用可行(自己會做)的做,要想怎麼拼接成自己要的圖案
簡單說明
畫面藍紅區塊1:4,整體大小3:2。
十二光芒
參考連結 這邊是我覺得比較難的部分,因為想要在tkinter上畫多點的幾何圖形,需要給每個點的座標,然而這種按照特定比例繪製的圖形,要怎麼畫圖呢?我一開始是想要直接連結子、未、巳三點,並且與內圈做一個導航形狀的圖型,這樣只需要旋轉4次,就能完成了,但是困難的點是我的數學太爛,我不知道怎麼算裡面凹進去那點的座標。
建立函數
我研究了一陣子後換了作法,改成畫內圈兩端與外圈頂點的圖型,因為我注意到內圈的直徑等於未巳相連的一半,也剛好等於藍色區塊寬的1/4,這樣只需要轉30\degree
共12次,就可以轉完圖形。於是我先寫了這樣:
1 | flag.create_polygon(x_0, y_0-75, x_0-18.75, y_0, x_0+18.75, y_0, fill="white") |
但現在頭大的是,我要怎麼求其他點的具體座標?我想到的是使用旋轉矩陣,但是要怎麼做呢?其實就是按照定義刻出來,然後我另外寫了一個函數來找旋轉\frac{\pi}{6}
共12次的點。抓到點後,再對每一項進行座標平移就好了。
1 | # -- 工具 |
輸出效果
1 | >get_point(0,-(w/8)) |
用自製函數和迴圈窮舉,並且用numpy array做運算
接下來我只需要抓到三個點,並且一起繞著圓心轉12次,就可以了!
1 | # 畫12個三角型 |
其中比較囉唆的部分,大概就是np.append必須分開加,如果點一多,可能還是要寫個迴圈來處理。因為是要描點,所以這個list的結構大概是兩個為單位,奇數項(1,3,5…)都是代表縱軸,偶數則代表橫軸。所以需要用到slice來處理陣列,這樣才能讓加入對的原點。原點指的是藍色部分的圓心。
1 | > arr2[:,0::2] = arr2[:,0::2]+x_0 |
然後,因為Canvas的create_polygon函數,認得是list,所以還是要把資料從array轉換回list。
1 | > arr2.tolist() |
大概寫到這裡,後面剩下的步驟就只是畫兩個圓,其實像是有些設定的變數有點多餘,例如我一開始設定的值radius完全沒用到,若把w/8換成radius,應該可以讓程式碼更好讀,吧?
完整程式碼
1 | from tkinter import * |
參考資料
Python
旋轉矩陣
國旗規格
Author: Justin Wu
Link: http://hey-series.com/Note/10-10-python-draw-flag/
License: 知識共享署名-非商業性使用 4.0 國際許可協議