閱讀本文只需花費你兩分鐘, 兩分鐘你買不了吃虧,你也買不了上當. 那麼, 為何不靜下心來看看呢? Python 海龜創意繪畫, Turtle庫創作精美圖畫 Author:Amd794 E-mail:[email protected] 全部完整代碼下載地址 前言: 最初來自於 Wally Feurzi ...
閱讀本文只需花費你兩分鐘, 兩分鐘你買不了吃虧,你也買不了上當. 那麼, 為何不靜下心來看看呢?
Python 海龜創意繪畫, Turtle庫創作精美圖畫
Author:Amd794 E-mail:[email protected] 全部完整代碼下載地址
前言
- 最初來自於 Wally Feurzig 和 Seymour Papert 於 1966 年所創造的 Logo 編程語言
- 可以通過相關的指令, 輕鬆地繪製出精美的形狀和圖案
- 可以培養學習電腦的興趣, 以一種娛樂的方式瞭解電腦的趣味
turtle 教程:
- 這個說起來費時間, 而且比較簡單, 博客裡面搜索就好 主要是創作靈感和思路, 本人比較愚笨, 用詞不准不要介意.
- 個人推薦看官方的文檔, https://docs.python.org/zh-cn/3/library/turtle.html
正文:
- 先來個簡單的例子, 我們來用Turtle來寫一段詩詞, 用過的人都知道, Turtle實現寫字是十分簡單的, 那麼, 如何才能把朴素的文字, 變得更吸引人呢? 先來看下我想的. 效果圖如下:
gif圖像, 可能打了一點, 無法上傳, 但這並不影響. 那麼它是怎麼繪製的呢? 莫慌, 我們來看下代碼 , 如下:
1 from turtle import * 2 import random 3 4 str_ = """ 5 守一段情 念一個人。 6 時光不老 我們不散。 7 廝守終生 不離不棄。 8 天暗下來 你就是光。 9 亡魂溺海 止於終老。 10 生死挈闊 與子成說。 11 柔情似水 佳期如夢。 12 我中有你 你中有我。 13 青山不老 為雪白頭。 14 心若向陽 無畏悲傷。 15 一人一心 白首不離。 16 心如荒島 囚我終老。 17 我的世界 只有你懂。 18 你若安好 便是晴天。 19 心有靈犀 一點就通。 20 廝守海角 非你不娶。 21 執子的手 漫漫的走。 22 執子之手 與子偕老。 23 山河拱手 為君一笑。 24 紅塵初妝 山河無疆。 25 千秋功名 一世葬你。 26 既不回頭 何必不忘。 27 既然無緣 何須誓言。 28 今日種種 似水無痕。 29 明夕何夕 君已陌路。 30 才會相思 便害相思。 31 人來人往 繁華似錦。 32 迴首萬年 情衷伊人。 33 生能盡歡 死亦無憾。 34 執手若無 淚濺花上。 35 花開花落 人世無常。 36 入我心者 待以君王。 37 為醉而醉 似醉非醉。 38 傷心鴻影 愛已惘然。 39 只要你要 只要我有。 40 日久生情 日久情疏。 41 憂佳相隨 風雨無悔。 42 有生之年 誓死嬌寵 43 引喻山河 指日可誠。 44 水上鴛鴦 雲中翡翠。 45 天荒地老 海誓山盟。 46 生則同襟 死則同穴。 47 生有此女 夫復何求""".split("。") 48 setup(1280,720) # 設置視窗大小 49 colormode(255) # 使用的顏色模式, 整數還是小數 50 up() 51 a, b = -500, 280 52 goto(a,b) 53 bgcolor("black") 54 55 56 down() 57 def w(str_,b): 58 bgcolor( random.randint(0,255),random.randint(0,255),random.randint(0,255)) # 隨機生成RGB值, 每次調用函數改變背景顏色 59 for i in range(len(str_)): 60 up() 61 goto(a+100*i,b) 62 down() 63 size = random.randint(12,68) # 隨機字體大小 64 color( random.randint(0,255),random.randint(0,255),random.randint(0,255)) # 隨機字體顏色 65 write(str_[i], align="center",font=("楷體",size)) 66 67 68 for k in range(4): 69 for i in range(7): 70 w(str_[i+7*k],b-100*i) 71 reset() # 清屏 72 73 74 for i in range(7): 75 w(str_[i+7*4],b-100*i)簡單文字
2. 這很一般啊, 也沒什麼好看的, 變來變去的,看到我眼睛都花了乛c乛, 也對, 起初我是想背景是動態星空的背景的, 文字通過下拉滑動的方式顯示, 這樣會比較友好, 但是我沒找到合適的, 哈哈哈. 話題跑偏了,抱歉, 那麼, 你能不能拿點***的來呢, 這都吹的吧.好吧, 那麼, 看下下麵的效果, 如下圖:
由於篇幅有限, 顯示部分, 完整代碼在標題 ,代碼如何下:
# 文字個性化 def writez(x, y, str_, size=56, font="華文行楷"): gotopos(x, y) write(str_, font=(font, size)) color("#7d776d") s = "願天化作比翼鳥" s2 = "在地願為連理枝" for i in range(len(s)): writez(560,350-i*50,s[i],36) for i in range(len(s2)): writez(460,350-i*50,s2[i],36) color("#888475") writez(-50, 100, "我") writez(-50, 40, "的") writez(-160, 0, "心", 96) writez(-50, 0, "月", 176) writez(33, -30, "代", 62) writez(-18, -95, "表", 78) writez(-213, -210, "亮", 196)
3. 怎麼樣, 還行吧. 哼, 這也沒什麼難度的, 我也行啊, 好吧, 我們來乾點高級一點的, 我們基於Lsystem來,用turtle優雅的畫一顆樹
-
一個L-系統或Lindenmayer系統是並行重寫系統和類型的形式文法。L系統由可用於製作字元串的符號字母表,用於將每個符號擴展為更大的符號串的生產規則集合,用於開始構建的初始“ 公理 ”字元串以及用於製作字元串的機制組成。將生成的字元串轉換為幾何結構。
- 更多請看 https://github.com/Amd794/Python123/blob/master/README.md
-
變數 : 'FX'
常數 :+ - [] a b c
開始 :'FX'
規則 : 'F': 'aFF-[b-F+F]+[c+F-F]',
'X': 'aFF+[b+F]+[c-F]'角度 :25°
-
好啦, 初始階段已經介紹完畢, 那麼我們開始寫代碼:
1. 先初始化一下變數:
setup(1280,720) # 設置視窗的大小 t.speed(0) # 改變海龜的繪製速度 t.pensize(1) # 可以通過海龜的大小, 來凸顯樹幹與樹枝的粗細差別 length = 5 # 每一次繪製的長度 path = 'FX' # 初始的規則 angle = 25 # 每次變換的角度 expalnation = { 'F': '畫線', 'x': '-', '+': '逆時針旋轉', '-': '順時針旋轉', '[': '記錄當前位置', ']': '恢覆上一個位置', 'a': '上色', 'b': '上色', 'c': '上色' } # 替換的規則 rules = { 'F': 'aFF-[b-F+F]+[c+F-F]', 'X': 'aFF+[b+F]+[c-F]' }
2. 下麵開始應用規則:
def apply_rules(path, rules): L = [_ for _ in path] for i in range(len(L)): symbol = L[i] if symbol == 'F': L[i] = rules[symbol] if symbol == 'X': L[i] = rules[symbol] path = ''.join(L) return path for _ in range(5): path = apply_rules(path, rules)
3. 最後, 開始畫圖:
# 這裡通過映射的方式更佳, 我起初寫前面的例子的時候規則不是很多, 就沒怎麼留意.
def draw_path(path, expalnation): posList, angleList = [], [] t.up() t.goto(0, -350) t.down() t.lt(90) for symbol in path: if symbol == 'F': t.forward(length) elif symbol == '+': t.left(angle) elif symbol == '-': t.rt(angle) elif symbol == '[': posList.append(t.pos()) angleList.append(t.heading()) elif symbol == 'a': t.pensize(3) t.color("#8c503c") elif symbol == 'b': t.pensize(2) t.color("#4ab441") elif symbol == 'c': t.pensize(2) t.color("#18b418") elif symbol == ']': t.up() t.home() t.goto(posList.pop()) t.left(angleList.pop()) t.down()
好, 所有都已準備好了, 我們來看下效果:
哎呀, 好像忘記了改變畫筆大小了, 沒關係,這些後期處理一下就好.那麼本文到此結束.
總結:
- 文章寫的不是很好, 內心戲比較多.
- 更多演示效果代碼下載---->GitHub
- 更多繪圖效果演示, https://www.python123.io/index/turtles/colleges/%E5%B9%BF%E7%94%9F%E6%80%81