情人節,我表白了CSDN小姐姐后,竟然…竟然有人看了這篇文。
以下圖片素材由一個還沒寫完的工具繪制,稍后會放在CSDN的代碼倉庫(現在能用了,還沒時間改,顏色填充算法還沒寫,有能力的朋友可以修改一下):https://codechina.csdn.net/A757291228/draw_pixel/-/tree/master
無情!竟然告訴我有情人節活動
很快呀,啪的一下又一年情人節又來了,本來我壓根記不住的,但是CSDN竟然告訴我有情人節活動。怎么辦?這不能忍,那就只能表白CSDN的小姐姐了。你們要不要一起表白?評論區一起表白吧!
表白肯定要寫寫情書了。結果…一看征文字數要求,竟然600字!你是看不起我嗎?
一封情書根本用不到600字,我200字就寫完了。為什么才寫200字?不要問,問就是是寫不出來600字。
我們要表白哪個小姐姐?
這還要想?當然是全都要了!小孩子才做選擇。
例如小婷婷、小慧慧,這可都是集美貌、才華于一身的女子。
沉魚落雁 小婷婷 閉月羞花 小慧慧
小婷婷是誰?小婷婷就是前幾天博客之星直播中的主持之一!還記得的彈幕中刷屏的“小婷露臉 流量百萬”嗎?在CSDN社群中有一個付費專欄群,小婷婷可是付費專欄群中的第一女神。只要小婷婷在線,群里必是最熱鬧的時候。
那小慧慧又是誰?在微信群中,有一個經常公布信息,到處活躍的運營還記得嗎?名字叫做CSDN博客。她就是小慧慧。小慧慧時而性格溫柔,時而高冷,就像一個冰雪女王!氣質十足!
那怎么樣表白這兩個小姐姐呢?當然是…寫!代!碼!生為一個程序直男一定要把這優點發揚光大!
表白CSDN來一幅圖~
顏色填充還沒寫完,不然肯定這圖片是漂漂亮亮dev~
一、技術實現(這個工具我本人會不斷的迭代更新,包括素材繪制邏輯,因為我要用來畫自媒體素材)
畢竟是要畫畫,首選比較簡單的那就是turtle了。但是turtle畫東西好麻煩,本身自己就是個手殘黨,線條都不懂怎么弄。那怎么辦?那我們就是用“俄羅斯方塊”的畫法吧,那就是疊積木~
我們以方塊作為線條,進行堆疊就可以完成了。
1.1 完成點繪制
我們先引入turtle庫,然后新建一個類,名為core:
from turtle import *class Core:
隨后新建一個core類的方法point,作為基本的方塊點,作為一個線條的基本單位:
'''設置'''#填充顏色色值#@fcolor=點填充顏色def fillcolor_set(self,fcolor="black"):fillcolor(fcolor)#筆桿顏色設置#@fcolor=點填充顏色#@pcolor=線顏色def pencolor_set(self,fcolor="black",pcolor="1"):if pcolor=="1":pcolor=fcolorpencolor(pcolor)else:pencolor(pcolor)#筆桿尺寸#@psize=線尺寸def pensize_set(self,psize=1):pensize(psize)#繪制點#@plenght=點長度#@fcolor=點填充顏色#@pcolor=線顏色#@psize=線尺寸def point(self,plenght=10,fcolor="black",pcolor="1",psize=1):poslist=[]self.fillcolor_set(fcolor)self.pencolor_set(fcolor,pcolor)self.pensize_set(psize)begin_fill()for i in range(0,4):poslist.append(pos())fd(plenght)right(90)end_fill()return poslist
point方法默認plenght為10。也就是說基本方塊為一個正方形,長寬都為plenght;fcolor為填充的顏色,默認為黑色;pcolor為線條的顏色,其實也就是pen color;psize為相對應的筆的粗細。
在方法中,我們使用poslist記錄我們點的每次繪制的位置,這樣的話我們在某些時候就可以使用poslist來進行精確定位了。我們再通過fillcolor_set、pencolor_set、pensize_set方法來設置填充色、線條色、現調大小。
在正式繪制方塊時開啟填充使用begin_fill方法,隨后開始繪制一個“點”。這個“點”的繪制也是非常簡單,直接循環4次,畫出一個矩形即可。并且使用pos方法獲取當前的坐標,隨后結束繪制“點”后使用end_fill方法進行顏色填充。
這樣一個點繪制的方法就完成了。
1.2 完成線段的繪制
點繪制完了接下來我們就需要繪制線了。線從點的基礎上進行堆疊,并排排列那就是線。線的方向可以是上下左右,我們可以通過參數傳遞從而控制線段繪制方向,并且還可以使用對稱方法,讓我們減少繪制難度。對于對稱來說,也有上下左右基于某個中心點的進行的中心對稱。
代碼如下:
#step方法的繪圖跳轉控制#@lenght=總長#@blenght=bit一個位長度#@plenght=點長度#@direction1=橫線繪制方向#@direction2=豎線繪制方向#@fcolor=填充顏色#@pcolor=筆顏色#@psize=筆大小#@gotopos=如何跳轉pos位置#@cout_i=循環控制變量idef step_control_func_draw_move(self,lenght,blenght,plenght,direction1,direction2,fcolor,pcolor,psize,gotopos1,gotopos2,cout_i,height):print('-----------',blenght)posdict={}posdict['line'+str(cout_i)]=self.line(lenght=blenght,plenght=plenght,direction=direction1,fcolor=fcolor,pcolor=pcolor,psize=psize)self.loc_goto(gotopos1)posdict['vline'+str(cout_i)]=self.line(lenght=height,plenght=plenght,direction=direction2,fcolor=fcolor,pcolor=pcolor,psize=psize)if cout_i!=(lenght-1):self.loc_goto(gotopos2)return posdict#繪制線段#@lenght=線長度#@plenght=點長度#@fcolor=點填充顏色#@pcolor=線顏色#@psize=線尺寸def line(self,lenght=1,plenght=10,direction="right",fcolor="white",pcolor="1",psize=1,symmetrical="f",symmetrical_direction="right"):posdict={}symmetrical_point="f"if symmetrical!="f":if symmetrical_direction=="right":symmetrical_point=pos()+(int(symmetrical)*plenght,0)elif symmetrical_direction=="left":symmetrical_point=pos()+(-int(symmetrical)*plenght,0)elif symmetrical_direction=="up":symmetrical_point=pos()+(0,int(symmetrical)*plenght)elif symmetrical_direction=="down":symmetrical_point=pos()+(0,-int(symmetrical)*plenght)for i in range(0,lenght):posdict['point'+str(i)]=self.point(plenght=plenght,fcolor=fcolor,pcolor=pcolor,psize=psize)self.line_control_func_draw_move(i,direction,lenght,plenght)if symmetrical!="f":self.goto_(symmetrical_point)posdict['symmetrical_point']=self.line(lenght=lenght,plenght=plenght,direction=direction,fcolor=fcolor,pcolor=pcolor,psize=psize,symmetrical="f")self.goto_(posdict['point'+str(lenght-1)][3])return posdict
以上代碼我們主要看line方法。line方法參數plenght為需要傳入的點的邊長大小,lenght為這個線有多長;direction為需要從哪邊開始繪制,從左到右繪制,還是從上到下繪制;symmetrical為對稱的位置,symmetrical_direction表示是左右對稱,還是右坐對稱;symmetrical_direction默認為右,表示左邊的繪制線段,將會鏡像到左側,若symmetrical為10,那么對稱位置就是10*邊長大小為對稱位置。
我們接下來看line方法中的代碼,其中symmetrical_point默認為f,若symmetrical傳入參數則表示有對稱需求,這時將會通過傳入對稱位置從而計算x與y的坐標:
symmetrical_point="f"if symmetrical!="f":if symmetrical_direction=="right":symmetrical_point=pos()+(int(symmetrical)*plenght,0)elif symmetrical_direction=="left":symmetrical_point=pos()+(-int(symmetrical)*plenght,0)elif symmetrical_direction=="up":symmetrical_point=pos()+(0,int(symmetrical)*plenght)elif symmetrical_direction=="down":symmetrical_point=pos()+(0,-int(symmetrical)*plenght)
其中左右對稱,那么就是左右兩邊x的正負,如果是上下對稱則需要對y進行操作,上對稱y則正,下對稱則y負。隨后我們開始進行循環點的個數,多長就循環多少次:
for i in range(0,lenght):posdict['point'+str(i)]=self.point(plenght=plenght,fcolor=fcolor,pcolor=pcolor,psize=psize)self.line_control_func_draw_move(i,direction,lenght,plenght)
以上代碼主要查看line_control_func_draw_move方法。line_control_func_draw_move作為控制線段繪制的方法,而point就直接繪制出一個點,如何使繪制開始位置進行控制,就需要查看line_control_func_draw_move:
def line_control_func_draw_move(self,cout_i,direction,lenght,plenght):if cout_i!=(lenght-1):if direction=="right":self.loc_goto((plenght,0))elif direction=="left":self.loc_goto((-plenght,0))elif direction=="up":self.loc_goto((0,plenght))elif direction=="down":self.loc_goto((0,-plenght))elif cout_i==(lenght-1):if direction=="left":self.loc_goto((plenght,0))if direction=="up":self.loc_goto((0,-plenght))
line_control_func_draw_move中,如果是從左往右繪制,只需要通過loc_goto方法直接跳轉到當前位置增加1個基本單位plenght處即可完成下一個繪制位置的控制,loc_goto方法如下:
#跳轉def loc_goto(self,movepos):penup()goto(pos()+movepos)pendown()
最后,我們查看對稱線段的如何繪制,代碼如下:
if symmetrical!="f":self.goto_(symmetrical_point)posdict['symmetrical_point']=self.line(lenght=lenght,plenght=plenght,direction=direction,fcolor=fcolor,pcolor=pcolor,psize=psize,symmetrical="f")self.goto_(posdict['point'+str(lenght-1)][3])
其實對稱線段繪制就很簡單了,直接傳入需要從哪個點開始繪制,隨后調用line方法就可以了,這個時候關閉對稱參數即可。
1.3 完成階梯的繪制
在方塊堆疊的實現的內容中,繪制出來的效果更像是馬賽克風格的圖像,那么階梯的繪制是較為常見的。代碼如下:
#step方法的繪圖跳轉控制#@lenght=總長#@blenght=bit一個位長度#@plenght=點長度#@direction1=橫線繪制方向#@direction2=豎線繪制方向#@fcolor=填充顏色#@pcolor=筆顏色#@psize=筆大小#@gotopos=如何跳轉pos位置#@cout_i=循環控制變量idef step_control_func_draw_move(self,lenght,blenght,plenght,direction1,direction2,fcolor,pcolor,psize,gotopos1,gotopos2,cout_i,height):print('-----------',blenght)posdict={}posdict['line'+str(cout_i)]=self.line(lenght=blenght,plenght=plenght,direction=direction1,fcolor=fcolor,pcolor=pcolor,psize=psize)self.loc_goto(gotopos1)posdict['vline'+str(cout_i)]=self.line(lenght=height,plenght=plenght,direction=direction2,fcolor=fcolor,pcolor=pcolor,psize=psize)if cout_i!=(lenght-1):self.loc_goto(gotopos2)return posdict#繪制線段#@lenght=線長度#@height=線高度#@blenght=bit一個位長度#@plenght=點長度#@fcolor=點填充顏色#@pcolor=線顏色#@psize=線尺寸def step(self,lenght=1,height=1,blenght=1,plenght=10,direction="right",fcolor="black",pcolor="1",psize=1,symmetrical="f",symmetrical_direction="right"):posdict={}symmetrical_point="f"symmetrical_draw_direction=''if symmetrical!="f":if symmetrical_direction=="right":symmetrical_point=pos()+(int(symmetrical)*plenght,0)if direction=="right":symmetrical_draw_direction="left"elif direction=="left":symmetrical_draw_direction="right"elif direction=="rightdown":symmetrical_draw_direction="leftdown"elif direction=="leftdown":symmetrical_draw_direction="rightdown"elif symmetrical_direction=="left":symmetrical_point=pos()+(-int(symmetrical)*plenght,0)if direction=="right":symmetrical_draw_direction="left"elif direction=="left":symmetrical_draw_direction="right"elif direction=="rightdown":symmetrical_draw_direction="leftdown"elif direction=="leftdown":symmetrical_draw_direction="rightdown"elif symmetrical_direction=="rightdown":symmetrical_point=pos()+(0,int(symmetrical)*plenght)if direction=="right":symmetrical_draw_direction="left"elif direction=="left":symmetrical_draw_direction="right"elif direction=="rightdown":symmetrical_draw_direction="leftdown"elif direction=="leftdown":symmetrical_draw_direction="rightdown"elif symmetrical_direction=="leftdown":symmetrical_point=pos()+(0,-int(symmetrical)*plenght)if direction=="right":symmetrical_draw_direction="left"elif direction=="left":symmetrical_draw_direction="right"elif direction=="rightdown":symmetrical_draw_direction="leftdown"elif direction=="leftdown":symmetrical_draw_direction="rightdown"for i in range(0,lenght):if direction=="right":posdict["step"+str(i)]=self.step_control_func_draw_move(lenght,blenght,plenght,direction,"up",fcolor,pcolor,psize,(plenght,plenght),(plenght,plenght*2),i,height)elif direction=="left":posdict["step"+str(i)]=self.step_control_func_draw_move(lenght,blenght,plenght,"left","up",fcolor,pcolor,psize,(-plenght*2,plenght),(-plenght,plenght*2),i,height)elif direction=="rightdown":posdict["step"+str(i)]=self.step_control_func_draw_move(lenght,blenght,plenght,"right","down",fcolor,pcolor,psize,(plenght,-plenght),(plenght,-plenght),i,height)elif direction=="leftdown":posdict["step"+str(i)]=self.step_control_func_draw_move(lenght,blenght,plenght,"left","down",fcolor,pcolor,psize,(-plenght*2,-plenght),(-plenght,-plenght),i,height)#對稱if symmetrical!="f":self.goto_(symmetrical_point)posdict['symmetrical_step']=self.step(lenght=lenght,height=height,blenght=blenght,plenght=plenght,direction=symmetrical_draw_direction,fcolor=fcolor,pcolor=pcolor,psize=psize)print(posdict)self.goto_(posdict['step'+str(lenght-1)]['vline'+str(lenght-1)]['point'+str(height-1)][0])return posdict
其實階梯的繪制方法跟線段原理是一致的。首先看一下繪制控制:
for i in range(0,lenght):if direction=="right":posdict["step"+str(i)]=self.step_control_func_draw_move(lenght,blenght,plenght,direction,"up",fcolor,pcolor,psize,(plenght,plenght),(plenght,plenght*2),i,height)elif direction=="left":posdict["step"+str(i)]=self.step_control_func_draw_move(lenght,blenght,plenght,"left","up",fcolor,pcolor,psize,(-plenght*2,plenght),(-plenght,plenght*2),i,height)elif direction=="rightdown":posdict["step"+str(i)]=self.step_control_func_draw_move(lenght,blenght,plenght,"right","down",fcolor,pcolor,psize,(plenght,-plenght),(plenght,-plenght),i,height)elif direction=="leftdown":posdict["step"+str(i)]=self.step_control_func_draw_move(lenght,blenght,plenght,"left","down",fcolor,pcolor,psize,(-plenght*2,-plenght),(-plenght,-plenght),i,height)
階梯的繪制方向我們有左上、左下、右上和右下,這個時候直接判斷繪制內容,隨后使用控制方法控制即可:
#step方法的繪圖跳轉控制#@lenght=總長#@blenght=bit一個位長度#@plenght=點長度#@direction1=橫線繪制方向#@direction2=豎線繪制方向#@fcolor=填充顏色#@pcolor=筆顏色#@psize=筆大小#@gotopos=如何跳轉pos位置#@cout_i=循環控制變量idef step_control_func_draw_move(self,lenght,blenght,plenght,direction1,direction2,fcolor,pcolor,psize,gotopos1,gotopos2,cout_i,height):print('-----------',blenght)posdict={}posdict['line'+str(cout_i)]=self.line(lenght=blenght,plenght=plenght,direction=direction1,fcolor=fcolor,pcolor=pcolor,psize=psize)self.loc_goto(gotopos1)posdict['vline'+str(cout_i)]=self.line(lenght=height,plenght=plenght,direction=direction2,fcolor=fcolor,pcolor=pcolor,psize=psize)if cout_i!=(lenght-1):self.loc_goto(gotopos2)return posdict
控制方法此時就不像線段那樣只移動一個坐標位置,階梯需要x和y坐標都進行增刪才可以實現,同理可得就不再贅述內容了。
1.4完整的core類代碼
至此,完整的core類基本代碼就已經寫完了,代碼如下:
from turtle import *class Core:'''設置'''#填充顏色色值#@fcolor=點填充顏色def fillcolor_set(self,fcolor="black"):fillcolor(fcolor)#筆桿顏色設置#@fcolor=點填充顏色#@pcolor=線顏色def pencolor_set(self,fcolor="black",pcolor="1"):if pcolor=="1":pcolor=fcolorpencolor(pcolor)else:pencolor(pcolor)#筆桿尺寸#@psize=線尺寸def pensize_set(self,psize=1):pensize(psize)'''other func '''#跳轉def loc_goto(self,movepos):penup()goto(pos()+movepos)pendown()def goto_(self,pos_):penup()goto(pos_)pendown()#line方法的繪圖跳轉控制def line_control_func_draw_move(self,cout_i,direction,lenght,plenght):if cout_i!=(lenght-1):if direction=="right":self.loc_goto((plenght,0))elif direction=="left":self.loc_goto((-plenght,0))elif direction=="up":self.loc_goto((0,plenght))elif direction=="down":self.loc_goto((0,-plenght))elif cout_i==(lenght-1):if direction=="left":self.loc_goto((plenght,0))if direction=="up":self.loc_goto((0,-plenght))#step方法的繪圖跳轉控制#@lenght=總長#@blenght=bit一個位長度#@plenght=點長度#@direction1=橫線繪制方向#@direction2=豎線繪制方向#@fcolor=填充顏色#@pcolor=筆顏色#@psize=筆大小#@gotopos=如何跳轉pos位置#@cout_i=循環控制變量idef step_control_func_draw_move(self,lenght,blenght,plenght,direction1,direction2,fcolor,pcolor,psize,gotopos1,gotopos2,cout_i,height):print('-----------',blenght)posdict={}posdict['line'+str(cout_i)]=self.line(lenght=blenght,plenght=plenght,direction=direction1,fcolor=fcolor,pcolor=pcolor,psize=psize)self.loc_goto(gotopos1)posdict['vline'+str(cout_i)]=self.line(lenght=height,plenght=plenght,direction=direction2,fcolor=fcolor,pcolor=pcolor,psize=psize)if cout_i!=(lenght-1):self.loc_goto(gotopos2)return posdict'''繪制'''#繪制點#@plenght=點長度#@fcolor=點填充顏色#@pcolor=線顏色#@psize=線尺寸def point(self,plenght=10,fcolor="black",pcolor="1",psize=1):poslist=[]self.fillcolor_set(fcolor)self.pencolor_set(fcolor,pcolor)self.pensize_set(psize)begin_fill()for i in range(0,4):poslist.append(pos())fd(plenght)right(90)end_fill()return poslist#繪制線段#@lenght=線長度#@plenght=點長度#@fcolor=點填充顏色#@pcolor=線顏色#@psize=線尺寸def line(self,lenght=1,plenght=10,direction="right",fcolor="white",pcolor="1",psize=1,symmetrical="f",symmetrical_direction="right"):posdict={}symmetrical_point="f"if symmetrical!="f":if symmetrical_direction=="right":symmetrical_point=pos()+(int(symmetrical)*plenght,0)elif symmetrical_direction=="left":symmetrical_point=pos()+(-int(symmetrical)*plenght,0)elif symmetrical_direction=="up":symmetrical_point=pos()+(0,int(symmetrical)*plenght)elif symmetrical_direction=="down":symmetrical_point=pos()+(0,-int(symmetrical)*plenght)for i in range(0,lenght):posdict['point'+str(i)]=self.point(plenght=plenght,fcolor=fcolor,pcolor=pcolor,psize=psize)self.line_control_func_draw_move(i,direction,lenght,plenght)if symmetrical!="f":self.goto_(symmetrical_point)posdict['symmetrical_point']=self.line(lenght=lenght,plenght=plenght,direction=direction,fcolor=fcolor,pcolor=pcolor,psize=psize,symmetrical="f")self.goto_(posdict['point'+str(lenght-1)][3])return posdict #繪制線段#@lenght=線長度#@height=線高度#@blenght=bit一個位長度#@plenght=點長度#@fcolor=點填充顏色#@pcolor=線顏色#@psize=線尺寸def step(self,lenght=1,height=1,blenght=1,plenght=10,direction="right",fcolor="black",pcolor="1",psize=1,symmetrical="f",symmetrical_direction="right"):posdict={}symmetrical_point="f"symmetrical_draw_direction=''if symmetrical!="f":if symmetrical_direction=="right":symmetrical_point=pos()+(int(symmetrical)*plenght,0)if direction=="right":symmetrical_draw_direction="left"elif direction=="left":symmetrical_draw_direction="right"elif direction=="rightdown":symmetrical_draw_direction="leftdown"elif direction=="leftdown":symmetrical_draw_direction="rightdown"elif symmetrical_direction=="left":symmetrical_point=pos()+(-int(symmetrical)*plenght,0)if direction=="right":symmetrical_draw_direction="left"elif direction=="left":symmetrical_draw_direction="right"elif direction=="rightdown":symmetrical_draw_direction="leftdown"elif direction=="leftdown":symmetrical_draw_direction="rightdown"elif symmetrical_direction=="rightdown":symmetrical_point=pos()+(0,int(symmetrical)*plenght)if direction=="right":symmetrical_draw_direction="left"elif direction=="left":symmetrical_draw_direction="right"elif direction=="rightdown":symmetrical_draw_direction="leftdown"elif direction=="leftdown":symmetrical_draw_direction="rightdown"elif symmetrical_direction=="leftdown":symmetrical_point=pos()+(0,-int(symmetrical)*plenght)if direction=="right":symmetrical_draw_direction="left"elif direction=="left":symmetrical_draw_direction="right"elif direction=="rightdown":symmetrical_draw_direction="leftdown"elif direction=="leftdown":symmetrical_draw_direction="rightdown"for i in range(0,lenght):if direction=="right":posdict["step"+str(i)]=self.step_control_func_draw_move(lenght,blenght,plenght,direction,"up",fcolor,pcolor,psize,(plenght,plenght),(plenght,plenght*2),i,height)elif direction=="left":posdict["step"+str(i)]=self.step_control_func_draw_move(lenght,blenght,plenght,"left","up",fcolor,pcolor,psize,(-plenght*2,plenght),(-plenght,plenght*2),i,height)elif direction=="rightdown":posdict["step"+str(i)]=self.step_control_func_draw_move(lenght,blenght,plenght,"right","down",fcolor,pcolor,psize,(plenght,-plenght),(plenght,-plenght),i,height)elif direction=="leftdown":posdict["step"+str(i)]=self.step_control_func_draw_move(lenght,blenght,plenght,"left","down",fcolor,pcolor,psize,(-plenght*2,-plenght),(-plenght,-plenght),i,height)#對稱if symmetrical!="f":self.goto_(symmetrical_point)posdict['symmetrical_step']=self.step(lenght=lenght,height=height,blenght=blenght,plenght=plenght,direction=symmetrical_draw_direction,fcolor=fcolor,pcolor=pcolor,psize=psize)print(posdict)self.goto_(posdict['step'+str(lenght-1)]['vline'+str(lenght-1)]['point'+str(height-1)][0])return posdict
1.5再次封裝,邏輯繪圖
但是我們的繪制方法需要自己敲代碼,是不是覺得很麻煩?我們那么懶,那么就再寫個方法封裝一下,讓我們直接使用比較輕松的方式進行線段繪制吧。新建一個文件,叫做drawTools,引入core類以及turtle:
from core import Core
from turtle import *
我們新建一個類,繼承Core,叫做Tools:
class Tools(Core):
我們甚至可以直接做輔助線,如何做?很簡單,畫格子就可以了,直接把輔助線的繪制方法寫在init方法中吧:
width,height=0,0def __init__(self,open=False,helperline='red'):width=window_width()height=window_height()#行列lines=int(height/10)rows=int(width/10)#左上角leftx=-int(width/2)topy=int(height/2)self.goto_((leftx,topy))if open==True:for l in range(lines):nowpos=pos()-(0,0)self.line(rows,10,pcolor=helperline)topy-=10self.goto_((leftx,topy))qx,qy=-160,160self.goto_((qx,qy))for l in range(32):nowpos=pos()-(0,0)self.line(32,10,pcolor="blue")qy-=10self.goto_((qx,qy))qx,qy=-80,80self.goto_((qx,qy))for l in range(16):nowpos=pos()-(0,0)self.line(16,10,pcolor="green")qy-=10self.goto_((qx,qy))qx,qy=-20,20self.goto_((qx,qy))for l in range(4):nowpos=pos()-(0,0)self.line(4,10,pcolor="red")qy-=10self.goto_((qx,qy))self.goto_((0,0))
init接收2個參數,一個是open,決定是否開啟輔助線,helperline則是輔助線的顏色。
我們首先需要獲取整個canvas畫布的長寬,以及我們輔助線可以有多長,還有就是左上角繪制起始點的位置,隨后跳到該位置準備進行繪制:
width=window_width()height=window_height()#行列lines=int(height/10)rows=int(width/10)#左上角leftx=-int(width/2)topy=int(height/2)self.goto_((leftx,topy))
隨后就是簡單的代碼進行畫格子了,為了比較清晰,我們可以分別用不同顏色進行區分:
if open==True:for l in range(lines):nowpos=pos()-(0,0)self.line(rows,10,pcolor=helperline)topy-=10self.goto_((leftx,topy))qx,qy=-160,160self.goto_((qx,qy))for l in range(32):nowpos=pos()-(0,0)self.line(32,10,pcolor="blue")qy-=10self.goto_((qx,qy))qx,qy=-80,80self.goto_((qx,qy))for l in range(16):nowpos=pos()-(0,0)self.line(16,10,pcolor="green")qy-=10self.goto_((qx,qy))qx,qy=-20,20self.goto_((qx,qy))for l in range(4):nowpos=pos()-(0,0)self.line(4,10,pcolor="red")qy-=10self.goto_((qx,qy))self.goto_((0,0))
以上代碼中的qx,qy則是到達該區域后進行的不同顏色的繪制,代碼沒有優化,所以就將就著看著吧。(可以用我就懶了,哈哈哈)最后跳轉到0,0中心點。
那么接下來我們需要使用比較簡單的方式進行繪制內容了。新建一個方法叫做drawlines:
#繪制線段 'length:2;direction:down;fcolor:black;pos:(0,-100);symmetrical:13'def drawlines(self,drawcon=[],startpos=(0,0)):for c in drawcon:c_val=c.split(';')length=0direction=''fcolor=''posv=Nonesymmetrical='f'symmetrical_direction="right"line_type='line'for v in c_val:demens=v.split(':')if demens[0]=='length':length=int(demens[1])elif demens[0]=='direction':direction=demens[1]elif demens[0]=='fcolor':fcolor=demens[1]elif demens[0]=='pos':posval=demens[1].split(',')posv=(int(posval[0])+startpos[0],int(posval[1])+startpos[1])elif demens[0]=='symmetrical':symmetrical=int(demens[1])elif demens[0]=='symmetrical_direction':symmetrical_direction=demens[1]elif demens[0]=='line_type':line_type=demens[1]self.goto_(posv)if line_type=='line':self.line(length,fcolor=fcolor,direction=direction,symmetrical=symmetrical,symmetrical_direction=symmetrical_direction)
接收參數drawcon為一個列表,列表里面包含了繪制邏輯,繪制邏輯示例為:length:2;direction:down;fcolor:black;pos:(0,-100);symmetrical:13
,length表示長度多少,direction表示從繪制點往下畫還是往左、往右、往上畫,fcolor為填充顏色yay,pos為其實繪制點,symmetrical表示對稱位置,默認對稱為右對稱鏡像。
我們的命令是使用分號進行分隔,由于我們的一張圖片不止一條線段,所以我們直接使用循環遍歷列表的內容。遍歷內容時,使用split分隔字符即可。
for c in drawcon:c_val=c.split(';')length=0direction=''fcolor=''posv=Nonesymmetrical='f'symmetrical_direction="right"line_type='line'
以上一些變量是作為局部變量方便接下來使用而已,用法基礎,內容就不再贅述了。隨后使用分號進行分隔后得到一組一組的數據,例如length:2、direction:down…他們之間使用的是冒號進行分隔,那么再遍歷內容,進行冒號分隔即可。這個時候獲取他們的第0維度的文本就可以知道是什么數據了,隨后使用局部變量賦值,最后傳入到line方法中,這樣的話就可以通過字符串形式調用lline方法了,而且及其簡單:
for v in c_val:demens=v.split(':')if demens[0]=='length':length=int(demens[1])elif demens[0]=='direction':direction=demens[1]elif demens[0]=='fcolor':fcolor=demens[1]elif demens[0]=='pos':posval=demens[1].split(',')posv=(int(posval[0])+startpos[0],int(posval[1])+startpos[1])elif demens[0]=='symmetrical':symmetrical=int(demens[1])elif demens[0]=='symmetrical_direction':symmetrical_direction=demens[1]elif demens[0]=='line_type':line_type=demens[1]self.goto_(posv)if line_type=='line':self.line(length,fcolor=fcolor,direction=direction,symmetrical=symmetrical,symmetrical_direction=symmetrical_direction)
1.6完整的邏輯繪圖類代碼
這個時候再次封裝將會使我們的代碼變得十分簡單。完整的代碼如下:
from core import Core
from turtle import *class Tools(Core):width,height=0,0def __init__(self,open=False,helperline='red'):width=window_width()height=window_height()#行列lines=int(height/10)rows=int(width/10)#左上角leftx=-int(width/2)topy=int(height/2)self.goto_((leftx,topy))if open==True:for l in range(lines):nowpos=pos()-(0,0)self.line(rows,10,pcolor=helperline)topy-=10self.goto_((leftx,topy))qx,qy=-160,160self.goto_((qx,qy))for l in range(32):nowpos=pos()-(0,0)self.line(32,10,pcolor="blue")qy-=10self.goto_((qx,qy))qx,qy=-80,80self.goto_((qx,qy))for l in range(16):nowpos=pos()-(0,0)self.line(16,10,pcolor="green")qy-=10self.goto_((qx,qy))qx,qy=-20,20self.goto_((qx,qy))for l in range(4):nowpos=pos()-(0,0)self.line(4,10,pcolor="red")qy-=10self.goto_((qx,qy))self.goto_((0,0))#繪制線段 'length:2;direction:down;fcolor:black;pos:(0,-100);symmetrical:13'def drawlines(self,drawcon=[],startpos=(0,0)):for c in drawcon:c_val=c.split(';')length=0direction=''fcolor=''posv=Nonesymmetrical='f'symmetrical_direction="right"line_type='line'for v in c_val:demens=v.split(':')if demens[0]=='length':length=int(demens[1])elif demens[0]=='direction':direction=demens[1]elif demens[0]=='fcolor':fcolor=demens[1]elif demens[0]=='pos':posval=demens[1].split(',')posv=(int(posval[0])+startpos[0],int(posval[1])+startpos[1])elif demens[0]=='symmetrical':symmetrical=int(demens[1])elif demens[0]=='symmetrical_direction':symmetrical_direction=demens[1]elif demens[0]=='line_type':line_type=demens[1]self.goto_(posv)if line_type=='line':self.line(length,fcolor=fcolor,direction=direction,symmetrical=symmetrical,symmetrical_direction=symmetrical_direction)
1.7 實例
現在我想畫個狗頭,只需要編寫出繪制邏輯,如下:
#dog face
dog_face=[#耳朵'length:9;direction:down;fcolor:black;pos:0,0;symmetrical:20;','length:2;direction:right;fcolor:black;pos:10,10;symmetrical:17;','length:1;direction:right;fcolor:black;pos:30,0;symmetrical:14;','length:1;direction:right;fcolor:black;pos:40,-10;symmetrical:12;','length:11;direction:right;fcolor:black;pos:50,-20;','length:1;direction:right;fcolor:black;pos:40,-30;symmetrical:12;','length:2;direction:down;fcolor:black;pos:30,-40;symmetrical:14;','length:2;direction:right;fcolor:black;pos:10,-60;symmetrical:17;',#臉蛋'length:7;direction:down;fcolor:black;pos:-10,-90;symmetrical:22;','length:2;direction:down;fcolor:black;pos:0,-160;symmetrical:20;','length:2;direction:right;fcolor:black;pos:10,-180;symmetrical:17;','length:2;direction:down;fcolor:black;pos:30,-190;symmetrical:14;','length:1;direction:down;fcolor:black;pos:40,-210;','length:2;direction:right;fcolor:black;pos:150,-210;','length:10;direction:right;fcolor:black;pos:50,-220;',#眼眶'length:2;direction:down;fcolor:black;pos:0,-110;symmetrical:12;','length:6;direction:right;fcolor:black;pos:10,-100;symmetrical:12;','length:2;direction:down;fcolor:black;pos:70,-110;symmetrical:12;','length:6;direction:right;fcolor:black;pos:10,-130;symmetrical:12;',#眼珠'length:2;direction:down;fcolor:black;pos:60,-110;symmetrical:12;','length:1;direction:down;fcolor:gray;pos:50,-110;symmetrical:12;','length:1;direction:down;fcolor:black;pos:50,-120;symmetrical:12;',#鼻子嘴巴'length:2;direction:down;fcolor:black;pos:70,-150;symmetrical:2;','length:5;direction:down;fcolor:black;pos:80,-150;','length:7;direction:right;fcolor:black;pos:60,-200;','length:1;direction:right;fcolor:black;pos:130,-190;','length:1;direction:right;fcolor:black;pos:140,-180;',
]
然后引入庫:
from drawTools import Tools
from turtle import *
調用工具即可:
tool=Tools()
tracer(5,1)tool.drawlines(zan)
狗頭就完成了:
再畫個程序員吧:
邏輯如下:
#programer
programer=[#頭發'length:3;direction:right;fcolor:black;pos:0,0;','length:11;direction:right;fcolor:black;pos:30,10;','length:2;direction:right;fcolor:black;pos:140,0;','length:1;direction:right;fcolor:black;pos:160,-10;','length:3;direction:right;fcolor:black;pos:170,-20;','length:4;direction:down;fcolor:black;pos:200,-30;','length:2;direction:left;fcolor:black;pos:190,-70;','length:2;direction:left;fcolor:black;pos:170,-80;','length:5;direction:up;fcolor:black;pos:150,-70;','length:2;direction:up;fcolor:black;pos:140,-70;','length:3;direction:left;fcolor:black;pos:140,-70;','length:3;direction:left;fcolor:black;pos:110,-80;','length:1;direction:left;fcolor:black;pos:80,-70;','length:2;direction:left;fcolor:black;pos:70,-80;','length:1;direction:left;fcolor:black;pos:50,-70;','length:3;direction:down;fcolor:black;pos:40,-60;','length:4;direction:left;fcolor:black;pos:30,-80;','length:5;direction:down;fcolor:black;pos:-10,-80;',#左側臉最左側坐標'length:2;direction:up;fcolor:black;pos:-20,-110;','length:8;direction:up;fcolor:black;pos:-30,-100;','length:1;direction:up;fcolor:black;pos:-20,-20;','length:1;direction:up;fcolor:black;pos:-10,-10;',#臉廓'length:2;direction:down;fcolor:black;pos:0,-130;','length:6;direction:down;fcolor:black;pos:10,-150;','length:1;direction:down;fcolor:black;pos:20,-210;','length:12;direction:right;fcolor:black;pos:30,-220;','length:1;direction:right;fcolor:black;pos:150,-210;','length:1;direction:right;fcolor:black;pos:160,-200;','length:11;direction:up;fcolor:black;pos:170,-190;',#眼睛'length:4;direction:right;fcolor:black;pos:40,-105;symmetrical:8;',#眉毛'length:2;direction:down;fcolor:black;pos:70,-125;symmetrical:5;',#嘴巴'length:2;direction:down;fcolor:black;pos:50,-175;symmetrical:8;','length:2;direction:down;fcolor:black;pos:50,-175;symmetrical:8;','length:7;direction:right;fcolor:black;pos:60,-195;',
]
再點個贊:
邏輯:
#贊
zan=[#袖子'length:6;direction:down;fcolor:black;pos:0,0;symmetrical:3;', 'length:4;direction:right;fcolor:black;pos:0,10;symmetrical:7;symmetrical_direction:down;', #拇指'length:1;direction:down;fcolor:black;pos:40,10;','length:1;direction:down;fcolor:black;pos:50,20;symmetrical:4;','length:1;direction:down;fcolor:black;pos:60,30;','length:3;direction:up;fcolor:black;pos:70,40;','length:1;direction:up;fcolor:black;pos:80,70;symmetrical:2;','length:2;direction:right;fcolor:black;pos:90,80;','length:6;direction:down;fcolor:black;pos:100,80;',#握拳'length:6;direction:right;fcolor:black;pos:80,10;','length:6;direction:down;fcolor:black;pos:140,10;','length:1;direction:down;fcolor:black;pos:130,-50;','length:9;direction:left;fcolor:black;pos:120,-60;',
]
當然還有更多的邏輯代碼如下:
drawcon=['length:4;direction:down;fcolor:black;pos:0,0','length:6;direction:down;fcolor:black;pos:-10,-40','length:2;direction:down;fcolor:black;pos:0,-100;symmetrical:13','length:2;direction:right;fcolor:black;pos:10,-120;symmetrical:10','length:8;direction:right;fcolor:black;pos:30,-130','length:8;direction:down;fcolor:black;pos:140,-20','length:2;direction:down;fcolor:black;pos:130,0','length:3;direction:right;fcolor:black;pos:100,10','length:2;direction:down;fcolor:black;pos:90,0','length:5;direction:left;fcolor:black;pos:90,-20','length:2;direction:up;fcolor:black;pos:40,-20','length:3;direction:left;fcolor:black;pos:30,0','length:1;direction:left;fcolor:black;pos:0,-60;symmetrical:13','length:1;direction:down;fcolor:black;pos:0,-80;symmetrical:13','length:2;direction:down;fcolor:black;pos:30,-70;symmetrical:7','length:2;direction:right;fcolor:black;pos:60,-90',]drawcon1=['length:1;direction:down;fcolor:black;pos:0,0','length:3;direction:down;fcolor:black;pos:-10,-10','length:2;direction:right;fcolor:black;pos:0,-40','length:2;direction:right;fcolor:black;pos:10,-20','length:1;direction:right;fcolor:black;pos:20,-30','length:1;direction:right;fcolor:black;pos:20,-30','length:2;direction:right;fcolor:black;pos:30,-40','length:1;direction:right;fcolor:black;pos:40,-50','length:2;direction:right;fcolor:black;pos:50,-60','length:1;direction:right;fcolor:black;pos:70,-50','length:3;direction:up;fcolor:black;pos:80,-40','length:2;direction:left;fcolor:black;pos:70,-10','length:2;direction:down;fcolor:black;pos:50,-20','length:2;direction:left;fcolor:black;pos:40,-10','length:2;direction:up;fcolor:black;pos:20,0','length:1;direction:left;fcolor:black;pos:10,10',]human_head=['length:26;direction:right;fcolor:black;pos:0,0;symmetrical:21;symmetrical_direction:down','length:21;direction:down;fcolor:black;pos:0,0;symmetrical:25;','length:7;direction:right;fcolor:black;pos:20,-85;symmetrical:14;','length:1;direction:down;fcolor:black;pos:120,-152;symmetrical:2;symmetrical_direction:down;','length:1;direction:down;fcolor:black;pos:110,-162;symmetrical:2;symmetrical_direction:down;','length:3;direction:right;fcolor:black;pos:120,-192;',
]web=['length:32;direction:right;fcolor:black;pos:0,0;symmetrical:21;symmetrical_direction:down', 'length:21;direction:down;fcolor:black;pos:0,0;symmetrical:31;','length:4;direction:down;fcolor:black;pos:160,-210;','length:17;direction:right;fcolor:black;pos:80,-250;','length:6;direction:right;fcolor:blue;pos:20,-50;','length:6;direction:right;fcolor:blue;pos:50,-70;',
]phone=['length:16;direction:right;fcolor:black;pos:0,0;symmetrical:20;symmetrical_direction:down', 'length:20;direction:down;fcolor:black;pos:0,0;symmetrical:15;','length:16;direction:right;fcolor:black;pos:0,-170;','length:1;direction:right;fcolor:black;pos:75,-185;',
]spider=['length:17;direction:right;fcolor:black;pos:0,0;symmetrical:11;symmetrical_direction:down','length:11;direction:down;fcolor:black;pos:0,0;symmetrical:16;','length:6;direction:right;fcolor:black;pos:20,-20;symmetrical:6;symmetrical_direction:down','length:6;direction:down;fcolor:black;pos:20,-20;symmetrical:5;','length:6;direction:right;fcolor:black;pos:90,-20;symmetrical:6;symmetrical_direction:down','length:6;direction:down;fcolor:black;pos:90,-20;symmetrical:5;','length:2;direction:right;fcolor:black;pos:40,-40;symmetrical:7;','length:2;direction:right;fcolor:black;pos:40,-50;symmetrical:7;','length:6;direction:left;fcolor:black;pos:0,-20;symmetrical:22;',#第一根腿'length:3;direction:down;fcolor:black;pos:-60,-20;symmetrical:28;','length:7;direction:left;fcolor:black;pos:0,-60;symmetrical:23;',#中間腿'length:8;direction:left;fcolor:black;pos:0,-80;symmetrical:24;',#最前面的腿'length:4;direction:down;fcolor:black;pos:-80,-80;symmetrical:32;',
]camera=['length:26;direction:right;fcolor:black;pos:0,0;symmetrical:14;symmetrical_direction:down','length:14;direction:down;fcolor:black;pos:0,0;symmetrical:25;','length:6;direction:right;fcolor:black;pos:20,-30;symmetrical:4;symmetrical_direction:down','length:4;direction:down;fcolor:black;pos:20,-30;symmetrical:5;','length:3;direction:right;fcolor:black;pos:200,-20;',
]led=['length:8;direction:right;fcolor:black;pos:0,0','length:1;direction:right;fcolor:black;pos:-10,-10;symmetrical:9;','length:9;direction:down;fcolor:black;pos:-20,-20;symmetrical:11;','length:1;direction:down;fcolor:black;pos:-10,-110;symmetrical:9;','length:1;direction:down;fcolor:black;pos:0,-120;symmetrical:7;','length:1;direction:down;fcolor:black;pos:10,-130;symmetrical:5;','length:4;direction:right;fcolor:black;pos:20,-150;symmetrical:2;symmetrical_direction:down',#燈座'length:2;direction:up;fcolor:black;pos:0,20',#燈光'length:2;direction:up;fcolor:black;pos:20,20','length:2;direction:up;fcolor:black;pos:40,20','length:2;direction:up;fcolor:black;pos:60,20','length:2;direction:up;fcolor:black;pos:80,20',]#----------------------------
#哭臉
cry_face=['length:26;direction:right;fcolor:black;pos:0,0;symmetrical:21;symmetrical_direction:down','length:21;direction:down;fcolor:black;pos:0,0;symmetrical:25;','length:7;direction:right;fcolor:black;pos:20,-85;symmetrical:14;','length:12;direction:down;fcolor:black;pos:20,-105;symmetrical:14;','length:12;direction:down;fcolor:black;pos:80,-105;symmetrical:14;','length:5;direction:right;fcolor:black;pos:100,-145;',
]#蘋果
apple=['length:2;direction:right;fcolor:black;pos:0,0;symmetrical:10;symmetrical_direction:down','length:1;direction:right;fcolor:black;pos:20,-10;symmetrical:8;symmetrical_direction:down',#蘋果凹坑'length:3;direction:right;fcolor:black;pos:30,0;symmetrical:10;symmetrical_direction:down','length:1;direction:right;fcolor:black;pos:-10,-10;symmetrical:8;symmetrical_direction:down','length:1;direction:right;fcolor:black;pos:-20,-20;symmetrical:6;symmetrical_direction:down','length:5;direction:down;fcolor:black;pos:-30,-30;','length:1;direction:right;fcolor:black;pos:60,-10;symmetrical:8;symmetrical_direction:down',#咬痕'length:1;direction:right;fcolor:black;pos:50,-20;symmetrical:6;symmetrical_direction:down','length:1;direction:left;fcolor:black;pos:40,-30;symmetrical:4;symmetrical_direction:down','length:3;direction:down;fcolor:black;pos:30,-40;','length:1;direction:down;fcolor:black;pos:20,20;',#葉子'length:2;direction:right;fcolor:black;pos:30,30;','length:1;direction:down;fcolor:black;pos:50,40;',
]#書本
notebook=['length:12;direction:right;fcolor:black;pos:0,0;symmetrical:21;symmetrical_direction:down','length:1;direction:right;fcolor:black;pos:120,-10;symmetrical:21;symmetrical_direction:down',#凹'length:13;direction:right;fcolor:black;pos:130,0;symmetrical:21;symmetrical_direction:down','length:21;direction:down;fcolor:black;pos:0,0;symmetrical:25;','length:5;direction:down;fcolor:black;pos:120,-10;',#中間
]
#字母
letter_p=['length:21;direction:down;fcolor:black;pos:0,0;','length:6;direction:right;fcolor:black;pos:0,0;symmetrical:8;symmetrical_direction:down','length:1;direction:right;fcolor:black;pos:60,-10;symmetrical:6;symmetrical_direction:down','length:5;direction:down;fcolor:black;pos:70,-20;',
]
letter_h=['length:21;direction:down;fcolor:black;pos:0,0;symmetrical:13;symmetrical_direction:right','length:13;direction:right;fcolor:black;pos:0,-80;',
]
letter_t=['length:13;direction:right;fcolor:black;pos:0,0;','length:18;direction:down;fcolor:black;pos:60,0;',
]
letter_m=['length:20;direction:right;fcolor:black;pos:0,0;','length:21;direction:down;fcolor:black;pos:0,0;symmetrical:20;symmetrical_direction:right','length:21;direction:down;fcolor:black;pos:100,0;',
]
letter_l=['length:21;direction:down;fcolor:black;pos:0,0;','length:14;direction:right;fcolor:black;pos:0,-210;',
]
letter_s=['length:10;direction:right;fcolor:black;pos:0,0;','length:10;direction:down;fcolor:black;pos:0,0;','length:10;direction:right;fcolor:black;pos:0,-100;symmetrical:9;symmetrical_direction:down','length:10;direction:down;fcolor:black;pos:100,-100;',
]letter_q=['length:10;direction:right;fcolor:black;pos:0,0;symmetrical:20;symmetrical_direction:down','length:20;direction:down;fcolor:black;pos:0,0;symmetrical:10;symmetrical_direction:right','length:5;direction:right;fcolor:black;pos:80,-150;',]
letter_j=['length:7;direction:right;fcolor:black;pos:0,0;','length:18;direction:down;fcolor:black;pos:70,0;','length:1;direction:down;fcolor:black;pos:60,-180;','length:1;direction:down;fcolor:black;pos:50,-190;','length:3;direction:left;fcolor:black;pos:40,-200;','length:1;direction:left;fcolor:black;pos:10,-190;','length:2;direction:up;fcolor:black;pos:0,-180;',
]#笑臉
happy_face=['length:26;direction:right;fcolor:black;pos:0,0;symmetrical:21;symmetrical_direction:down','length:21;direction:down;fcolor:black;pos:0,0;symmetrical:25;','length:7;direction:right;fcolor:black;pos:20,-85;symmetrical:14;','length:9;direction:right;fcolor:black;pos:80,-175;',#笑臉嘴'length:1;direction:right;fcolor:black;pos:70,-165;symmetrical:10;symmetrical_direction:right','length:1;direction:right;fcolor:black;pos:60,-155;symmetrical:12;symmetrical_direction:right',
]#dog face
dog_face=[#耳朵'length:9;direction:down;fcolor:black;pos:0,0;symmetrical:20;','length:2;direction:right;fcolor:black;pos:10,10;symmetrical:17;','length:1;direction:right;fcolor:black;pos:30,0;symmetrical:14;','length:1;direction:right;fcolor:black;pos:40,-10;symmetrical:12;','length:11;direction:right;fcolor:black;pos:50,-20;','length:1;direction:right;fcolor:black;pos:40,-30;symmetrical:12;','length:2;direction:down;fcolor:black;pos:30,-40;symmetrical:14;','length:2;direction:right;fcolor:black;pos:10,-60;symmetrical:17;',#臉蛋'length:7;direction:down;fcolor:black;pos:-10,-90;symmetrical:22;','length:2;direction:down;fcolor:black;pos:0,-160;symmetrical:20;','length:2;direction:right;fcolor:black;pos:10,-180;symmetrical:17;','length:2;direction:down;fcolor:black;pos:30,-190;symmetrical:14;','length:1;direction:down;fcolor:black;pos:40,-210;','length:2;direction:right;fcolor:black;pos:150,-210;','length:10;direction:right;fcolor:black;pos:50,-220;',#眼眶'length:2;direction:down;fcolor:black;pos:0,-110;symmetrical:12;','length:6;direction:right;fcolor:black;pos:10,-100;symmetrical:12;','length:2;direction:down;fcolor:black;pos:70,-110;symmetrical:12;','length:6;direction:right;fcolor:black;pos:10,-130;symmetrical:12;',#眼珠'length:2;direction:down;fcolor:black;pos:60,-110;symmetrical:12;','length:1;direction:down;fcolor:gray;pos:50,-110;symmetrical:12;','length:1;direction:down;fcolor:black;pos:50,-120;symmetrical:12;',#鼻子嘴巴'length:2;direction:down;fcolor:black;pos:70,-150;symmetrical:2;','length:5;direction:down;fcolor:black;pos:80,-150;','length:7;direction:right;fcolor:black;pos:60,-200;','length:1;direction:right;fcolor:black;pos:130,-190;','length:1;direction:right;fcolor:black;pos:140,-180;',
]#programer
programer=[#頭發'length:3;direction:right;fcolor:black;pos:0,0;','length:11;direction:right;fcolor:black;pos:30,10;','length:2;direction:right;fcolor:black;pos:140,0;','length:1;direction:right;fcolor:black;pos:160,-10;','length:3;direction:right;fcolor:black;pos:170,-20;','length:4;direction:down;fcolor:black;pos:200,-30;','length:2;direction:left;fcolor:black;pos:190,-70;','length:2;direction:left;fcolor:black;pos:170,-80;','length:5;direction:up;fcolor:black;pos:150,-70;','length:2;direction:up;fcolor:black;pos:140,-70;','length:3;direction:left;fcolor:black;pos:140,-70;','length:3;direction:left;fcolor:black;pos:110,-80;','length:1;direction:left;fcolor:black;pos:80,-70;','length:2;direction:left;fcolor:black;pos:70,-80;','length:1;direction:left;fcolor:black;pos:50,-70;','length:3;direction:down;fcolor:black;pos:40,-60;','length:4;direction:left;fcolor:black;pos:30,-80;','length:5;direction:down;fcolor:black;pos:-10,-80;',#左側臉最左側坐標'length:2;direction:up;fcolor:black;pos:-20,-110;','length:8;direction:up;fcolor:black;pos:-30,-100;','length:1;direction:up;fcolor:black;pos:-20,-20;','length:1;direction:up;fcolor:black;pos:-10,-10;',#臉廓'length:2;direction:down;fcolor:black;pos:0,-130;','length:6;direction:down;fcolor:black;pos:10,-150;','length:1;direction:down;fcolor:black;pos:20,-210;','length:12;direction:right;fcolor:black;pos:30,-220;','length:1;direction:right;fcolor:black;pos:150,-210;','length:1;direction:right;fcolor:black;pos:160,-200;','length:11;direction:up;fcolor:black;pos:170,-190;',#眼睛'length:4;direction:right;fcolor:black;pos:40,-105;symmetrical:8;',#眉毛'length:2;direction:down;fcolor:black;pos:70,-125;symmetrical:5;',#嘴巴'length:2;direction:down;fcolor:black;pos:50,-175;symmetrical:8;','length:2;direction:down;fcolor:black;pos:50,-175;symmetrical:8;','length:7;direction:right;fcolor:black;pos:60,-195;',
]#贊
zan=[#袖子'length:6;direction:down;fcolor:black;pos:0,0;symmetrical:3;', 'length:4;direction:right;fcolor:black;pos:0,10;symmetrical:7;symmetrical_direction:down;', #拇指'length:1;direction:down;fcolor:black;pos:40,10;','length:1;direction:down;fcolor:black;pos:50,20;symmetrical:4;','length:1;direction:down;fcolor:black;pos:60,30;','length:3;direction:up;fcolor:black;pos:70,40;','length:1;direction:up;fcolor:black;pos:80,70;symmetrical:2;','length:2;direction:right;fcolor:black;pos:90,80;','length:6;direction:down;fcolor:black;pos:100,80;',#握拳'length:6;direction:right;fcolor:black;pos:80,10;','length:6;direction:down;fcolor:black;pos:140,10;','length:1;direction:down;fcolor:black;pos:130,-50;','length:9;direction:left;fcolor:black;pos:120,-60;',
]