情人節,我表白了CSDN小姐姐后,竟然...【為表白寫了一個繪圖工具,讓我不再手殘】

情人節,我表白了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;',
]

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/287456.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/287456.shtml
英文地址,請注明出處:http://en.pswp.cn/news/287456.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【小程序】劉一哥課堂隨機點名提問神器V1.0(附源程序)

為了能讓我們的孩子們盡量來教室上課,增強課堂的參與度,激發課堂激情,提高學習效率,一哥也是煞費苦心,于是開發出了這么一款課堂點名提問神器,跟大家分享一下。 打開神器,看到的界面是這樣子的,我很感激有勇氣按時起床并能到教室的每一位有志之士。 點擊【開始】按鈕,…

org.hibernate.HibernateException: No Session found for current thread

spring、springmvc和hibernate整合 在sessionFactory.getCurrentSession()時,出現以下異常 No Session found for current thread但使用sessionFactory.openSession()是沒有任何問題的 嚴重: Servlet.service() for servlet [springDispatcherServlet] in context w…

java mysbatis select_MyBatis SELECT基本查詢實現方法詳解

1、返回一個LISTselect * from tbl_employee where last_name like #{lastName}2、將查詢記錄封裝為一個Mapselect * from tbl_employee where id#{id}返回一條記錄的map;key就是列名,值就是對應的值。3、多條記錄封裝為一個mapMapKey("id")pu…

Git之怎么通過命令修改前面幾次提交的記錄

1 問題 我們平時用gitlab,github發現提交代碼上庫記錄寫錯了,需要修改回來。 2 解決辦法

Git客戶端TortoiseGit(Windows系統)的使用方法

本文環境: 操作系統:Windows XP SP3 Git客戶端:TortoiseGit-1.8.8.0-32bit 一、安裝Git客戶端 全部安裝均采用默認! 1. 安裝支撐軟件 msysgit: https://code.google.com/p/msysgit/downloads/list?qfullinstallerofficialgit 當前…

.Net 在容器中操作宿主機

1方案描述 在 docker 容器中想操作宿主機,一般會使用 ssh 的方式,然后 .Net 通過執行遠程 ssh 指令來操作宿主機。本文將使用 交互式 .Net 容器版 中提供的鏡像演示 .Net 在容器中如何操作宿主機。2前期準備 1. 宿主機上生成 ssh key生成 ss…

【看動漫學編程】程序員在異世界生個娃 第1篇:太極村

前言 作者文筆比較水,還請見諒。 以下內容還將使用視頻動態漫畫表現,剪輯完將會貼出鏈接。 小說劇情為劇情需要,過渡到知識點,部分篇幅可能沒有技術知識點還望諒解。 由于沒有經費支持,所以畫出來的東西是我自己用代碼…

【ArcGIS風暴】最牛逼空間數據批處理神器來了:用戶自定義工具箱GeoStorm.tbx

【Warming up】在學習和工作的過程中,作者曾寫過很多采用ArcGIS模型構建器(Model Builder)、Python代碼等批處理方法(感興趣的GISers可以去【測繪地理信息Big風暴專】欄去交流學習指導),大大的減輕了操作壓力,提高了工作效率。今天給大家展示一款神器:自定義工具箱GeoS…

2.6. PostgreSQL表之間連接

到目前為止,我們的查詢一次只訪問了一個表。查詢可以一次訪問多個表,或者用某種方式訪問一個表,而同時處理該表的多個行。一個同時訪問同一個或者不同表的多個行的查詢叫連接查詢。舉例來說,比如你想列出所有天氣記錄以及這些記錄…

Android之Caused by: java.lang.IllegalArgumentException: Failed to find configured root that contains

1 問題 用takePhoto去照相的時候特么的一打開就報這個錯誤 2020-04-09 21:33:49.124 19016-19016/com.appsinnova.android.keepshare E/AndroidRuntime: FATAL EXCEPTION: mainProcess: com.appsinnova.android.keepshare, PID: 19016java.lang.RuntimeException: Unable to …

Linux下c/c++項目代碼覆蓋率的產生方法

最近做了一系列的單元測試相關的工作,除了各種規范及測試框架以外,討論比較多的就是關于代碼覆蓋率的產生,c/c與其他的一些高級語言或者腳本語言相比較而言,例如 Java、.Net和php/python/perl/shell等,由于沒有這些高級…

C# WPF從后臺代碼生成行列可變的表格

z概述WPF常用的表格控件是DataGrid,這個控件在前臺XAML編寫的話,一般列已經固定,然后給每個列去綁定數據,但是如果我的列不固定,隨著運算結果變動呢?這時候DataGrid,就比較難實現這個需求&#…

軟件架構實踐文章鏈接

2019獨角獸企業重金招聘Python工程師標準>>> 架構 InfoQ: 又拍網架構中的分庫設計 SNS網站數據庫技術分析 - 51CTO.COM 數據庫水平切分的實現原理解析 - iBATIS - Java - JavaEye論壇 基于amoeba的mysql分布式數據庫學習(一) - Java - JavaEy…

【看動漫學編程】程序員在異世界生個娃 第2篇:外掛已準備就緒

前言 作者文筆比較水,還請見諒。 以下內容還將使用視頻動態漫畫表現,剪輯完將會貼出鏈接。 小說劇情為劇情需要,過渡到知識點,部分篇幅可能沒有技術知識點還望諒解。 由于沒有經費支持,所以畫出來的東西是我自己用代碼…

java剪切txt文件_用Java把剪切板的內容實時保存到txt

test類:提示用戶程序已啟動,提示保存位置,清空剪切板。package com.ariya.service;import com.ariya.service.impl.ClipboardServiceImpl;/*** author Ariya* 程序入口*/public class Test {public static void main(String[] args) {Clipboa…

【三維激光掃描】第一章:三維激光掃描入門基礎知識

隨著地理空間信息服務產業的快速發展,地理空間數據的要求越來越高。對地理空間數據的要求正朝著大信息量、高精度、可視化和可挖掘方向發展。地面激光雷達技術是一門新興的測繪技術,已逐漸成為廣大科研和工程技術人員全新的解決問題的手段。地面三維激光掃描技術與全站儀測量…

Android之kotlin里面本地圖片BitmapFactory.decodeFile轉bitmap失敗問題

1 問題 我們手機本地有個圖片文件比如如下 /storage/emulated/0/Android/data/package_name/cache/1586444511539.png 我們需要png轉bitmap,然后設置到ImageView里面顯示 var bitmap BitmapFactory.decodeFile(imagePath);if (bitmap null) returnelse mImagevi…

3、面向對象-繼承-多態

1、繼承子類可以繼承父類的一切,一個子類只能有一個父類,一個父類可以有多個子類//父類class Ren{public $name;public $sex;public $yuyan;function Say() {echo $this->name."正在講話!";}}//美國人的子類class America ex…

整理iOS9適配中出現的坑

一、NSAppTransportSecurity iOS9讓所有的HTTP默認使用了HTTPS,原來的HTTP協議傳輸都改成TLS1.2協議進行傳輸。直接造成的情況就是App發請求的時候彈出網絡無法連接。解決辦法就是在項目的info.plist 文件里加上如下節點: NSAppTransportSecurity - NSAl…

由c# dynamic是否裝箱引發的思考

前言前幾天在技術群里看到有同學在討論關于dynamic是否會存在裝箱拆箱的問題,我當時第一想法是"會"。至于為啥會有很多人有這種疑問,主要是因為覺得dynamic可能是因為有點特殊,因為它被稱為動態類型,可能是因為這里的動態對大家造成的誤解,認為…